0

我正在使用 AES/GCM,但以下是其他模式的一般问题,例如 AES/CBC。我有以下调用libgcrypt

#define COUNTOF(x) ( sizeof(x) / sizeof(x[0]) )
#define ROUNDUP(x, b) ( (x) ? (((x) + (b - 1)) / b) * b : b)

const byte cipher[] =  { 0xD0,0x6D,0x69,0x0F ... };
byte recovered[ ROUNDUP(COUNTOF(cipher), 16) ];
...

err = gcry_cipher_decrypt(
    handle,             // gcry_cipher_hd_t
    recovered,          // void *
    COUNTOF(recovered), // size_t
    cipher,             // const void *
    COUNTOF(cipher));   // size_t

我无法弄清楚如何确定生成的恢复文本的大小。我已经检查了使用密码句柄参考,并且没有讨论它(并且'pad有0次命中)。我还在和中检查了libgrcrypt自测,但它们使用相同的超大缓冲区,并且从不将缓冲区修剪为实际大小。tests/basic.ctests/fipsdrv.c

如何确定recovered缓冲区中返回给我的数据的大小?

4

1 回答 1

2

您需要对输入应用填充方案,并在解密后删除填充。gcrypt 不会为您处理它。

最常见的选择是PKCS#7。高级概述是您在最终块中填充未使用的字节,填充字节数 ( block_size - used_bytes)。如果您的输入长度是块大小的倍数,则在其后面加上一个填充block_size字节的块。

例如,对于 8 字节块和 4 字节输入,您的原始输入将如下所示:

AB CD EF FF 04 04 04 04

当您进行解密时,您获取最后一个块的最后一个字节的值,并从末尾删除那么多字节。

于 2015-03-04T01:58:21.493 回答