python實現RSA加解密

RSA的算法涉及三個參數,n、e、d。
其中,n是兩個大質數p、q的積,n的二進制表示所佔用的位數,就是所謂的密鑰長度。
e和d是一對相關的值,e能夠任意取,但要求e與(p-1)*(q-1)互質;再選擇d,要求(d*e)mod((p-1)*(q-1))=1。
(n,e),(n,d)就是密鑰對。其中(n,e)爲公鑰,(n,d)爲私鑰。
RSA加解密的算法徹底相同,設A爲明文,B爲密文,則:A=B^d mod n;B=A^e mod n;(公鑰加密體制中,通常用公鑰加密,私鑰解密)
e和d能夠互換使用,即:
A=B^d mod n;B=A^e mod n;算法

代碼參考以下:
#coding -*- utf:8 -*-
import math
import random數組

#生成素數數組
def prime_array():
arraya = []
for i in range(2,100): #生成前100中的素數,從2開始由於2是最小的素數
x = prime(i,2) #i爲素數時返回True,則將x加入arraya數組中;2爲測試值
if x:
arraya.append(i)
return arrayaapp

#判斷是否爲素數
def prime(n, test_divisor):
if math.sqrt(n) < test_divisor:
return True #爲素數時返回True
if n % test_divisor == 0:
return False #不爲素數時返回Fasle
else:
return prime(n, test_divisor+1)dom

#找出與(p-1)*(q-1)互質的數e
def co_prime(s):
while True:
e = random.choice(range(100))
x = gcd(e,s)
if x==1: #若是最大公約數爲1,則退出循環返回e
break
return e測試

#求兩個數的最大公約數
def gcd(a,b):
if b==0:
return a
else:
return gcd(b, a%b)加密

#根據e*d mod s = 1,找出d
def find_d(e,s):
for d in range(100000000): #隨機太難找,就按順序找到d,range裏的數字隨意
x = (e*d) % s
if x==1:
return dcode

#生成公鑰和私鑰
def test():
a= prime_array()
print("前100個素數:",a)
p = random.choice(a)
q = random.choice(a)
print("隨機生成兩個素數p和q. p=",p," q=",q)
n = p * q
s = (p-1)*(q-1)
#print("The p is ", p)
#print("The q is ", q)
#print("The n(p*q) is ",n)
e = co_prime(s)
print("根據e和(p-1)*(q-1))互質獲得: e=", e)
d = find_d(e,s)
print("根據(e*d) 模 ((p-1)*(q-1)) 等於 1 獲得 d=", d)
print("公鑰: n=",n," e=",e)
print("私鑰: n=",n," d=",d)
pbvk=(n,e,d)
return pbvkinput

#生成public key公鑰或private key私鑰
#zx==0 公鑰 zx==1 私鑰
#a爲元組(n,e,d)
def generate_pbk_pvk(a,zx):
pbk = (a[0],a[1]) #public key公鑰 元組類型,不能被修改
pvk = (a[0],a[2]) #private key私鑰
#print("公鑰: n=",pbk[0]," e=",pbk[1])
#print("私鑰: n=",pvk[0]," d=",pvk[1])
if zx==0:
return pbk
if zx==1:
return pvkio

#加密
def encryption(mw, ned):
# 密文B = 明文A的e次方 模 n, ned爲公鑰
#mw就是明文A,ned【1】是e, ned【0】是n
B = pow(mw,ned[1]) % ned[0]
return Btest

#解密
def decode(mw, ned):
# 明文C = 密文B的d次方 模 n, ned爲私鑰匙
#mw就是密文B, ned【1】是e,ned【1】是d
C = pow(mw,ned[1]) % ned[0]
return C

if __name__=='__main__': pbvk = test() pbk = generate_pbk_pvk(pbvk, 0) #公鑰 if 0 return pbk if 1 return pvk A = int(input("請輸入明文: ")) print("加密中....") B = encryption(A,pbk) #加密 print("生成的密文是: ", B) pvk = generate_pbk_pvk(pbvk, 1) #私鑰 print("解密中....") C = decode(B,pvk) #解密 print("解密後的明文是: ", C) if A==C: print("加密前的明文和解密後的明文同樣,成功!!!")

相關文章
相關標籤/搜索