基本思路在这里说一下:
设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()