我使用的是 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
我不知道如何确定生成的恢复文本的大小。我已经检查过使用密码句柄 https://www.gnupg.org/documentation/manuals/gcrypt/Working-with-cipher-handles.html参考,并且没有讨论(并且“pad”的点击量为 0)。我还检查了libgrcrypt
自测试在tests/basic.c
and tests/fipsdrv.c
,但它们使用相同的超大缓冲区,并且从不将缓冲区修剪到实际大小。
如何确定返回给我的数据的大小recovered
buffer?
您需要对输入应用填充方案,并在解密后删除填充。 gcrypt 不会为你处理它。
最常见的选择是PKCS#7 https://www.rfc-editor.org/rfc/rfc5652#section-6.3。高级概述是用填充字节数填充最终块中未使用的字节(block_size - used_bytes
)。如果您的输入长度是块大小的倍数,则您可以在其后面添加一个填充的块block_size
bytes.
例如,对于 8 字节块和 4 字节输入,您的原始输入将如下所示:
AB CD EF FF 04 04 04 04
当您进行解密时,您将获取最后一个块的最后一个字节的值,并从末尾删除那么多字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)