RSA加密算法(Rivest-Shamir-Adleman)是一种广泛使用的公钥加密算法,它在信息安全领域具有重要作用。 RSA是由 罗纳德·李维斯特 (Ron Rivest)、 阿迪·萨莫尔 (Adi Shamir)和 伦纳德·阿德曼 (Leonard Adleman)在1977年一起提出的。 当时他们三人都在麻省理工学院工作。 RSA 就是他们三人姓氏开头字母拼在一起组成的。
RSA算法基于数论中的一些重要概念,如大数分解和欧拉函数。它的安全性依赖于大数分解的难度,即从一个大整数的乘积中推导出其因子的困难性。下面是RSA加密算法的基本原理和过程。
RSA加密算法的核心在于生成一对密钥:公钥和私钥。
选择两个大素数:首先选择选两个超级大的素数 p 和 q 。
计算 n:计算 n = p × q n=p\times q n=p×q,这个值 n 将作为公钥和私钥的一部分。这个数字 n 在加密和解密过程中非常重要。
计算欧拉函数 ϕ ( n ) \phi(n) ϕ(n):欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 表示小于 n 且与 n 互质的数的个数。对于 n = p × q n=p\times q n=p×q,有:
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p - 1) \times (q - 1) ϕ(n)=(p−1)×(q−1)
参考: ϕ ( n ) = n ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋅ … ⋅ ( 1 − 1 p k ) \phi(n) = n \cdot \left(1 - \frac{1}{p_1}\right) \cdot \left(1 - \frac{1}{p_2}\right) \cdot \ldots \cdot \left(1 - \frac{1}{p_k}\right) ϕ(n)=n⋅(1−p11)⋅(1−p21)⋅…⋅(1−pk1)
选择公钥指数 e:选择一个整数 e ,使得 ϕ ( n ) \phi(n) ϕ(n),并且 e 与 ϕ ( n ) \phi(n) ϕ(n) 互质。通常,选择常用的值,例如 3 或 65537。
计算私钥指数 d:通过扩展欧几里得算法计算 d ,使得:
e × d ≡ 1 ( mod ϕ ( n ) ) e \times d \equiv 1 \ (\text{mod} \ \phi(n)) e×d≡1 (mod ϕ(n))
即 d 是 e 在模 ϕ ( n ) \phi(n) ϕ(n)下的逆元。
符号 ≡ 在数学中表示 同余(congruence),它通常用于表示两个数在某个模数下具有相同的余数。
举个例子:
假设a = 17, b = 5, m = 6。
可以计算:
17 ÷ 6 = 2 余5
5 ÷ 6 = 0 余5
因此,17 ≡ 5 (mod 6),因为它们在模6下的余数相同,都是5。
最终,公钥为 (e, n) ,私钥为 (d, n) 。
假设发送者使用接收者的公钥加密消息。
将消息 M 转换为一个整数 m ,使得 0 ≤ m < n 0 \leq m < n 0≤m<n。
使用公钥 (e, n) 进行加密:
c = m e ( mod n ) c = m^e \ (\text{mod} \ n) c=me (mod n)
其中 c 是密文。
接收者使用私钥进行解密。
假设我们选择以下两个小素数(实际使用中常达1024位以上):
计算 n :
n = p × q = 61 × 53 = 3233 n = p \times q = 61 \times 53 = 3233 n=p×q=61×53=3233
计算欧拉函数 ϕ ( n ) \phi(n) ϕ(n):
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) = ( 61 − 1 ) × ( 53 − 1 ) = 60 × 52 = 3120 \phi(n) = (p - 1) \times (q - 1) = (61 - 1) \times (53 - 1) = 60 \times 52 = 3120 ϕ(n)=(p−1)×(q−1)=(61−1)×(53−1)=60×52=3120
我们选择 e = 17(实际中常选择e = 65537) ,它必须满足 1 < e < ϕ ( n ) \phi(n) ϕ(n) 且与 ϕ ( n ) \phi(n) ϕ(n) 互质。显然,17与3120互质。
我们需要找到 d 使得:
e × d ≡ 1 ( mod ϕ ( n ) ) e \times d \equiv 1 \ (\text{mod} \ \phi(n)) e×d≡1 (mod ϕ(n))
也就是找到 d ,使得 17 × d ≡ 1 ( mod 3120 ) 17 \times d \equiv 1 \ (\text{mod} \ 3120) 17×d≡1 (mod 3120)。
通过扩展欧几里得算法,我们计算得到:
d = 2753 d = 2753 d=2753
现在我们有了公钥和私钥:
假设发送者想要发送消息 “HELLO”,我们先将其转换为数字。例如,将每个字母转换为ASCII值:
因此,消息 “HELLO” 可以表示为数字序列 ( 72, 69, 76, 76, 79 )。
我们选择加密第一个字母 m = 72 :
使用公钥 (e, n) = (17, 3233) 进行加密:
c = m e ( mod n ) = 7 2 17 ( mod 3233 ) c = m^e \ (\text{mod} \ n) = 72^{17} \ (\text{mod} \ 3233) c=me (mod n)=7217 (mod 3233)
计算得到:
c = 7 2 17 ( mod 3233 ) = 2201 c = 72^{17} \ (\text{mod} \ 3233) = 2201 c=7217 (mod 3233)=2201
所以,字母 “H” 的加密密文是 2201。
接收者使用私钥 (d, n) = (2753, 3233) 来解密密文 c = 2201 。
使用私钥进行解密:
m = c d ( mod n ) = 220 1 2753 ( mod 3233 ) m = c^d \ (\text{mod} \ n) = 2201^{2753} \ (\text{mod} \ 3233) m=cd (mod n)=22012753 (mod 3233)
计算得到:
m = 220 1 2753 ( mod 3233 ) = 72 m = 2201^{2753} \ (\text{mod} \ 3233) = 72 m=22012753 (mod 3233)=72
接收者得到的结果是 72,这正是字母 “H” 的ASCII值。
同样的方法可以用于解密其他字母。通过公钥加密和私钥解密,接收者可以还原完整的消息。
RSA算法的安全性基于大数分解的困难性。具体来说,给定一个大的 n 和公钥 e ,很难从密文 c 直接计算出原始消息 m 。RSA的安全性依赖于 n 的因子化问题,即从 n = p × q n = p \times q n=p×q 中恢复出 p 和 q 是非常困难的,特别是当 p 和 q 是非常大的素数时。
优点:
缺点:
总结来说,RSA加密算法是基于数论的公钥加密算法,通过大数分解的困难性提供安全性,广泛应用于数字通信和网络安全中。
[1] https://zh.wikipedia.org/zh-cn/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
[2] Rivest R L , Shamir A , Adleman L .A method for obtaining digital signatures and public-key cryptosystems[J].Communications of the Acm, 1978, 21(2):120-126.DOI:10.1145/359340.359342.