天天看點

python實作rsa加密解密_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 arraya

#判斷是否為素數

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)

#找出與(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 d

#生成公鑰和私鑰

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 pbvk

#生成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 pvk

#加密

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 B

#解密

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("加密前的明文和解密後的明文一樣,成功!!!")