RSA算法推导及python实现
RSA算法原理
众所周知,所谓加密解密的好处就是我用很简单的路子就能解密,而不知道密码的人可能需要耗费极大的代价才能破解,而这样的代价在物理世界中几乎是不可能实现的。
RSA算法基于大数素因子分解的困难性,比如一个数n=187,并不容易知道它是11*17的结果,但我们直接一个乘法就能算出11 * 17 =187。
具体加解密的过程不再细说,网上很多。下面进行这种方式合理性的推导。
推导
已知加密时 c = m e ( m o d e n ) c=m^e(mode \space n) c=me(mode n)解密时 m = c d ( m o d e n ) m=c^d(mode \space n) m=cd(mode n), c d = ( m e ) d = m e d = m k ( p − 1 ) ( q − 1 ) + 1 = m ∗ m k ( p − 1 ) ( q − 1 ) = m ∗ ( m ( p − 1 ) ( q − 1 ) ) k c^d=(m^e)^d=m^{ed}=m^{k(p-1)(q-1)+1}=m*m^{k(p-1)(q-1)}=m*(m^{(p-1)(q-1)})^k cd=(me)d=med=mk(p−1)(q−1)+1=m∗mk(p−1)(q−1)=m∗(m(p−1)(q−1))k
所以 c d m o d n = m ∗ ( m ( p − 1 ) ( q − 1 ) ) k m o d n c^d mod \space n=m*(m^{(p-1)(q-1)})^k \space mod \space n cdmod n=m∗(m(p−1)(q−1))k mod n
因为 a ∗ b m o d n = ( ( a m o d n ) ∗ ( b m o d n ) ) m o d n a*b\space mod \space n=((a\space mod\space n)*(b\space mod\space n))\space mod\space n a∗b mod n=((a mod n)∗(b mod n)) mod n
下面证明 m ( p − 1 ) ( q − 1 ) m o d n = 1 m^{(p-1)(q-1)}\space mod\space n=1 m(p−1)(q−1) mod n=1,如果成立,那么 c d m o d n = m m o d n c^d mod \space n=m\space mod \space n cdmod n=m mod n,证明了解密公式的正确性。
欧拉扩展Fermat小定理
i f g c d ( a , n ) = 1 , t h e n a ϕ ( n ) m o d n = 1 if\space gcd(a,n)=1,then \space a^{\phi(n)}\space mod\space n=1 if gcd(a,n)=1,then aϕ(n) mod n=1
证明:
设 { b 1 , . . . b ϕ ( n ) } \{b_1,...b_{\phi(n)}\} {b1,...bϕ(n)}是n的简化剩余系,
/*简化剩余系可以理解为在[0,n-1]中与n只有公因子1的元素组成的集合 */
则 { a ∗ b 1 , . . . a ∗ b ϕ ( n ) } \{a*b_1,...a*b_{\phi(n)}\} {a∗b1,...a∗bϕ(n)}也是n的简化剩余系
/* 因为如果 a ∗ b i m o d n = a ∗ b j m o d n a*b_i\space mod\space n=a*b_j\space mod\space n a∗bi mod n=a∗bj mod n,那么又gcd(a,n)=1,所以b可约,那么 b i m o d n = b j m o d n b_i\space mod\space n=b_j\space mod\space n bi mod n=bj mod n,显然一个简化剩余系中两元素应该不同余,矛盾,得证 { a ∗ b 1 , . . . a ∗ b ϕ ( n ) } \{a*b_1,...a*b_{\phi(n)}\} {a∗b1,...a∗bϕ(n)}中每个元素不同余,而且gcd(a,n)=1,所以每个元素又与n无大于1的公因子,所以是简化剩余系*/
所以 b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n ) m o d n = a ϕ ( n ) ∗ b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n ) m o d n b_1*b_2*...*b_{\phi(n)}\space mod\space n=a^{\phi(n)}*b_1*b_2*...*b_{\phi(n)}\space mod\space n b1∗b2∗...∗bϕ(n) mod n=aϕ(n)∗b1∗b2∗...∗bϕ(n) mod n …式1
又 b 1 , b 2 , . . . , b ϕ ( n ) b_1,b_2,...,b_{\phi(n)} b1,b2,...,bϕ(n)都与n无大于1的公因子,所以 b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n ) b_1*b_2*...*b_{\phi(n)} b1∗b2∗...∗bϕ(n)与n的最大公因子是1.
所以式1的两边可同时约去 b 1 ∗ b 2 ∗ . . . ∗ b ϕ ( n ) b_1*b_2*...*b_{\phi(n)} b1∗b2∗...∗bϕ(n),
/* 上边这个同余式两边约去c(c需要满足与模数m只有公因子1)仍成立的定理自己推吧 */
所以 a ϕ ( n ) m o d n = = 1 a^{\phi(n)}\space mod\space n==1 aϕ(n) mod n==1
那么在如何用到RSA中?RSA中的n=pq,欲证明 m ( p − 1 ) ( q − 1 ) m o d n = 1 m^{(p-1)(q-1)}\space mod\space n=1 m(p−1)(q−1) mod n=1,只需
ϕ ( n ) = ( p − 1 ) ( q − 1 ) {\phi(n)}=(p-1)(q-1) ϕ(n)=(p−1)(q−1),下面讨论欧拉函数 ϕ ( n ) {\phi(n)} ϕ(n)
欧拉函数
ϕ ( n ) {\phi(n)} ϕ(n)是n的简化剩余系中元素个数,若 n = p r , t h e n ϕ ( n ) = ( p − 1 ) p r − 1 n=p^r,then\space {\phi(n)}=(p-1)p^{r-1} n=pr,then ϕ(n)=(p−1)pr−1,
因为若一个小于p的数含因子p,那这个数可表示为p*a,其中 1 ≤ a ≤ p r − 1 1\leq a\leq p^{r-1} 1≤a≤pr−1,所以这样的数有 p r − 1 p^{r-1} pr−1个。
若 g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2)=1 gcd(m1,m2)=1, t h e n ϕ ( m 1 ∗ m 2 ) = ϕ ( m 1 ) ∗ ϕ ( m 2 ) then\space {\phi(m_1*m_2)}={\phi(m_1)}*{\phi(m_2)} then ϕ(m1∗m2)=ϕ(m1)∗ϕ(m2)
证明:
设x属于m1的简化剩余系,gcd(m1,x)=1,
y属于m1的简化剩余系,gcd(m2,y)=1
则 g c d ( m 2 ∗ x + m 1 ∗ y , m 1 ∗ m 2 ) = 1 gcd(m_2*x+m_1*y,m_1*m_2)=1 gcd(m2∗x+m1∗y,m1∗m2)=1, …式2
若式2不成立,则假设存在c>1,使 g c d ( m 2 ∗ x + m 1 ∗ y , m 1 ∗ m 2 ) = c gcd(m_2*x+m_1*y,m_1*m_2)=c gcd(m2∗x+m1∗y,m1∗m2)=c,
则 m 1 ∗ m 2 m_1*m_2 m1∗m2含有因子c,因为 g c d ( m 1 , m 2 ) = 1 gcd(m_1,m_2)=1 gcd(m1,m2)=1,即m1与m2不含公因子。那就只有一个数含因子c,不妨设m1含因子c, m 1 = k 1 ∗ c m_1=k_1*c m1=k1∗c,
又 m 2 ∗ x + m 1 ∗ y = k 2 ∗ c m_2*x+m_1*y=k_2*c m2∗x+m1∗y=k2∗c,所以带入m1, m 2 ∗ x + k 1 ∗ c ∗ y = k 2 ∗ c m_2*x+k_1*c*y=k_2*c m2∗x+k1∗c∗y=k2∗c,
m 2 ∗ x = c ( k 2 − k 1 y ) m_2*x=c(k_2-k_1y) m2∗x=c(k2−k1y),因为m2不含因子c,又 m 2 ∗ x m_2*x m2∗x有因子c,那只能是x含因子c,又m1含因子c,那么 g c d ( m 1 , x ) = c gcd(m_1,x)=c gcd(m1,x)=c,与前述gcd(m1,x)=1矛盾。
因此式2成立。
这样 m 1 ∗ m 2 m_1*m_2 m1∗m2的简化剩余系可有 m 2 ∗ x + m 1 ∗ y m_2*x+m_1*y m2∗x+m1∗y来构造,x有 ϕ ( m 1 ) {\phi(m_1)} ϕ(m1)个,y有 ϕ ( m 2 ) {\phi(m_2)} ϕ(m2)个,因此 m 1 ∗ m 2 m_1*m_2 m1∗m2的简化剩余系中元素个数有 ϕ ( m 1 ) ∗ ϕ ( m 2 ) {\phi(m_1)}*{\phi(m_2)} ϕ(m1)∗ϕ(m2)个。
得证。
综上
m ( p − 1 ) ( q − 1 ) m o d n = 1 m^{(p-1)(q-1)}\space mod\space n=1 m(p−1)(q−1) mod n=1
n=187
e=3
d=107
def encry(mess):
cry=''
for item in mess:
m=ord(item)
c=pow(m,e)%n
cry=cry+chr(c)
return cry
def decry(cry):
mes=''
for item in cry:
c=ord(item)
m=pow(c,d)%n
mes=mes+chr(m)
return mes
if __name__=='__main__':
mess = 'meet at NEU tomorow'
cry=encry(mess)
print(cry)
mes=decry(cry)
print(mes)