解密程序如何以及为什么能告诉我密钥是不正确的?
首先,许多块操作模式需要填充一条消息,这样它的长度就可以被密码的块大小平均地除以。例如,CBC模式(密码块链接)通常会用整块零块(如果消息恰好可被块大小整除),或者使用将消息扩展到下一个块的给定字节数(每个字节设置为填充字节数(一个字节设置为0x01,两个字节设置为0x02,16个字节设置为0x10,等等)。
现在,您在消息中内置了一个类型的校验和。如果消息的最后一个块在解密时没有有效的填充,则解密失败;要么消息在传输过程中损坏(CBC模式导致错误的“级联”,这是由于前一个密文块的XORing与当前明文块在加密之前造成的),或者用于解密的密钥不正确。使用其他类型的完整性检查(如镜像/奇偶校验)的文件加密应用程序可以验证数据是否正常,因此唯一的其他解释是您使用了错误的密钥。
顺便说一句,一个系统可以告诉你某个特定的密文消息是否被正确填充,它被称为“填充预言”,它是CBC等模式的一个漏洞,因为密码(由合法的用户用正确的密钥初始化)可以得到一系列的“选择的密文”来尝试解密,每一个都是基于真实的密文和一些随机数据的组合,以及被分析以反向工程真实明文的行为。
更高级的密码模式在加密中包含了一个单一用途的消息身份验证功能,这将导致解密以同样的方式失败,要么是坏密钥,要么是损坏的密文。CCM (计数器w/ CBC-MAC )就是这些模式之一;首先,通过使用给定密钥通过CBC加密运行消息“散列”,但只保留密码文本的最后一个块(请记住,将每个先前的密文“链接”到下一个明文块,以及它导致的级联错误?这是计算消息的“键散列”的一种很好的方法)。然后,该消息及其MAC在计数器模式下再次加密(与CBC有关,但略有不同;与先前的密文块不同,由IV和顺序计数器组合而产生的nonce )与每一个明文块组合成"salt“(它)以产生发送或持久化的密文。
为了解密,将消息用密钥以计数器模式解密,然后使用相同的密钥在CBC模式中对消息部分进行散列,并与解密的MAC进行比较。如果MACs不匹配,则会出现错误。同样,正如在文件加密应用程序中使用的那样,如果有一种独立的方法来验证文件完整性是否良好,那么唯一的其他解释就是使用了错误的密钥。
顺便说一句,这种模式的优点是,无法将其作为填充的甲骨文来对抗;如果密码文本被篡改,或者被错误的密钥解密,MACs将无法匹配,而这将是正确加密的测试(从而给出错误),解密失败给攻击者提供的信息要少得多(除了使用正确密钥和未篡改的尝试之外,每次使用正确密钥和未篡改的尝试都会失败,每次都会出现完全相同的错误)。另一种类似的模式是Galois/Counter模式或GCM,由于使用了更快的校验和计算,GCM具有类似的行为,但性能和并行性更好。