Python實現RSA加密演算法
阿新 • • 發佈:2018-12-09
基本思路在這裡說一下:
設p、q為質數
n = p*q
fn = (p-1)*(q-1)
要滿足: 1 < e < fn , 且 e 與 fn 互質
滿足: e*d%fn = 1 (d>1)
e 為公鑰 , d 為私鑰
把e 和 n 發給 客戶端
m 為明文
c = m^e%n
c 為密文
在把 c 發給伺服器
m = c^d%n
最後得到 m
RSA演算法講解
具體實現程式碼如下:
# coding=utf-8 import random num_list = list() def isPNs(x): for j in range(2,x): if (x % j == 0): return False return True def isPN(): for i in range(3,10001): if (isPNs(i)): num_list.append(i) print "已完成10000以內質數運算(1/6)" def returnED(fn): fnPn = list() for i in range(2,fn/2): if(fn%i==0): fnPn.append(i) fnPn.append(fn/2) print "已完成fn所有因子運算(2/6)" for i in range(fn - 1, 1, -1): ## 如果執行太久,可以把此處的for i in range(fn-1,1,-1): 替換成 for i in range(1,fn): flag = True for j in range(len(fnPn)): if(i%fnPn[j] == 0): flag = False break if(flag): print "已完成e運算(3/6)" j = 1 while True: if(i*j%fn == 1): print "已完成d運算(4/6)" return i,j j += 1 def disp(): isPN() p = num_list[random.randint(0,(len(num_list))/2-1)] q = num_list[random.randint(0,(len(num_list))/2-1) + len(num_list)/2] n = p*q fn = (p-1)*(q-1) e,d = returnED(fn) m = 3 # 明文 c = m**e%n # 密文 print "已完成c運算(5/6)" m = c**d%n # 通過c解出來的 明文 print "已完成m運算(6/6)" print "p =",p,",q =",q,",n =",n,",fn =",fn,",e =",e,",d =",d,",c =",c,",m =",m def main(): disp() if __name__ == '__main__': main()