【问题标题】:Where to put information about padding length?在哪里放置有关填充长度的信息?
【发布时间】:2014-11-14 13:18:05
【问题描述】:

我正在研究 AES 加密器和解密器。我决定使用 PKCS#7。现在,我不知道在哪里放置有关填充长度的信息。我读过我可以读取最后一个字节(==n)并检查它是否低于 16。如果是真的,我可以检查 n 个字节是否等于 n。但这里有一件事。如果要加密的最后一个块有 16 个字节,例如:

{0x01, 0xfa,..., 0xf1, 0x02, 0x02}

解密后,解密器将读取它并确定最后两个字节被填充(实际上它们不是)。

我应该在一个有长度的文件的开头添加一个字节,解密器会读取它并从第二个字节开始解密吗?

【问题讨论】:

  • 如果您的消息大小完全可以被块大小整除,我认为您通常只需添加整个填充块。
  • @Damien 我认为你是对的 :)

标签: encryption aes pkcs#7


【解决方案1】:

PKCS#7 填充是确定性的。这意味着 unpadding 应该始终能够找出填充长度本身。所以你首先解密,然后取最后一个字节(作为数字),这就是填充长度。 为此,PKCS#7 填充始终应用。所以填充的数量,以及字节的值,是 1 到块大小,对于 AES 是 16 个字节。。如果明文已经可以被 16 整除,则应用一个完整的填充块 - 字节值为 16 / 0x10。

简而言之,计算是:

p = n - l % n

其中p 是填充大小和值,n 是块大小,l 是明文大小。

【讨论】:

  • 如果您担心攻击者会更改最后一个密文块,请务必应用 HMAC。
【解决方案2】:

最佳做法是在加密数据前加上实际长度的 32 位前缀。

【讨论】:

  • 为什么它应该有 32 位?它与整数大小有关吗?
  • 32bit 是标准尺寸。如果块总是
  • 投了反对票,PKCS#7 是确定性的,它不需要预先知道大小。提前知道大小可能很有用,但并不特别需要执行 PKCS#7 unpadding。
  • 好的。我的评论是针对常见情况下的可变长度块的(AES)加密。
猜你喜欢
  • 2013-04-24
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多