24

为了构建安全系统,我们是否可以在开始安全编程之前假设加密保证完整性是正确的?

  • 在对称加密和公钥加密中,我的问题是否得到充分证明?
  • 如果不是,有哪些漏洞,你能举个例子吗?
4

3 回答 3

28

不。如果您考虑一次性垫,这很容易看出,这是一个简单(理论上)完全安全的系统。

如果你改变了输出的任何一点,一些明文就会改变,而接收者无法检测到这一点。

这是一个明显的例子,但同样的结论适用于大多数加密系统。它们只提供机密性,而不是完整性。

因此,您可能需要添加数字签名。有趣的是,当使用公钥密码术时,签名后加密(SE)或加密后签名(ES)是不够的。这两者都容易受到重放攻击。您必须签名加密签名或加密签名加密才能获得一般安全的解决方案。本文详细解释了原因。

如果您使用 SE,收件人可以解密邮件,然后将其重新加密给其他收件人。然后,这会欺骗新收件人关于发件人的预期收件人。

如果使用 ES,窃听者可以删除签名并添加自己的签名。因此,即使他们无法阅读该消息,他们也可以将其归功于它,假装是原始发件人。

于 2010-09-07T03:20:14.540 回答
11

简而言之,答案是否定的。消息完整性和保密性是不同的,需要不同的工具。

让我们考虑一个简单的硬币翻转,在这种情况下,我们押注结果。结果是一个简单的布尔值,我使用像 RC4 这样的流密码来加密它,它产生 1 个加密位,然后我通过电子邮件将它发送给你。你没有钥匙,我请你通过电子邮件给我回复。

在这种情况下可能会发生一些攻击。

1)攻击者可以在传输过程中修改该位,如果它是 0,则有 50% 的机会它将变为 1,反之亦然。这是因为 RC4 产生一个 prng 流,它与纯文本异或产生密文,类似于一次性密码。

2)另一种可能性是我可以为您提供不同的密钥以确保您的答案是错误的。这很容易蛮力,我只是不断尝试键,直到我得到适当的位翻转。

一个解决方案是使用分组密码是CMAC 模式。CMAC 是类似于 hmac 的消息验证代码,但它使用分组密码而不是消息摘要功能。密钥 (K) 与您用于加密消息的密钥相同。这会将 n+1 个块添加到密文中。在我的场景中,这可以防止攻击 1 和 2。攻击者无法翻转一个简单的位,因为纯文本已被填充,即使消息仅占用 1 位,我也必须使用分组密码传输至少 1 个块。额外的身份验证块阻止我链接密钥,它还为任何试图在传输中修改密文的人提供完整性(虽然这在实践中很难做到,但额外的安全层很有用)。

出于这些原因,WPA2 使用 AES-CMAC。

于 2010-09-07T19:25:37.643 回答
2

如果您特别关注数据完整性,您应该使用加密散列函数并结合加密算法。

但这确实归结为使用正确的工具来完成这项工作。一些加密算法可能会提供某种级别的内置校验和验证,而其他加密算法可能不会。

于 2010-09-07T03:34:05.523 回答