Python实现RSA加密算法

基本思路在这里说一下:

设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()

猜你喜欢

转载自blog.csdn.net/a145127/article/details/83420618