RSA加密算法理解
RSA算法流程
- 选择大素数 p , q p,q p,q,通常大于 1 0 100 10^{100} 10100 次方
- 计算 n = p ∗ q {\color{red}n}=p*q n=p∗q。计算 n n n 的欧拉函数 φ ( n ) \varphi(n) φ(n)
- 选择 d {\color{red}d} d,使得 d d d 与 φ ( n ) \varphi(n) φ(n) 互质
- 计算 d d d 对于 φ ( n ) \varphi(n) φ(n) 的模反元素 e \color{violet}e e(即模意义下的乘法逆元)
- 公开密钥 ( e , n ) (e,n) (e,n),私人密钥 ( d , n ) (d,n) (d,n)
加密过程
如果要加密明文 m m m,使用公开密钥进行加密: m e ≡ c ( m o d n ) m^e\equiv c\pmod n me≡c(modn)得到密文 c c c。
解密过程:
如果要解密密文 c c c,使用私人密钥进行解密: c d ≡ m ( m o d n ) c^d\equiv m\pmod n cd≡m(modn)得到明文 m m m。
由于公开密钥 ( e , n ) (e,n) (e,n) 是公开的,所以任何人都可以对明文进行加密。但是私人密钥 ( d , n ) (d,n) (d,n) 是私有的,所以只有持有私人密钥的人才可以对密文进行解密。
讲解
欧拉函数
对正整数 n n n,欧拉函数 φ ( n ) \varphi(n) φ(n) 是指小于等于 n n n 的正整数中与 n n n 互质的数的数目。比如 φ ( 5 ) = 4 , φ ( 6 ) = 2 \varphi(5)=4,\varphi(6)=2 φ(5)=4,φ(6)=2。
欧拉函数有如下性质(讲解和证明在后面):
- φ ( 1 ) = 1 \varphi(1)=1 φ(1)=1
- 若 p p p 为质数,则 φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1
- 若 p p p 为质数,则 φ ( p k ) = p k ∗ ( 1 − 1 p ) = p k − p k − 1 \varphi(p^k)=p^k*(1-\dfrac{1}{p})=p^k-p^{k-1} φ(pk)=pk∗(1−p1)=pk−pk−1
- 若 a , b a,b a,b 互质,则 φ ( a ∗ b ) = φ ( a ) ∗ φ ( b ) \varphi(a*b)=\varphi(a)*\varphi(b) φ(a∗b)=φ(a)∗φ(b)
- 若 n = p 1 k 1 ∗ p 2 k 2 ∗ ⋯ ∗ p m k m n=p_1^{k_1}*p_2^{k_2}*\dots*p_m^{k_m} n=p1k1∗p2k2∗⋯∗pmkm,其中 p i p_i pi 为质数, k i k_i ki 为正整数,则 φ ( n ) = φ ( p 1 k 1 ) ∗ φ ( p 2 k 2 ) ∗ ⋯ ∗ φ ( p m k m ) = p 1 k 1 ∗ p 2 k 2 ∗ ⋯ ∗ p m k m ∗ ( 1 − 1 p 1 ) ∗ ( 1 − 1 p 2 ) ∗ ⋯ ∗ ( 1 − 1 p m ) = n ∗ ( 1 − 1 p 2 ) ∗ ⋯ ∗ ( 1 − 1 p m ) \begin{aligned} \varphi(n)&=\varphi(p_1^{k_1})*\varphi(p_2^{k_2})*\dots*\varphi(p_m^{k_m})\\ &=p_1^{k_1}*p_2^{k_2}*\dots*p_m^{k_m}*(1-\dfrac{1}{p_1})*(1-\dfrac{1}{p_2})*\dots*(1-\dfrac{1}{p_m})\\ &=\color{red}{n*(1-\dfrac{1}{p_2})*\dots*(1-\dfrac{1}{p_m})} \end{aligned} φ(n)=φ(p1k1)∗φ(p2k2)∗⋯∗φ(pmkm)=p1k1∗p2k2∗⋯∗pmkm∗(1−p11)∗(1−p21)∗⋯∗(1−pm1)=n∗(1−p21)∗⋯∗(1−pm1)
证明:
性质 1 1 1 为规定,不解释。
性质 2 2 2 很好理解,因为 p p p 是质数,它肯定与 1 ∼ p − 1 1\sim p-1 1∼p−1 中的每个数都互质,因此 φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1。
性质
3
3
3 可以这样理解:在
1
∼
p
k
1\sim p^k
1∼pk 中,所有
p
p
p 的倍数都不与
p
k
p^k
pk 互质,这样的数有
p
k
p
=
p
k
−
1
\dfrac{p^k}p=p^{k-1}
ppk=pk−1 个,而其他的所有不是
p
p
p 的倍数的数都一定与
p
p
p 互质,也就一定与
p
k
p^k
pk 互质。因此
φ
(
p
k
)
=
p
k
−
p
k
−
1
\varphi(p^k)=p^k-p^{k-1}
φ(pk)=pk−pk−1。
或者可以这样理解:每
p
p
p 个数中都有
p
−
1
p-1
p−1 个与
p
p
p 互质,因此
n
n
n 个数中就有
n
∗
p
−
1
p
n*\dfrac{p-1}{p}
n∗pp−1 个与
p
p
p 互质,也就与
p
k
p^k
pk 互质,令
n
=
p
k
n=p^k
n=pk 可得
φ
(
p
k
)
=
p
k
∗
p
−
1
p
=
p
k
−
p
k
−
1
\varphi(p^k)=p^k*\dfrac{p-1}{p}=p^k-p^{k-1}
φ(pk)=pk∗pp−1=pk−pk−1。
性质
4
4
4 表明欧拉函数是一个积性函数。证明稍微有复杂,可以看这篇

性质 5 5 5 就是性质 4 4 4 的一个拓展,也是欧拉函数的通项公式,很重要。
除此之外欧拉函数还有很多其他奇奇怪怪的性质,不过与本篇无关,不多赘述,想了解的可以去 OI wiki。
模反元素(模运算下的乘法逆元)
欧拉定理:
若 a , n a,n a,n 互质,则: a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)}\equiv 1\pmod{n} aφ(n)≡1(modn)
证明用到了初等数论中的剩余系。你想懂?我屋里有一些好康的 把初等数论第三章看完就会了。

此外,当
n
n
n 是一个质数
p
p
p 时,公式化简为:
a
φ
(
p
)
=
a
p
−
1
≡
1
(
m
o
d
p
)
a^{\varphi(p)}=a^{p-1}\equiv 1\pmod{p}
aφ(p)=ap−1≡1(modp)这个就是欧拉函数的特殊情况,也就是大名鼎鼎的费马小定理。学算法的一定不陌生。
乘法逆元:
稍微对上面的欧拉公式改写一下,就可以得到: a ∗ a φ ( n ) − 1 ≡ 1 ( m o d n ) a*a^{\varphi(n)-1}\equiv 1\pmod{n} a∗aφ(n)−1≡1(modn)因为对任意正整数 n n n,有 φ ( n ) ≥ 1 \varphi(n)\ge 1 φ(n)≥1,因此 a φ ( n ) − 1 a^{\varphi(n)-1} aφ(n)−1 是一个正整数,不妨设 b = a φ ( n ) − 1 b=a^{\varphi(n)-1} b=aφ(n)−1,则有: a b ≡ 1 ( m o d n ) ab\equiv 1\pmod{n} ab≡1(modn)在 a , n ∈ N + a,n\in N^+ a,n∈N+ 且互质的情况下,根据欧拉公式,这个 b b b 是一定存在的。此时 b b b 就叫做 a a a 对模数 n n n 的 “模反元素”。或者换个说法, b b b 是 a a a 在模 n n n 情况下的乘法逆元。
乘法逆元说白了就是倒数,因为你可以把 b b b 看成是 a − 1 a^{-1} a−1,一个数和它的倒数相乘,结果不就正好等于 1 1 1 吗。( a ∗ b ≡ a ∗ a − 1 = 1 ( m o d n ) a*b\equiv a*a^{-1}=1\pmod n a∗b≡a∗a−1=1(modn))
欧拉定理推论:
若 a , n a,n a,n 互质,则对于任意正整数 b b b,有 a b ≡ a b m o d φ ( n ) ( m o d n ) a^b\equiv a^{b \bmod \varphi(n)}\pmod{n} ab≡abmodφ(n)(modn)
证明:
设 b = q ∗ φ ( n ) + r b=q*\varphi(n)+r b=q∗φ(n)+r,其中 0 ≤ r < φ ( n ) 0\le r\lt \varphi(n) 0≤r<φ(n),即 r = b m o d φ ( n ) r = b\bmod \varphi(n) r=bmodφ(n)。于是: a b ≡ a q ∗ φ ( n ) + r ≡ ( a φ ( n ) ) q ∗ a r ≡ 1 q ∗ a r ≡ a r ≡ a b m o d φ ( n ) ( m o d n ) a^b\equiv a^{q*\varphi(n)+r}\equiv (a^{\varphi(n)})^q*a^r\equiv 1^q*a^r\equiv a^r\equiv a^{b \bmod \varphi(n)}\pmod{n} ab≡aq∗φ(n)+r≡(aφ(n))q∗ar≡1q∗ar≡ar≡abmodφ(n)(modn)
RSA算法原理
有不明白的公式就往上翻,公式的形式在上面全都给出来了。
- 选择大素数 p , q p,q p,q,通常大于 1 0 100 10^{100} 10100 次方(越大越不容易被破解)
- 计算
n
=
p
∗
q
{\color{red}n}=p*q
n=p∗q。计算
n
n
n 的欧拉函数
φ
(
n
)
\varphi(n)
φ(n)
分解大数的质因数是十分困难的任务,目前除了暴力破解,还没有发现其他方法。因此如果 p , q p,q p,q 足够大,我们就可以认为 n n n 是足够安全的,从而 φ ( n ) \varphi(n) φ(n) 是足够安全的(也就是别人无法猜测或推算得到它们)。 - 选择 d {\color{red}d} d,使得 d d d 与 φ ( n ) \varphi(n) φ(n) 互质
- 计算
d
d
d 对于
n
n
n 的模反元素
e
\color{violet}e
e
即 d e ≡ 1 ( m o d φ ( n ) ) de\equiv 1\pmod {\varphi(n)} de≡1(modφ(n)),根据上面讲的乘法逆元,只要 d d d 与 φ ( n ) \varphi(n) φ(n) 互质,就一定会存在 d d d 对模数 φ ( n ) \varphi(n) φ(n) 的逆元,即 e e e。 - 公开密钥
(
e
,
n
)
(e,n)
(e,n),私人密钥
(
d
,
n
)
(d,n)
(d,n)
假设明文为 m m m( m i n g w e n mingwen mingwen),密文为 c c c( c i p h e r t e x t ciphertext ciphertext),加密的时候 c ≡ m e ( m o d n ) c\equiv m^e\pmod n c≡me(modn),解密的时候 m ≡ c d ( m o d n ) m\equiv c^d\pmod n m≡cd(modn),就有: m ≡ c d ≡ ( m e ) d ≡ m e d ≡ m e d m o d φ ( n ) ≡ m 1 ≡ m ( m o d n ) m\equiv c^d\equiv (m^e)^d\equiv m^{ed}\equiv m^{ed \bmod \varphi(n)}\equiv m^1\equiv m\pmod n m≡cd≡(me)d≡med≡medmodφ(n)≡m1≡m(modn)如此一来,就实现了从密文中解密得到明文的操作了。
目前已知的公开的变量只有 e , n e,n e,n,私人持有密钥 d d d,而 p , q , φ ( n ) p,q,\varphi(n) p,q,φ(n) 都是未知且足够安全( φ ( n ) \varphi(n) φ(n) 未知是因为要知道它就必须对 n n n 进行质因数分解,但是 n n n 过大无法分解)。
如果一个人没有密钥 d d d 想要破解密文 c c c,就需要根据 e e e 算得它在模数 φ ( n ) \varphi(n) φ(n) 下的逆元 d d d,这就必须知道 φ ( n ) \varphi(n) φ(n),但是它足够安全无法获取。如此一来RSA算法就保证了密文和密钥的安全性。
参考:
bilibili 初等数论-闵嗣鹤-严士健-第四版-无尽沙砾讲解
知乎 欧拉函数(Euler’s totient function) 公式、积性 证明
算法竞赛进阶指南 李煜东著
老师的课件(笑)
更多推荐
所有评论(0)