bob*_*bob 3 encryption cryptography aes
我觉得我对哈希函数和它们所涉及的合约有很好的理解。
输入 X 上的 SHA1 将始终产生相同的输出。您可以使用 Python 库、Java 库或纸笔。这是一个函数,它是确定性的。我的 SHA1 和你的、爱丽丝和鲍勃的一样。
据我了解,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)结果证明是非常不安全的。相反,通常使用各种其他更安全的模式,其中大多数需要初始化向量 (IV),这有助于确保使用相同的密钥加密相同的数据不会产生相同的密文(否则会泄漏信息) .
这些模式中的大多数仍然对固定大小的数据块进行操作,但是我们又经常希望加密不是块大小倍数的数据,因此我们必须使用某种形式的填充,而且还有各种不同的可能性关于我们如何将消息填充到块大小的倍数的长度。
因此,将所有这些放在一起,如果以下所有内容都相同,则“AES”的两种不同实现应该产生相同的输出: