为什么不对整个文档进行 RSA 加密?

信息安全 加密 电子签名
2021-08-16 04:26:06

我最近了解了 B 人验证从 A 发送的文件确实来自 A 的方法。

  1. A 人给 B 人他的公共 RSA 密钥。这必须可靠地完成。
  2. 人员 A 使用 SHA1 以 160 位散列对文档进行散列。
  3. 人 A 使用他的私有 RSA 密钥对文档的 160 位 SHA1 散列进行签名。
  4. A 将 RSA 签名的 SHA1 哈希和文档发送给 B。
  5. 人员 B 使用人员 A 的公共 RSA 密钥验证散列。
  6. 人 B 生成一个 SHA1 来比较人 A 发送给他的文档。
  7. 如果两个 SHA1 哈希匹配,则文档确实来自人 A。

这个过程似乎可靠,但对我来说也很麻烦。为什么 A 不能直接用他的 RSA 私钥加密文档并将其发送给 B。为什么要加密文档的哈希值并将其与文档一起发送?

4个回答

原因不止一个:

1)实际上RSA算法更慢。 例如

相比之下,DES(见第 3.2 节)和其他分组密码比 RSA 算法快得多。DES 的软件速度通常至少是软件的 100 倍,而硬件的速度通常是 1,000 到 10,000 倍,具体取决于实现方式。由于需求量大,RSA 算法的实现可能会在未来几年稍微缩小差距,但分组密码也会变得更快。

然后,如果您看这里,您会看到他们将 DES 列为每字节占用 54.7 个周期,而 SHA-1 每字节占用 11.4 个周期。

因此,计算文档的 SHA-1 散列并签名是一种性能优化,而不是使用您的私钥加密整个文档。

2) 通过将文档与签名分开,您将拥有一个更灵活的系统。您可以单独传输它们或将它们存储在不同的地方。在这种情况下,每个人都已经拥有该文档的副本,而您只想让 A 向 B 验证他们拥有相同的文档(或它的哈希)。

3)考虑一下,如果有人用假私钥加密文件,而你用真正的公钥解密,你的算法实际上不能告诉你结果(签名与否)。除非您的程序可以解释结果文档含义(也许您知道它应该是 XML 等),否则您不能可靠地说它是“签名的”。你要么得到了正确的信息,要么得到了错误的信息。据推测,人类可以分辨,但机器不能。使用散列方法假设我已经有了纯文本,我只想验证那个人 A 签署了它。

假设我有一个发射核武器的程序。它获取使用您的方法加密的命令文件,因此我使用公钥解密并将结果发送到我的命令处理器。然后,您依靠命令处理器来了解它是否是有效命令。这很可怕。如果命令的协议只是导弹目标的纬度和经度,编码成二进制怎么办?你可以很容易地在错误的目标上发射。

使用散列,您可以通过纯文本通道获得命令和签名散列。您对命令进行哈希处理,检查签名,如果它们不匹配,那么您不必费心向命令处理器发送任何内容。如果它们匹配,则继续发送命令。

如果您想隐藏命令的内容,那么您可以获取命令和签名,将它们压缩在一起,并在发送之前使用接收站的公钥加密整个内容。

有时您并不特别介意让全世界都阅读一条消息(或者宁愿他们这样做),但又想提供一种机制来证明您编写了这条消息。签名就是这样做的。

RSA 速度很慢,但大多数使用 RSA 的加密软件实际上使用 AES 等对称密码加密文档,并使用 RSA 加密使用的密钥(有时称为“会话”密钥),因此加密整个文档的速度并没有那么大。

这将占用文档的每个字节并将其转换为 40 个字节。与以前相比,现在的文件将是大量文件。加密、发送和解密数据会占用大量资源。我相信加密整个文档以发送然后其他人解密它比您描述的方式要麻烦得多。

一个词 -不可否认性- 加密文档并不重要,加密它与散列它所花费的时间也不是很重要 - 这是大型电子采购订单,电子合同等事情的关键问题 -

如果只需要不可否认性,则无需向签名者提供 >>>>DIRECT<<<<< 对私钥的访问/控制 - 在需要实际拥有密钥 >CONTAINER< 的情况下与别针一起,这通常是产生可靠电子签名的令人满意的方法,例如http://en.wikipedia.org/wiki/Common_Access_Card