一、RSA算法简介
RSA(Rivest-Shamir-Adleman)是当今应用最广泛的非对称加密算法,由三位科学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它的核心思想是利用数论中的难题,构建一对数学上关联的密钥——公钥用于加密,私钥用于解密。使用公、私钥分离这种机制完美解决了对称加密中密钥分发的难题,成为互联网安全通信(如HTTPS、数字签名等)的基石。
二、RSA算法核心思想
算法目标
- 设计一种易于密钥分发的密码算法,以区别于对称密钥;
- 设计两把密钥,一把用于加密,一把用于解密。同时密钥不容易被破解;
- 加密密钥可以随意分发,只能用于加密,无法解密。
核心思想
根据算法目标,需要设计加密、解密两个过程,并且保证加密过程不可逆(即加密密钥不能解密出密文)。通过以下几步完成算法设计的目标。
- 利用模运算的不可逆性(即单向性)来设计加密和解密过程。
- 利用大质数分解困难的机制设计两把密钥
- 加密:将明文
m
m
m 通过指数运算和模运算转换为密文
c
c
c:
c ≡ m e ( m o d n ) c \equiv m^e \pmod{n} c≡me(modn) - 解密:将密文
c
c
c 通过指数运算和模运算还原为明文
m
m
m:
m ≡ c d ( m o d n ) m \equiv c^d \pmod{n} m≡cd(modn)
为了实现这一点,需要找到一对指数 e e e 和 d d d,使得:
( m e ) d ≡ m ( m o d n ) (m^e)^d \equiv m \pmod{n} (me)d≡m(modn)
三、RSA算法的数学基础
要理解RSA,需要掌握几个数学知识。
- 模运算
即“取余数运算”。例如 17 m o d 5 = 2 17 \mod 5 = 2 17mod5=2,表示17除以5的余数是2。
模运算的不可逆性是指在模 n n n下,某些运算(如乘法或指数运算)难以通过逆向操作恢复原始值。模运算的不可逆性原因在于信息丢失。模运算会将结果限制在 0 0 0 到 n − 1 n-1 n−1 之间,导致多个不同的输入可能映射到同一个输出。- 例如, 3 × 4 ≡ 12 ≡ 2 ( m o d 10 ) 3 \times 4 \equiv 12 \equiv 2 \pmod{10} 3×4≡12≡2(mod10),但 3 × 14 ≡ 42 ≡ 2 ( m o d 10 ) 3 \times 14 \equiv 42 \equiv 2 \pmod{10} 3×14≡42≡2(mod10)。仅知道结果是 2,无法确定原始值是 4 还是 14。
- 逆元
- 单位元:在一个集合中,对于某种运算
∗
*
∗(注意:这里代表通用运算的表示符号,并不是特指乘法),如果对于任何的集合元素
a
a
a ,和元素
e
e
e运算,得到还是集合元素
a
a
a本身,则称
e
e
e为这个运算下的单位元。
示例:
在加法运算中,任意实数 a a a,根据单位元的定义,有 a + e = e + a = a a+e=e+a=a a+e=e+a=a。因为 a + 0 = 0 + a = a a+0=0+a=a a+0=0+a=a,则单位元为 0 0 0。
在乘法运算中,任意实数 a a a,根据单位元的定义,有 a × e = e × a = a a \times e=e \times a=a a×e=e×a=a。因为 a × 1 = 1 × a = a a \times 1=1 \times a=a a×1=1×a=a,则单位元为 1 1 1。
在模乘运算中(即左右操作数是求余运算的乘法),任意实数 a a a的模n运算 a ( m o d n ) a \pmod n a(modn),根据单位元的定义,有 a ( m o d n ) × e ( m o d n ) = e ( m o d n ) × a ( m o d n ) = a ( m o d n ) a \pmod n \times e \pmod n=e \pmod n \times a \pmod n=a \pmod n a(modn)×e(modn)=e(modn)×a(modn)=a(modn)。因为 a ( m o d n ) × 1 ( m o d n ) = 1 ( m o d n ) × a ( m o d n ) = a ( m o d n ) a \pmod n \times 1 \pmod n=1 \pmod n \times a \pmod n=a \pmod n a(modn)×1(modn)=1(modn)×a(modn)=a(modn),则单位元为 1 ( m o d n ) 1 \pmod n 1(modn)。附:证明过程。 - 逆元:在一个集合中,对于某种运算
∗
*
∗,如果任意两个元素的运算结果等于单位元,则称这两个元素互为逆元。
示例:
在加法运算中,任意实数 a a a的逆元为 − a -a −a。因为加法的单位元为 0 0 0,根据逆元的定义,可令 a + e = e + a = 0 a+e=e+a=0 a+e=e+a=0,则 e = − a e=-a e=−a。即相反数。
在乘法运算中,任意实数 a a a的逆元为 a − 1 a^{-1} a−1或 1 a \frac{1}{a} a1。因为乘法的单位元为 1 1 1,根据逆元的定义,可令 a × e = e × a = 1 a \times e=e \times a=1 a×e=e×a=1,则 e = a − 1 e=a^-1 e=a−1或 e = 1 a e=\frac{1}{a} e=a1。即倒数。
在模乘中,设定模乘的逆元表示为 a − 1 ( m o d n ) a^-1 \pmod n a−1(modn)。因为模乘的单位元为 1 ( m o d n ) 1 \pmod n 1(modn),根据逆元的定义,可令 a ( m o d n ) × a − 1 ( m o d n ) = 1 ( m o d n ) a \pmod n \times a^{-1} \pmod n = 1 \pmod n a(modn)×a−1(modn)=1(modn)。根据模运算的性质,即等号左右两边模 n n n同余,所以前述式子可写为 a × a − 1 ≡ 1 ( m o d n ) a \times a^{-1} \equiv 1 \pmod n a×a−1≡1(modn)。为求得 a − 1 a{-1} a−1,可采用扩展欧几里德定理求解逆元。
- 单位元:在一个集合中,对于某种运算
∗
*
∗(注意:这里代表通用运算的表示符号,并不是特指乘法),如果对于任何的集合元素
a
a
a ,和元素
e
e
e运算,得到还是集合元素
a
a
a本身,则称
e
e
e为这个运算下的单位元。
- 欧拉函数
符号 ϕ ( n ) \phi(n) ϕ(n),表示小于 n n n 且与 n n n 互质的正整数个数。- 关键性质:若
n
=
p
×
q
n = p \times q
n=p×q(
p
p
p 和
q
q
q 为质数),则:
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p-1) \times (q-1) ϕ(n)=(p−1)×(q−1)
ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p-1) \times (q-1) ϕ(n)=(p−1)×(q−1)是欧拉函数的一个特殊形式(当 n n n是两个不同的质数 p p p和 q q q时成立)。
示例: n = 15 = 3 × 5 n=15=3 \times 5 n=15=3×5,则 ϕ ( 15 ) = 2 × 4 = 8 \phi(15) = 2 \times 4 = 8 ϕ(15)=2×4=8,即与15互质的数为 {1,2,4,7,8,11,13,14}。
- 关键性质:若
n
=
p
×
q
n = p \times q
n=p×q(
p
p
p 和
q
q
q 为质数),则:
- 欧拉定理
若 m m m 与 n n n 互质,则:
m ϕ ( n ) ≡ 1 ( m o d n ) m^{\phi(n)} \equiv 1 \pmod{n} mϕ(n)≡1(modn) - 大数分解问题
大质数在数轴上的分布非常稀疏,且没有明显规律可循,使得暴力搜索不可行。黎曼猜想即是想解决质数分布问题。 - 离散对数问题
c = m e ( m o d ϕ ( n ) ) c=m^e \pmod{\phi(n)} c=me(modϕ(n)),可以简单理解为有 ϕ ( n ) \phi(n) ϕ(n)个房间, c c c是其中一个房间,问题是找到一个整数 e e e(可以理解为步数),让你从房间 m m m出发,走多少步(求 e e e)能到达房间 c c c。而通常 ϕ ( n ) \phi(n) ϕ(n)与 e e e都是非常大的质数,且 ϕ ( n ) \phi(n) ϕ(n)未知,你需要一步步验证才能找到正确的 e e e(即使 e e e通常取值为65537)。
四、RSA的加密与解密过程
RSA的实现分为密钥生成、加密和解密三个阶段:
1. 密钥生成
- 步骤1:随机选择两个大质数 p p p 和 q q q。
- 步骤2:计算模数 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)。
- 步骤3:选择公钥指数 e e e,需满足 1 < e < ϕ ( n ) 1 < e < \phi(n) 1<e<ϕ(n) 且 e e e 与 $ \phi(n)$ 互质(例如 e = 65537 e=65537 e=65537)。
- 步骤4:计算私钥指数
d
d
d,使得
e
×
d
≡
1
(
m
o
d
ϕ
(
n
)
)
e \times d \equiv 1 \pmod{\phi(n)}
e×d≡1(modϕ(n))。即求
e
(
m
o
d
ϕ
(
n
)
)
e \pmod{\phi(n)}
e(modϕ(n))的模乘逆元。
数学工具:使用扩展欧几里得算法求模乘逆元。
最终密钥对:
- 公钥: ( n , e ) (n, e) (n,e)
- 私钥: ( n , d ) (n, d) (n,d)
2. 加密过程
假设Bob想发送明文 m m m 给Alice:
- Bob获取Alice的公钥 ( n , e ) (n, e) (n,e)。
- 将明文转换为整数 m m m(如ASCII码),且 m < n m < n m<n。
- 计算密文 c ≡ m e ( m o d n ) c \equiv m^e \pmod{n} c≡me(modn),发送 c c c 给Alice。
3. 解密过程
Alice收到密文 c c c 后:
- 使用私钥 ( n , d ) (n, d) (n,d) 计算 m ≡ c d ( m o d n ) m \equiv c^d \pmod{n} m≡cd(modn)。
- 将整数 m m m 还原为原始信息。
数学证明:
由欧拉定理可证明,若
m
m
m 与
n
n
n 互质,则:
c
d
≡
(
m
e
)
d
≡
m
e
×
d
≡
m
k
⋅
ϕ
(
n
)
+
1
≡
(
m
ϕ
(
n
)
)
k
⋅
m
≡
1
k
⋅
m
≡
m
(
m
o
d
n
)
c^d \equiv (m^e)^d \equiv m^{e \times d} \equiv m^{k \cdot \phi(n) + 1} \equiv (m^{\phi(n)})^k \cdot m \equiv 1^k \cdot m \equiv m \pmod{n}
cd≡(me)d≡me×d≡mk⋅ϕ(n)+1≡(mϕ(n))k⋅m≡1k⋅m≡m(modn)
安全性
- 公钥 ( n , e ) (n, e) (n,e)是公开的
- 根据 e e e、 d d d的关系, e × d ≡ 1 ( m o d ϕ ( n ) ) e \times d \equiv 1 \pmod{\phi(n)} e×d≡1(modϕ(n))可知,如果想破解 d d d,则需要知道 ϕ ( n ) \phi(n) ϕ(n)
- 而 ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n)=(p-1) \times (q-1) ϕ(n)=(p−1)×(q−1), n = p × q n=p \times q n=p×q,如果想破解 ϕ ( n ) \phi(n) ϕ(n)或 n n n,则需要知道 p p p、 q q q
- 但从 n n n分解出 p p p和 q q q在计算上是困难的,因此想破解 p p p、 q q q是不可能的。——依据大数分解问题
- 如果想绕开 p p p、 q q q,在未知 d d d的情况下,从 c ≡ m e ( m o d n ) c \equiv m^e \pmod n c≡me(modn)反推 m m m是困难的(即从密文直接反推明文是困难的)。——依据离散对数问题)
五、示例演示
以 p = 3 p=3 p=3、 q = 5 q=5 q=5 为例:
- n = 3 × 5 = 15 n = 3 \times 5 = 15 n=3×5=15, ϕ ( n ) = 2 × 4 = 8 \phi(n) = 2 \times 4 = 8 ϕ(n)=2×4=8。
- 选 e = 3 e=3 e=3(需与8互质)。
- 求 d d d,使得 3 d ≡ 1 ( m o d 8 ) 3d \equiv 1 \pmod{8} 3d≡1(mod8),解得 d = 3 d=3 d=3。
- 加密:若 m = 2 m=2 m=2,则 c = 2 3 m o d 15 = 8 c = 2^3 \mod 15 = 8 c=23mod15=8。
- 解密: 8 3 m o d 15 = 512 m o d 15 = 2 8^3 \mod 15 = 512 \mod 15 = 2 83mod15=512mod15=2。
六、总结
RSA通过巧妙的数学设计,将加密强度建立在大数分解、离散对数的复杂性上。公钥加密、私钥解密的非对称性,使得信息传输既安全又便捷。其背后依赖的欧拉定理与模运算,不仅是数论的瑰宝,更是现代数字社会的安全支柱。理解RSA,不仅是学习一个算法,更是窥见数学与工程完美融合的窗口。
欢迎关注个人公众号:小虫子编程课