SHA、RSA以及它们之间的关系

信息安全 加密 密码学 哈希
2021-08-25 18:02:18

SHA 是散列机制。但是,RSA 是加密算法。

那么 RSA 算法是否使用 SHA 散列机制来生成散列密钥,而散列密钥又用于加密消息?

此外,RSA 本身提供 2 个密钥。一个可以公开,一个可以私有。现在,这些密钥可用于加密和解密。参考:RSA那么RSA中的SHA有什么用呢?

在任何提供 HTTPS 安全性的站点提供的证书中,都存在 SHA 和 MD5 密钥。这些是如何产生和用于加密或解密传输到浏览器的数据的?

4个回答

RSA实际上是两种算法,一种用于非对称加密,另一种用于数字签名(签名算法传统上 - 但不正确 - 被描述为“使用私钥加密”,这是一个无穷无尽的混淆来源)。

非对称加密使用密钥。键是算法的参数;算法本身对每个人都是相同的(在软件方面,它是可执行文件),而密钥因用户而异。密钥对中,公钥是用于加密数据的密钥(将一段数据,即一个字节序列转换为另一个每个人都无法理解的字节序列),而私钥是允许加密的密钥一是解密数据(即反向加密)。

而在对称加密中,加密和解密密钥是相同的,在非对称加密中,加密和解密密钥是不同的(因此得名);它们在数学上是联系在一起的,但是从加密密钥中恢复解密密钥应该是不可行的(即,仅用一堆计算机很难做到)。这就是为什么加密密钥可以公开而解密密钥保密的原因:公开公钥不会泄露私钥。

非对称加密所取得的成就绝非易事。在不过多谈论私钥的情况下公开公钥的可能性,但要使两个密钥一起工作(用公钥加密的内容可以由相应的私钥解密,但不能用其他密钥解密),需要大量数学!RSA充满了数学。这与对称加密算法形成鲜明对比,对称加密算法是通过将比特混合在一起来制造大量数据的“公正”方式。

当我们希望允许在大量人口中的任何两个用户之间进行机密传输时,非对称加密是自然使用的工具。如果您有 1000 个用户,并且您希望两个用户中的任何一个能够相互交换数据而不允许任何人监视他们(包括其他 998 个用户),那么经典的解决方案是分发对称加密的密钥对每一的用户。Alice 和 Bob 将拥有一个已知的公共密钥;Alice 和 Charlie 也会有一个共享密钥(不一样);Bob 和 Charlie 也一样;等等。每个用户都需要记住他与其他 999 个用户中的每个其他用户的“共享密钥”,您总共将拥有 499500 个密钥。添加第 1001 个用户将涉及创建 1000 个额外的对称密钥,并为 1000 个现有用户中的每个用户分配一个。整个密钥分发很快就变成了不可用/不可行的噩梦。但是,使用非对称加密,在密钥分配方面事情要简单得多:每个用户只需要记住他/她自己的私钥;并且公钥(公开)可以通过某种广播(例如目录)分发。

RSA 有一些操作限制。对于最常用的变体(称为PKCS#1 v1.5的变体),如果 RSA 密钥的大小是“1024 位”(意味着密钥对的中心数学组件是 1024 位整数),那么RSA 可以加密长达 117 字节的消息,并生成长度为 128 字节的加密消息。有限的大小以及加密时大小的增加是 RSA 加密过程的数学结构不可避免的结果。由于这些限制,我们通常不直接使用 RSA 加密数据;相反,我们选择一个小的随机字节序列,我们称之为会话密钥我们用 RSA 加密会话密钥;然后我们使用具有对称的会话密钥加密算法来处理整个消息。这称为混合加密


SHA是一系列加密散列函数的通用名称。该家族的第一个成员被描述为“SHA”,但在发现其严重缺陷后很快就被弃用了;以该名称发布了一个固定版本SHA-1(弱版本俗称SHA-0)。四个新的类似 SHA 的函数后来被添加到该系列中(、 和SHA-224:SHA-256统称为“SHA-2”)。SHA-384SHA-512

哈希函数没有键。哈希函数是一种纯代码的可执行算法。一个SHA-1,每个人都使用相同的。

散列函数“只是”把输入数据弄得一团糟,这并不意味着要解开。实际上,它的目的是对解开有弹性。尽管每个人都知道关于哈希函数的所有知识(没有密钥,只有代码,而且没有什么是秘密的),但重新计算匹配的输入消息仍然“太难”了,因为哈希函数输出。甚至不可能找到两个不同的输入消息,当给哈希函数时,它们会产生相同的输出;必须存在这样的消息对——称为冲突-- 因为散列函数输出具有固定的小尺寸,而接受的输入可以大得多,所以可能的输入比可能的输出多。每个哈希函数都存在冲突是数学上的确定性,但实际上找到一个是另一回事。

哈希函数本身不会做任何立即有价值的事情,但它是其他算法的一个非常重要的构建块例如,它们与数字签名一起使用。数字签名“证明”指定签名者对数据的有意识行为;与非对称加密一样,这涉及密钥对和数学,以及对签名数据的相关约束。散列函数h使得签名h(m)与签名m本身一样好:因为要找到两个不同的散列到相同值的消息是不可行的,所以批准散列输出就足够了。关键是输出 即使消息本身很大(SHA-1 可以处理千兆字节的数据,并产生 20 字节的输出),散列函数也足够小,可以用于隐藏在签名算法中的数学运算。

可以注意到,RSA-the-encryption-algorithm 的一些最新变体(使用 PKCS#1 v2.0 中的“OAEP 填充”)在内部使用散列函数。散列函数是很好的“随机化器”(散列函数的输出没有表现出可识别的结构),这使得它们适合于构建具有良好安全特性的更精细的密码算法。


SSL/TLS中(HTTPS 只是 HTTP-within-a-SSL/TLS-tunnel),散列函数用于几件事:

  • 作为非对称加密和/或数字签名的一部分;
  • 作为HMAC的一部分,允许客户端和服务器验证交换的数据在传输过程中没有被更改;
  • 作为Key Derivation Function的积木,它将给定的会话密钥“扩展”为多个对称密钥,用于在隧道的两个方向进行对称加密和完整性检查。

KDF 依赖于散列函数的“随机化”和不可逆性。在 TLS 1.1 之前的 SSL/TLS 中,KDF 建立在两个散列函数 MD5 和 SHA-1 之上,以试图使其健壮,即使后来在 MD5 或 SHA-1 中发现了弱点。事实证明,两者都存在弱点,但它不允许在 SSL/TLS 中使用的 KDF 上出现任何中断。尽管如此,TLS 1.2 切换到另一个使用单个可配置散列函数的 KDF,通常是 SHA-256,目前还没有已知的弱点。

RSA 中不使用 SHA。

但是,SSL、SSH 等加密协议使用不同的算法(如 SHA 和 RSA)用于不同的目的。SSL 使用 RSA(加密)或 DH(带有 RSA、DSA 或 ECDSA 签名)进行密钥协商,使用 AES 或 3DES 进行数据加密。在 PGP 协议/文件格式中,RSA、DSA 和 ElGamal 用于签名和加密。

正如你所指出的,它们是两个不同的东西。哈希 (SHA) 是为了确保数据完整性,而加密 (RSA) 是为了确保数据机密性。它们结合使用以确保数据不会被篡改,并且只有正确的一方能够读取它。

HTTPS 是一种 PKI 形式,它提供完整性、机密性和身份验证。SHA 或 MD5 只是用于确保 https 连接完整性的两种不同的散列算法。

当然,SHA 有可能用于构造 PRNG(伪随机数生成器)来生成 RSA 密钥。但也可以使用其他加密原语(例如 AES)。对于此 PRNG,有特殊规范(NIS SP 800-90、ANSI X9.31)。“纯” RSA 不关心密钥是如何生成的,但要在现实世界的应用程序中应用 RSA,我们必须确保生成的密钥必须由真正的(或看似由)随机过程生成。如果不是,那么对于攻击者来说,很容易猜出密钥是什么(如果密钥不是随机的,那么攻击者也可以计算出来)。