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