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

Encryption 使用AES进行文件完整性检查,替换MD5,encryption,md5,hash,aes,Encryption,Md5,Hash,Aes,首先:我知道AES是一种分组密码,而不是散列函数。然而,我一直在使用一个只有很少RAM和闪存的微控制器,AES-128已经在它上面实现,并用于它的预期目的——加密 不幸的是,我还必须在同一个微控制器上实现一个用于文件完整性检查的哈希函数。考虑到有限的资源,我想知道是否有可能使用现有的AES算法而不是MD5进行散列。这样做的一种可能性是: 使用伪密钥加密文件的第一个块(例如,像全零) 使用上一个加密块作为密钥加密下一个块 继续此操作,直到文件中的所有数据都已处理完毕 使用最后一个加密的块作为散列

首先:我知道AES是一种分组密码,而不是散列函数。然而,我一直在使用一个只有很少RAM和闪存的微控制器,AES-128已经在它上面实现,并用于它的预期目的——加密

不幸的是,我还必须在同一个微控制器上实现一个用于文件完整性检查的哈希函数。考虑到有限的资源,我想知道是否有可能使用现有的AES算法而不是MD5进行散列。这样做的一种可能性是:

  • 使用伪密钥加密文件的第一个块(例如,像全零)
  • 使用上一个加密块作为密钥加密下一个块
  • 继续此操作,直到文件中的所有数据都已处理完毕
  • 使用最后一个加密的块作为散列
  • 理论上,我认为这应该是可行的。如果文件中的任何地方有损坏的数据,则会导致所有后续块中的差异


    现在,最大的问题是:这个方法在碰撞方面的表现如何?或者换一种说法:最终的“散列”分布情况如何?

    听起来您想使用一种基于AES的身份验证算法。

    最重要的是,您可以使用AES生成散列函数。事实上,NIST SHA3竞赛(将决定下一个美国政府批准的散列函数)的许多参赛作品确实如此

    传统的散列函数只是一个简单的函数,很容易实现。(有些人也走了另一条路,拉着机器独立使用。)


    当然,您可以用它构建一个适当的哈希函数,但如果您只需要文件完整性,因此不需要它具有前映像抵抗、冲突抵抗或加密哈希针对恶意对手所具有的所有其他属性,然后,您甚至可以将AES芯片置于任何链接模式,将文件作为消息输入,并使用最后一个块作为散列。(只需选择用于键和IV的固定值。这些值看起来是随机的,但可能不是好的选择,比如e和pi中小数点后的前128位。)

    您提出的算法没有第二个图像前阻力(这也意味着它也没有抗冲突性),所以它不是一个加密性很强的散列


    如果我有一条散列到
    H
    的消息
    p0p1p2
    ,那么我可以很容易地构造第二条消息
    q0q1q2qx
    ,它也散列到
    H
    ——我任意选择
    q0q1q2
    ,然后通过使用适当的密钥解密
    H
    来计算
    QX
    .

    我想知道您的自定义方案在设备上的执行情况是否会比某些SHA算法或至少CRC32的执行情况少。因为AES已经在设备上,所以我的自定义方案几乎不会占用额外的空间。CRC32是不够的,因为完整性检查用于验证要加载到微控制器上的固件更新。即使是一个位错误也会使设备完全无法使用。记住你的对手是谁。如果只是线路噪声,那么使用设计用于捕捉线路噪声的检查可能是好的,因为您没有恶意的对手。你只是为了防止不走运,所以每2^32个漏洞中就有一个漏洞仍然意味着你可以在68年内每秒更新一次固件,而且永远不会发现问题。我强烈建议您至少将您的AES-128解决方案与一个普通的旧CRC32进行比较,看看在防止非恶意腐败方面是否存在可测量的差异。谢谢您的建议。您可能想看看这个描述AES哈希方法的代码。不幸的是,它不是很详细。@Makai:在我的回答中有一个链接包含非常详细的信息。AES-CMAC确实是一个有效的选项,它不仅提供完整性,而且还提供真实性验证。如果我正确理解了原理,那么这个概念与我提出的方法类似,只是将当前块与之前加密的块进行异或运算,并对所有块应用相同的密码。此外,还有一种填充机制,它依赖于计算出的子键。我仍然想知道,在完整性检查方面,这种方法与MD5相比如何……我已经实现了AES-CMAC,它非常适合我的目的。仍在运行一些测试,但足以将此贡献标记为可接受的答案。谢谢