python实现RSA加解密

摘要:
ReturnTrue#返回True,如果%n%测试是素数_除数==0:test_除数+1)#查找与(p-1)*(q-1)_素数互素的数字edefco:e=随机。choice(range(100))x=gcd(e,范围内的随机数x=(e*d)%sifx==1:a=prime_Array()print(“前100个素数:

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

免责声明:文章转载自《python实现RSA加解密》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android小技巧(二):为ContentProvider添加数据库事务支持Cinder LVM Oversubscription in thin provisioning下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Ajax取PHP JSON数据并显示

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-sc...

史上最全的Spring Boot配置文件详解

Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍。Spring Boot配置文件对Spring Boot来说就是入门和基础,经常会用到,所以写下做个总结以便日后查看。 1.配置文件 当我们构建完Spring Boot项目后,会在resources目录下给我们一个默认的全局配置文件 application.prope...

element-ui 树形表格多选

如题element-ui 2.13.2版本支持树形结构tabel,多层级折叠显示 但是没有多选 + 树形tabel, 业务需求的情况下必须要实现,操作勾选数据编辑 这里我们可以用两个事件来实现:   @select:用户勾选某行触发事件,第一个参数selection:所有选中的数据, 第二参数row:勾选的这行数据)   @select-all : 表头的...

在用scrapy时遇到的坑

1. 一开始是想用scrapy和selenium来爬什么值得买,结果遇到了一个奇怪的问题,直接上代码 def start_requests(self): self.logger.info("starting") broswer = webdriver.Firefox() broswer.get(self...

C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)

  C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535) 一:报错 Invalid row number (65536) outside allowable range (0..65535) 原因:excel 03的限制就是65536行,超过行数...

转 Python 时间戳操作,获取整点凌晨时间戳

获取凌晨时间 # 方法一 获取凌晨时间戳import timeimport datetime # 思路特别简单 dt = time.strftime("%Y-%m-%d")print(dt) # 先得到前缀 2019-12-13 这种,然后在拼接成2019-12-13 00:00:00time_array = time.strptime(f"{dt} 00...