相同点 (Similarities):
- 都基于 RSA 算法: 两者都利用了 RSA 算法的核心数学原理,即基于大整数分解的困难性以及模幂运算的特性。
- 都使用 RSA 密钥对: 两者都使用由一个公钥 (n, e) 和一个私钥 (n, d) 组成的 RSA 密钥对。
- 都涉及模幂运算: 加密、解密、签名和验证的核心操作都是模幂运算。
- 都利用了公钥和私钥的互补性: RSA 算法的核心在于私钥执行的操作可以通过对应的公钥来验证(或逆转),反之亦然。
不同点 (Differences):
特性 | RSA 加密 (RSA Encryption) | RSA 数字签名 (RSA Digital Signature) |
---|---|---|
目的 | 提供机密性 (Confidentiality)。确保只有预期的接收方才能读取消息。 | 提供真实性 (Authenticity), 完整性 (Integrity) 和 不可否认性 (Non-repudiation)。 |
谁使用公钥 | 发送方使用接收方的公钥来加密消息。 | 接收方使用发送方的公钥来验证签名。 |
谁使用私钥 | 接收方使用自己的私钥来解密密文。 | 发送方使用自己的私钥来生成签名。 |
操作对象 | 直接对原始消息(或经过填充处理的消息块)进行模幂运算。 | 对消息的哈希值进行模幂运算。 |
核心操作 | 加密: M^e mod n 解密: C^d mod n | 签名: h^d mod n 验证: S^e mod n |
操作方向 | 公钥加密,私钥解密。 | 私钥签名,公钥验证。 |
安全性依赖 | 主要依赖于在不知道私钥 d 的情况下,从密文 C 和公钥 (n, e) 推导出原始消息 M 的困难性(RSA 问题)。 | 主要依赖于在不知道私钥 d 的情况下,无法伪造有效的签名 S (即无法生成一个 S 使得 S^e mod n = H(M’)),以及哈希函数的抗碰撞性。 |
攻击模型 | 面临选择密文攻击 (CCA) 等。 | 面临伪造签名攻击等。 |
是否常用作混合加密的一部分 | 是。通常用于加密对称密钥。 | 否。签名与密钥交换或数据加密是独立的功能。 |
通常处理的数据量 | 少量数据(通常是对称密钥)。 | 可以处理任何大小的消息(通过对哈希值签名)。 |
更详细的对比:
- 操作方向的“逆向”: RSA 加密使用公钥执行幂运算(M^e mod n),解密使用私钥执行幂运算(C^d mod n)。RSA 签名是反过来的:签名使用私钥执行幂运算(h^d mod n),验证使用公钥执行幂运算(S^e mod n)。这是因为 e 和 d 在模 φ(n) 意义下是乘法逆元,它们的操作是互逆的。
- 对消息的处理方式: RSA 加密通常直接对要加密的数据块进行操作(当然需要适当的填充),每个数据块必须小于模数 n。如果数据量大,需要分块加密,或者更常见的是用 RSA 加密一个对称密钥,然后用对称加密加密数据。而 RSA 签名不是直接对整个消息进行签名,而是先对消息进行哈希,得到一个固定长度的哈希值,然后对哈希值进行签名。这是非常重要的,因为:
- 哈希值的大小通常远小于模数 n,签名效率更高。
- 签名长度是固定的(等于模数 n 的长度),与消息大小无关。
- 哈希函数的抗碰撞性保证了对不同消息签名会得到不同的结果,以及任何微小的修改都会破坏签名。
- 提供的安全服务:
- 加密 只保证机密性,防止信息泄露给非授权方。它不保证消息的完整性或发送者的身份。
- 签名 保证完整性(消息未被篡改)、真实性(确认发送者身份)和不可否认性(发送者无法否认)。它不提供机密性,签名本身和原始消息都是公开的。
可以同时加密和签名吗?
是的,可以对同一条消息先进行签名,再进行加密(通常是先签名,然后将消息和签名一起加密)。
- 发送方: 用自己的私钥签名消息,得到签名。然后用接收方的公钥加密消息和签名。
- 接收方: 用自己的私钥解密收到密文,得到原始消息和签名。然后用发送方的公钥验证签名。
这样做可以同时实现机密性(只有接收方能读)和身份认证/完整性(接收方能确认消息来源和未被篡改)。
总结:
RSA 加密和 RSA 数字签名是 RSA 算法的两种主要应用,它们都基于非对称密钥对和模幂运算,但在目的、密钥使用方向、操作对象以及提供的安全服务上存在显著差异。加密提供机密性,而签名提供真实性、完整性和不可否认性。在实际应用中,它们经常结合使用以提供更全面的安全保障。