经过身份验证的加密与包含和加密的校验和/哈希?

信息安全 加密 哈希 AES
2021-08-29 22:27:36

所以我通读了http://en.wikipedia.org/wiki/Authenticated_encryptionhttp://www.cryptopp.com/wiki/Authenticated_Encryption,我似乎没有遵循这个概念。

从提供的简单示例来看,Authenticated Encryption 似乎旨在证明消息没有被更改——即攻击者没有通过不需要密钥的操作来修改加密容器的有效负载。

我的问题是——如果目标只是确保有效负载/内容没有被修改(同样,攻击者没有密钥,他们正在二进制级别修改消息)那么为什么不在加密容器中包含有效负载的尾随散列是否足以进行验证?

如果是加密的 AES 消息,则接收消息,使用预共享的对称密钥进行解密,并对消息(数据)和哈希进行评估。有效载荷/数据被散列并与接收到的散列进行比较 - 如果它们匹配,那么我们很有可能消息没有被篡改。

所以......我的问题是这个。这看起来很简单,但是比我更有经验和智慧的人已经花了很多时间在 Authenticated Encryption 上——我错过了什么?

提前致谢。

2个回答

概述。您的提议不安全(密码分析见下文)。这就是为什么它不是经过身份验证的加密的合理替代方案。

多一点背景。 为什么我们需要经过身份验证的加密?这是因为没有身份验证的加密是不安全的。许多开发人员不知道这一点,因此他们最终以不安全的方式使用密码学。

可以手动使用加密算法和认证算法。例如,您可以使用安全加密方案和安全消息身份验证 (MAC) 算法来使用encrypt-then-authenticate 构造。但是,这需要开发人员付出一些额外的努力。

身份验证加密被设计为一个易于开发人员使用的单一原语,并提供所有必要的身份验证(因此您不必做一些额外的事情来提供安全性)。因此,它有助于安全。一些经过身份验证的加密方案还具有比单独加密然后进行身份验证更好的性能的好处,但这是次要考虑因素。

请阅读不要在没有身份验证情况下使用加密以获取有关此主题的更多详细信息。

对您的方案进行密码分析。您建议我们在加密之前附加消息的哈希值:换句话说,C = Encrypt( K , M||H(M) ),其中|| 表示位串的串联。该方案对选择明文攻击不安全,具有许多加密算法。例如,如果您使用 CBC 模式加密,我将展示针对您的提案的攻击(尽管该攻击也适用于许多其他加密模式)。

请注意,如果中间人截断使用 CBC 模式(在块边界处)生成的密文,则接收者不会注意到截断,并且在解密后将收到发送者的截断版本的消息试图发送。所以,有了这样的背景,这就是攻击。假设 Alice 是发送者,Bob 是接收者,并假设选择明文设置。

攻击者选择了一些他希望 Alice 发送的消息M :但 Alice 拒绝发送它(可能M说“从我的帐户中转出 100 美元并将其交给攻击者”,或者其他什么)。攻击者构造一些其他值X使得 Alice 愿意发送M' = M||H(M)||X(也许X说“开玩笑!你不敢”)。攻击者说服 Alice 加密并发送M'这意味着 Alice 将传输密文C' = Encrypt( K , M'||H(M') ) = Encrypt( K , M||H(M)||X||H(M'))。攻击者扮演中间人,捕获C'并在它飞行时截断它。让我们称C''为截断的密文。Bob 将收到C'',对其进行解密,然后检查哈希。如果攻击者正确选择了截断点,那么在解密后 Bob 得到M||H(M),检查散列,看到散列是正确的,并得出结论 Alice 一定发送了M

换句话说,在这次攻击结束时,Bob 得出结论,Alice 授权了消息M 的传输——但她从未这样做过。(她授权传输一些其他消息,但不是M。)

这是否是一个严重的安全漏洞将取决于使用它的上下文,例如消息M的格式。但是,根据经验,至少在某些应用程序中,这种攻击可能会对应用程序造成严重威胁。因此,密码学家认为这不是一个好的通用方案。

鉴于那里经过仔细审查并证明对于通用用途是安全的好的方案,密码学家建议您使用其中一种通用方案(例如经过身份验证的加密,或 encrypt-then-authenticate建筑) - 特别是,不要使用你提到的那个。

你可能想看看斯坦福大学的这个密码学课程有一个关于 Authenticated Encryption 的讲座,它展示了为什么应该使用 Authenticated Encryption 以及应该如何使用它。它还显示了不同的方法可能存在缺陷(即 SSH 或 SSL)。

您应该使用 Authenticated Encryption 并且应该正确使用它,这也意味着您不应该自己发明或实施它。

使用 Authenticated Encryption 与使用适当的加密模式(即 CCM、GCM、EAX)一样简单。不幸的是,框架不包含这些操作模式是很常见的,因此您可能需要使用其他库。