原因不止一个:
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 签署了它。
假设我有一个发射核武器的程序。它获取使用您的方法加密的命令文件,因此我使用公钥解密并将结果发送到我的命令处理器。然后,您依靠命令处理器来了解它是否是有效命令。这很可怕。如果命令的协议只是导弹目标的纬度和经度,编码成二进制怎么办?你可以很容易地在错误的目标上发射。
使用散列,您可以通过纯文本通道获得命令和签名散列。您对命令进行哈希处理,检查签名,如果它们不匹配,那么您不必费心向命令处理器发送任何内容。如果它们匹配,则继续发送命令。
如果您想隐藏命令的内容,那么您可以获取命令和签名,将它们压缩在一起,并在发送之前使用接收站的公钥加密整个内容。