RSA算法推导及python实现
RSA算法原理
众所周知,所谓加密解密的好处就是我用很简单的路子就能解密,而不知道密码的人可能需要耗费极大的代价才能破解,而这样的代价在物理世界中几乎是不可能实现的。
RSA算法基于大数素因子分解的困难性,比如一个数n=187,并不容易知道它是11*17的结果,但我们直接一个乘法就能算出11 * 17 =187。
具体加解密的过程不再细说,网上很多。下面进行这种方式合理性的推导。
推导
已知加密时c=me(mode n)c=m^e(mode \space n)c=me(mode n)解密时m=cd(mode n)m=c^d(mode \space n)m=cd(mode n),cd=(me)d=med=mk(p−1)(q−1)+1=m∗mk(p−1)(q−1)=m∗(m(p−1)(q−1))kc^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)})^kcd=(me)d=med=mk(p−1)(q−1)+1=m∗mk(p−1)(q−1)=m∗(m(p−1)(q−1))k
所以cdmod n=m∗(m(p−1)(q−1))k mod nc^d mod \space n=m*(m^{(p-1)(q-1)})^k \space mod \space ncdmod n=m∗(m(p−1)(q−1))k mod n
因为a∗b mod n=((a mod n)∗(b mod n)) mod na*b\space mod \space n=((a\space mod\space n)*(b\space mod\space n))\space mod\space na∗b mod n=((a mod n)∗(b mod n)) mod n
下面证明m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(p−1)(q−1) mod n=1,如果成立,那么cdmod n=m mod nc^d mod \space n=m\space mod \space ncdmod n=m mod n,证明了解密公式的正确性。
欧拉扩展Fermat小定理
if gcd(a,n)=1,then aϕ(n) mod n=1if\space gcd(a,n)=1,then \space a^{\phi(n)}\space mod\space n=1if gcd(a,n)=1,then aϕ(n) mod n=1
证明:
设{b1,...bϕ(n)}\{b_1,...b_{\phi(n)}\}{b1,...bϕ(n)}是n的简化剩余系,
/*简化剩余系可以理解为在[0,n-1]中与n只有公因子1的元素组成的集合 */
则{a∗b1,...a∗bϕ(n)}\{a*b_1,...a*b_{\phi(n)}\}{a∗b1,...a∗bϕ(n)}也是n的简化剩余系
/* 因为如果a∗bi mod n=a∗bj mod na*b_i\space mod\space n=a*b_j\space mod\space na∗bi mod n=a∗bj mod n,那么又gcd(a,n)=1,所以b可约,那么bi mod n=bj mod nb_i\space mod\space n=b_j\space mod\space nbi mod n=bj mod n,显然一个简化剩余系中两元素应该不同余,矛盾,得证 {a∗b1,...a∗bϕ(n)}\{a*b_1,...a*b_{\phi(n)}\}{a∗b1,...a∗bϕ(n)}中每个元素不同余,而且gcd(a,n)=1,所以每个元素又与n无大于1的公因子,所以是简化剩余系*/
所以b1∗b2∗...∗bϕ(n) mod n=aϕ(n)∗b1∗b2∗...∗bϕ(n) mod nb_1*b_2*...*b_{\phi(n)}\space mod\space n=a^{\phi(n)}*b_1*b_2*...*b_{\phi(n)}\space mod\space nb1∗b2∗...∗bϕ(n) mod n=aϕ(n)∗b1∗b2∗...∗bϕ(n) mod n …式1
又b1,b2,...,bϕ(n)b_1,b_2,...,b_{\phi(n)}b1,b2,...,bϕ(n)都与n无大于1的公因子,所以b1∗b2∗...∗bϕ(n)b_1*b_2*...*b_{\phi(n)}b1∗b2∗...∗bϕ(n)与n的最大公因子是1.
所以式1的两边可同时约去b1∗b2∗...∗bϕ(n)b_1*b_2*...*b_{\phi(n)}b1∗b2∗...∗bϕ(n),
/* 上边这个同余式两边约去c(c需要满足与模数m只有公因子1)仍成立的定理自己推吧 */
所以aϕ(n) mod n==1a^{\phi(n)}\space mod\space n==1aϕ(n) mod n==1
那么在如何用到RSA中?RSA中的n=pq,欲证明m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(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=pr,then ϕ(n)=(p−1)pr−1n=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≤pr−11\leq a\leq p^{r-1}1≤a≤pr−1,所以这样的数有pr−1p^{r-1}pr−1个。
若gcd(m1,m2)=1gcd(m_1,m_2)=1gcd(m1,m2)=1,then ϕ(m1∗m2)=ϕ(m1)∗ϕ(m2)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
则gcd(m2∗x+m1∗y,m1∗m2)=1gcd(m_2*x+m_1*y,m_1*m_2)=1gcd(m2∗x+m1∗y,m1∗m2)=1, …式2
若式2不成立,则假设存在c>1,使gcd(m2∗x+m1∗y,m1∗m2)=cgcd(m_2*x+m_1*y,m_1*m_2)=cgcd(m2∗x+m1∗y,m1∗m2)=c,
则m1∗m2m_1*m_2m1∗m2含有因子c,因为gcd(m1,m2)=1gcd(m_1,m_2)=1gcd(m1,m2)=1,即m1与m2不含公因子。那就只有一个数含因子c,不妨设m1含因子c,m1=k1∗cm_1=k_1*cm1=k1∗c,
又m2∗x+m1∗y=k2∗cm_2*x+m_1*y=k_2*cm2∗x+m1∗y=k2∗c,所以带入m1,m2∗x+k1∗c∗y=k2∗cm_2*x+k_1*c*y=k_2*cm2∗x+k1∗c∗y=k2∗c,
m2∗x=c(k2−k1y)m_2*x=c(k_2-k_1y)m2∗x=c(k2−k1y),因为m2不含因子c,又m2∗xm_2*xm2∗x有因子c,那只能是x含因子c,又m1含因子c,那么gcd(m1,x)=cgcd(m_1,x)=cgcd(m1,x)=c,与前述gcd(m1,x)=1矛盾。
因此式2成立。
这样m1∗m2m_1*m_2m1∗m2的简化剩余系可有m2∗x+m1∗ym_2*x+m_1*ym2∗x+m1∗y来构造,x有ϕ(m1){\phi(m_1)}ϕ(m1)个,y有ϕ(m2){\phi(m_2)}ϕ(m2)个,因此m1∗m2m_1*m_2m1∗m2的简化剩余系中元素个数有ϕ(m1)∗ϕ(m2){\phi(m_1)}*{\phi(m_2)}ϕ(m1)∗ϕ(m2)个。
得证。
综上
m(p−1)(q−1) mod n=1m^{(p-1)(q-1)}\space mod\space n=1m(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)