RSA加密算法理解

RSA算法流程

  1. 选择大素数 p , q p,q p,q,通常大于 1 0 100 10^{100} 10100 次方
  2. 计算 n = p ∗ q {\color{red}n}=p*q n=pq。计算 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 mec(modn)得到密文 c c c

解密过程:

如果要解密密文 c c c,使用私人密钥进行解密: c d ≡ m ( m o d n ) c^d\equiv m\pmod n cdm(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)=p1
  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(1p1)=pkpk1
  4. a , b a,b a,b 互质,则 φ ( a ∗ b ) = φ ( a ) ∗ φ ( b ) \varphi(a*b)=\varphi(a)*\varphi(b) φ(ab)=φ(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=p1k1p2k2pmkm,其中 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)=p1k1p2k2pmkm(1p11)(1p21)(1pm1)=n(1p21)(1pm1)

证明:

性质 1 1 1 为规定,不解释。

性质 2 2 2 很好理解,因为 p p p 是质数,它肯定与 1 ∼ p − 1 1\sim p-1 1p1 中的每个数都互质,因此 φ ( p ) = p − 1 \varphi(p)=p-1 φ(p)=p1

性质 3 3 3 可以这样理解:在 1 ∼ p k 1\sim p^k 1pk 中,所有 p p p 的倍数都不与 p k p^k pk 互质,这样的数有 p k p = p k − 1 \dfrac{p^k}p=p^{k-1} ppk=pk1 个,而其他的所有不是 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)=pkpk1
或者可以这样理解:每 p p p 个数中都有 p − 1 p-1 p1 个与 p p p 互质,因此 n n n 个数中就有 n ∗ p − 1 p n*\dfrac{p-1}{p} npp1 个与 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)=pkpp1=pkpk1

性质 4 4 4 表明欧拉函数是一个积性函数。证明稍微有复杂,可以看这篇
RSA加密算法理解_第1张图片

性质 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)

证明用到了初等数论中的剩余系。你想懂?我屋里有一些好康的 把初等数论第三章看完就会了。

RSA加密算法理解_第2张图片
此外,当 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)=ap11(modp)这个就是欧拉函数的特殊情况,也就是大名鼎鼎的费马小定理。学算法的一定不陌生。

乘法逆元:

稍微对上面的欧拉公式改写一下,就可以得到: a ∗ a φ ( n ) − 1 ≡ 1 ( m o d n ) a*a^{\varphi(n)-1}\equiv 1\pmod{n} aaφ(n)11(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} ab1(modn) a , n ∈ N + a,n\in N^+ a,nN+ 且互质的情况下,根据欧拉公式,这个 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} a1,一个数和它的倒数相乘,结果不就正好等于 1 1 1 吗。( a ∗ b ≡ a ∗ a − 1 = 1 ( m o d n ) a*b\equiv a*a^{-1}=1\pmod n abaa1=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} ababmodφ(n)(modn)

证明:

b = q ∗ φ ( n ) + r b=q*\varphi(n)+r b=qφ(n)+r,其中 0 ≤ r < φ ( n ) 0\le r\lt \varphi(n) 0r<φ(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} abaqφ(n)+r(aφ(n))qar1qararabmodφ(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=pq。计算 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)} de1(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 cme(modn),解密的时候 m ≡ c d ( m o d n ) m\equiv c^d\pmod n mcd(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 mcd(me)dmedmedmodφ(n)m1m(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) 公式、积性 证明

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

老师的课件(笑)

你可能感兴趣的:(杂项,笔记,c++,数学,算法,RSA,安全)