使用AES进行文件完整性检查,替代MD5

6
首先,我知道AES是块密码而不是哈希函数。但是,由于我的微控制器RAM和闪存非常有限,因此已经在其上实现了AES-128并用于其预期目的 - 加密。
不幸的是,我还需要在同一微控制器上实现用于文件完整性检查的哈希函数。鉴于资源有限,我想知道是否可以使用现有的AES算法来代替MD5进行哈希。一种可能的方法是:
1. 使用虚拟密钥(例如全零)加密文件的第一个块。 2. 使用前一个加密块作为密钥加密下一个块。 3. 重复此过程,直到处理完文件中的所有数据。 4. 将最后一个加密块用作哈希值。
理论上,我认为这应该可以工作。如果文件中存在任何损坏的数据,则会导致所有后续块的差异。
现在,重要的问题是:从碰撞的角度来看,这种方法的表现如何?或者换句话说:最终的“哈希”分布情况如何?

我想知道你的自定义方案是否比实现某些SHA算法或至少CRC32占用更少设备空间。 - Eugene Mayevski 'Callback
由于AES已经在设备上,我的自定义方案几乎不需要额外的空间。CRC32是不够的,因为完整性检查用于验证要加载到微控制器上的固件更新。即使是一个单独的位错误也会使设备完全无法使用。 - Makai
记住你的对手是谁。如果只是线路噪声,那么使用设计用于捕捉线路噪声的检查可能是可以的,因为你没有恶意对手。你只是防止不幸发生,所以即使有2^32分之一的机会出现损坏,你仍然可以期望每秒更新固件68年而从未遇到问题。我强烈建议至少将你的AES-128解决方案与普通的CRC32进行比较,并看看是否存在非恶意损坏的可测量差异。 - me22
3个回答

5

听起来您想使用基于AES的身份验证算法AES-CMAC


谢谢您的建议。您可能想看一下http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/aes-hash/aeshash.pdf 这里描述了一种AES哈希方法。不幸的是,它并不是非常详细。 - Makai
@Makai:我的回答中有一个链接,里面有非常详细的信息。 - President James K. Polk
AES-CMAC确实是一个有效的选项,它不仅提供完整性,还提供真实性验证。如果我理解得正确,这个概念与我提出的方法类似,只是当前块与先前加密块进行异或操作,并对所有块应用相同的密码。此外,还有依赖于计算子密钥的填充机制。不过,我仍然想知道这种方法在完整性检查方面与MD5相比如何... - Makai
我已经实现了AES-CMAC,它非常适合我的目的。仍在运行一些测试,但已足够好,可以将此贡献标记为被接受的答案。谢谢! - Makai

1

最肯定的是,你可以用AES制作哈希函数。实际上,一些参加NIST SHA3竞赛的提交者(该竞赛将决定下一个美国政府批准的哈希函数)正是这样做的

传统哈希函数只是级联压缩函数,而且很容易从块密码构造压缩函数。(有些人也走了另一条路,从SHA-2中提取出块密码独立使用。)

当然,您可以使用它来构建一个适当的哈希函数,但如果您只需要文件完整性,因此需要具有预像抗性,碰撞抗性或所有那些针对恶意对手具有加密散列的属性,则您甚至可以将AES芯片放入其具有的任何链接模式中,将文件作为消息馈入,并使用最后一个块作为哈希值。 (只需选择固定值用于密钥和IV。看似随机但实际上不是的无痕数字可能是很好的选择,例如在e和pi小数点后的前128位。)

0

你提出的算法没有第二原像抗性(这也意味着它没有碰撞抗性),因此它不是一个具有密码学强度的哈希函数。

如果我有一条消息 P0 P1 P2,它的哈希值为 H,那么我可以轻松地构造出第二条消息 Q0 Q1 Q2 QX,它也会哈希到 H - 我任意选择 Q0 Q1 Q2,然后通过使用适当的密钥(Q2 的加密)来解密 H 以计算出 QX


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接