从gcry_cipher_decrypt确定解密数据的大小?

我正在使用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 

我无法弄清楚如何确定生成的恢复文本的大小。 我已经检查了使用密码句柄参考,并且未对其进行讨论(并且有’0个点击’pad’。 我还检查了tests/basic.ctests/fipsdrv.c ,但它们使用相同的超大缓冲区,并且从不将缓冲区修剪为实际大小。

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

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

最常见的选择是PKCS#7 。 高级概述是使用填充字节数填充最终块中未使用的字节( block_size - used_bytes )。 如果您的输入长度是块大小的倍数,则使用填充了block_size字节的块来跟随它。

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

 AB CD EF FF 04 04 04 04 

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