1. 程式人生 > >Python實現RSA加密演算法

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