我觉得我对哈希函数及其所涉及的契约有很好的理解。
输入 X 上的 SHA1 将始终产生相同的输出。您可以使用 Python 库、Java 库或笔和纸。它是一个函数,它是确定性的。我的 SHA1 与你的、Alice 和 Bob 的相同。
据我了解,AES也是一个函数。你输入一些值,它就会输出密文。
那么,为什么会担心 Truecrypt(例如)被“损坏”呢?他们并不是说 AES 被破坏了,而是说实现它的程序可能被破坏了。理论上,AES 是可靠的。那么为什么不能直接通过 Truecrypt 运行一个文件,通过“参考 AES”函数运行它,并验证结果是否相同呢?我知道它绝对不会那样工作,但我不知道为什么。
AES 与 SHA1 有何不同?当 Truecrypt AES 被给予所有相同的输入时,为什么它们可能会输出与 Schneier-Ifier* AES 不同的文件?
最后,我的问题归结为:
My_SHA1(X) == Bobs_SHA1(X) == ...等
但是 TrueCrypt_AES(X) != HyperCrypt_AES(X) != VeraCrypt_AES(X) 等等。这是为什么呢?所有这些程序是否都封装了 AES,但有不同的方法来确定初始化向量等内容?
*如果我曾经编写过一个文件加密程序,这将是我的文件加密程序的名称
在您给出的 SHA-1 示例中,该函数只有一个输入,并且在提供相同的输入数据时,任何正确的 SHA-1 实现都应该产生与任何其他实现相同的输出。
然而,对于 AES 来说,事情有点棘手,并且由于您没有具体说明“AES”的确切含义,因此这本身似乎可能是感知到的实现之间的差异。
首先,“AES”不是单一算法,而是一系列采用不同算法的算法钥匙尺寸(128、192 或 256 位)。 AES 也是一种分组密码,它采用 128 位/16 字节的单个块纯文本输入,并使用密钥对其进行加密以生成单个 16 字节输出块。
当然,在实际应用中,我们经常希望一次性加密超过16字节的数据,因此我们必须找到一种方法来重复应用AES算法,以便加密所有数据。天真地,我们可以将其分成 16 字节块并依次加密每个块,但这种模式(称为电子密码本或 ECB)结果是非常没有安全感。相反,各种其他更安全的modes通常使用,其中大多数需要初始化向量 (IV)这有助于确保使用相同密钥加密相同数据不会产生相同的密文(否则会泄漏信息)。
大多数这些模式仍然在固定大小的数据块上运行,但是我们经常想要加密不是块大小倍数的数据,因此我们必须使用某种形式padding,并且我们如何将消息填充到块大小的倍数长度也有各种不同的可能性。
因此,将所有这些放在一起,“AES”的两种不同实现应该产生相同的输出,如果all以下内容是相同的:
- 明文输入数据
- 密钥(以及密钥大小)
- IV
- 模式(包括任何特定于模式的输入)
- Padding
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)