【发布时间】:2011-01-21 19:06:14
【问题描述】:
使用 AES 加密时,明文必须填充到密码块大小。大多数库和标准都使用填充,其中填充字节可以从未填充的明文长度确定。尽可能使用随机填充字节有什么好处吗?
我正在实施一种方案来存储敏感的每用户和每会话数据。数据通常是 JSON 编码的键值对,并且可能很短且重复。我正在向PKCS#5 寻求指导,但我计划将 AES 用于加密算法而不是 DES3。我计划为每个数据项创建一个随机 IV,以及一个由用户 ID 和密码或会话 ID 确定的密钥(视情况而定)。
让我吃惊的是 PKCS#5 明文填充方案。要将密文填充到 8 字节块中,在末尾添加 1 到 8 个字节,填充字节内容反映填充字节数(即01、0202、030303,最多 0808080808080808 )。我自己的填充方案是在明文前面使用随机字节,明文的最后一个字符是添加的填充字节数。
我的理由是,在 AES-CBC 模式下,每个块都是前一个块的密文的函数。这样,每个明文都会有一个随机元素,为我提供另一层保护,免受已知的明文攻击,以及 IV 和关键问题。由于我的明文预计会很短,我不介意将整个解密的字符串保存在内存中,并从前后切掉填充。
一个缺点是相同的未填充明文、IV 和密钥会导致不同的密文,从而使单元测试变得困难(但并非不可能 - 我可以使用伪随机填充生成器进行测试,并使用加密强的生成器进行生产)。
另一个是,为了强制执行随机填充,我必须添加至少两个字节 - 一个计数和一个随机字节。对于确定性填充,最小值为一个字节,与明文一起存储或在密文包装器中存储。
由于像 PKCS#5 这样备受推崇的标准决定使用确定性填充,我想知道是否还有其他我遗漏的东西,或者我认为好处太高了。
【问题讨论】:
标签: cryptography aes