为了构建一个安全的系统,在开始安全编程之前,我们可以假设加密保证了完整性吗?
答案 0 :(得分:23)
没有。如果您考虑one-time pad这是一个简单(理论上)完全安全的系统,这很容易看出。
如果更改输出的任何位,则明文的一些位置会发生变化,收件人无法检测到这一点。
这是一个明显的案例,但同样的结论适用于大多数加密系统。它们只提供保密性,而不是完整性。
因此,您可能想要添加digital signature。有趣的是,当使用公钥加密时,签名然后加密(SE)或加密然后签名(ES)是不够的。这两个都容易受到重播攻击。您必须使用sign-encrypt-sign或encrypt-sign-encrypt来获得通常安全的解决方案。这个paper详细解释了原因。
如果您使用SE,则收件人可以解密邮件,然后将其重新加密到其他收件人。然后,这会欺骗新收件人关于发件人的预期收件人。
如果您使用ES,窃听者可以删除签名并添加自己的签名。因此,即使他们无法阅读邮件,他们也可以信用它,假装是原始发件人。
答案 1 :(得分:10)
简而言之,答案是否定的。消息完整性和保密性不同,需要不同的工具。
让我们考虑一个简单的硬币翻转,在这种情况下,我们打赌结果。结果是一个简单的bool,我使用像RC4这样的流密码对其进行加密,产生1个加密位,然后通过电子邮件发送给您。你没有钥匙,我请你给我回电话答案。
在这种情况下可能会发生一些攻击。
1)攻击者可以修改传输中的位,如果是0则有50%的可能性会变为1,反之亦然。这是因为RC4生成的prng流与纯文本进行异或生成密文,类似于一次性密码。
2)另一种可能性是我可以为您提供不同的密钥以确保您的答案是错误的。这很容易暴力,我只是继续尝试按键,直到我得到正确的位翻转。
解决方案是使用块密码CMAC Mode。 CMAC是类似于hmac的消息认证代码,但它使用分组密码而不是消息摘要功能。密钥(K)与用于加密消息的密钥相同。这会在密文中添加n + 1个块。在我的场景中,这可以防止攻击1和2.攻击者无法翻转一个简单的位,因为纯文本被填充,即使消息只占用1位,我必须使用分组密码发送至少1个块。额外的身份验证块阻止我链接密钥,并且它还为尝试修改传输中的密文的任何人提供了完整性(虽然这在实践中很难做到,但附加的安全层很有用)。
WPA2出于这些原因使用AES-CMAC。
答案 2 :(得分:2)
如果数据完整性是您特别关注的问题,则应使用cryptographic hash function,结合加密算法。
但它确实归结为使用正确的工具来完成工作。一些加密算法可能会提供内置的某种级别的校验和验证,其他加密算法可能不会。