RSA算法流程

  1. 选择大素数 p , q p,q p,q,通常大于 1 0 100 10^{100} 10100 次方
  2. 计算 n = p ∗ q {\color{red}n}=p*q n=p∗q。计算 n n n 的欧拉函数 φ ( n ) \varphi(n) φ(n)
  3. 选择 d {\color{red}d} d,使得 d d d 与 φ ( n ) \varphi(n) φ(n) 互质
  4. 计算 d d d 对于 φ ( n ) \varphi(n) φ(n) 的模反元素 e \color{violet}e e(即模意义下的乘法逆元)
  5. 公开密钥 ( 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 ) = 1 \varphi(1)=1 φ(1)=1
  2. 若 p p p 为质数,则 φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p−1
  3. 若 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
  4. 若 a , b a,b a,b 互质,则 φ ( a ∗ b ) = φ ( a ) ∗ φ ( b ) \varphi(a*b)=\varphi(a)*\varphi(b) φ(a∗b)=φ(a)∗φ(b)
  5. 若 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−p1​1​)∗(1−p2​1​)∗⋯∗(1−pm​1​)=n∗(1−p2​1​)∗⋯∗(1−pm​1​)​

证明:

性质 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算法原理

有不明白的公式就往上翻,公式的形式在上面全都给出来了。

  1. 选择大素数 p , q p,q p,q,通常大于 1 0 100 10^{100} 10100 次方(越大越不容易被破解)
  2. 计算 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) 是足够安全的(也就是别人无法猜测或推算得到它们)。
  3. 选择 d {\color{red}d} d,使得 d d d 与 φ ( n ) \varphi(n) φ(n) 互质
  4. 计算 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。
  5. 公开密钥 ( 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算法就保证了密文和密钥的安全性。

参考:

百度百科 RSA算法

百度百科 模反元素

OI wiki 欧拉定理 & 费马小定理

OI wiki 乘法逆元

bilibili 初等数论-闵嗣鹤-严士健-第四版-无尽沙砾讲解

Puppy_L RSA算法原理详解(简单易懂)

知乎 欧拉函数(Euler’s totient function) 公式、积性 证明

算法竞赛进阶指南 李煜东著

老师的课件(笑)

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐