【问题标题】:Determine size of decrypted data from gcry_cipher_decrypt?从 gcry_cipher_decrypt 确定解密数据的大小?
【发布时间】:2015-03-04 01:38:16
【问题描述】:

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

我不知道如何确定生成的恢复文本的大小。我检查了Working with cipher handles 参考,它没有被讨论(并且'pad 有 0 个命中)。我还检查了tests/basic.ctests/fipsdrv.c 中的libgrcrypt 自测,但它们使用相同的超大缓冲区并且从不将缓冲区修剪为实际大小。

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

【问题讨论】:

标签: c encryption libgcrypt


【解决方案1】:

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

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

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

AB CD EF FF 04 04 04 04

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

【讨论】:

  • “您需要对输入应用填充方案,并在解密后删除填充。gcrypt 通常不会为您处理” - 哦,我的错.我以为图书馆做到了。在我使用的所有加密库中,这是第一个(OpenSSL、Crypto++,偶尔还有 Cryptlib 和 Botan)。我想我的下一个问题是,应用和移除焊盘的库函数是什么? Working with cipher handles 中没有讨论填充(页面上有 0 次点击)。
  • 我对 gcrypt 不是很熟悉,但我认为它没有提供任何处理填充的工具。
  • 手册说输出缓冲区必须是分组密码大小的倍数(因此在上面的代码中ROUNDUP 的原因)。所以我为 AES/GCM 模式创建了一个超大缓冲区。在这种情况下,没有要删除的填充,也没有办法从库中获取它。似乎无法编写通用代码...
  • 我不认为你可以概括这一点;如果您使用 GCM,则由您决定将纯文本大小作为附加数据的一部分传递。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多