2015-04-12 34 views

回答

1

AES是分组密码,只能在一个块上运行。它需要一种操作模式来加密多个块。如果操作模式也仅适用于块(如CBC,ECB),则无法加密任意明文。如果您禁用这些模式的填充,则需要提供完全为块大小倍数的明文(对于AES为128位)。

这对于CTR或GCM等流模式模式不是必需的。他们不需要/支持填充。

如果由于某种原因,您无法进行默认的PKCS#5/PKCS#7填充工作,您可以选择一个ZeroPadding,它只会向明文附加0x00字节,直到块尺寸的倍数到达了。这意味着原始明文不能以0x00字节结束,因为它们在解密期间将被移除。您当然可以使用任何类型的填充字节,只要它不可能在末尾出现在纯文本中。

+1

填充的存在允许解密端检测到有错误的解密,并标记错误 - 解密后只允许某些最终字节。在没有填充的情况下,这个检查是不可能的,所以你的解密文件可能是垃圾的(例如用错误的密钥解密)。如果不使用填充,则需要对该文件进行单独的健全性检查。 – rossum

+1

@rossum这是非常真实的,但是填充匹配的概率仍然大约有1/256。另外,一些不好的实现不会验证PKCS#7填充,而只是使用最后一个字节来删除填充。无论如何,不​​应该使用填充来验证明文/密文的有效性。而应使用经过认证的操作模式,如GCM/EAX或加密 - 然后MAC。 (我不想过多地进入[crypto.se]的领域) –