Python RSA算法实现

我团队有个项目可能用到RSA算法,所以我做了一个

里面还有生成质数的函数,也有判断是否互质,功能很多,都是分开的

import random

def zhi2(Min,Max):
    if Min > Max or Min < 2:
        print("发生错误!")
        return
    while True:
        a = random.randint(Min,Max)
        for i in range(2,a):
            if a % i == 0:
                return 1
        return a

def zhi(Min,Max):#生成质数,小的数要在前面
    while True:
        a = zhi2(Min,Max)
        if a != 1:
            return a

def huzhi(Min,Max):#判断两个数是否互质,小的数要在前面
    for i in range(2,Min):
        if Min%i == 0 and Max%i == 0:
            return 1
    return Min

def rsa_key(Min,Max):#生成公钥和私钥
    p = zhi(Min,Max)
    q = zhi(Min,Max)
    n = p*q
    while True:
        e = random.randint(2,(p-1)*(q-1)-1)
        if (p-1)*(q-1) % e == 0:
            continue
        e = huzhi(e,(p-1)*(q-1))
        if e != 1:
            break
    for d in range(1,10**100):
        if e*d % ((p-1)*(q-1)) == 1:
            break
    if e == d:
        return rsa_key()
    return {"public":(e,n),"private":(d,n)}

def enrsa(Str,e,n1,d,n2):#加密 e,n1公钥 d,n2私钥
    udata2 = []
    udata3 = str(hash(Str))
    udata4 = []
    for i in Str:
        udata2.append(hex(ord(i)**e%n1))
    for i in udata3:
        udata4.append(hex(ord(i)**d%n2))
    udata5 = ""
    udata6 = ""
    for i in range(len(udata2)):
        udata5+=udata2[i]
        if i != len(udata2)-1:
            udata5+=" "
    for i in range(len(udata4)):
        udata6+=udata4[i]
        if i != len(udata4)-1:
            udata6+=" "
    return udata5+","+udata6 #udata5是用对方公钥加密的文本,udata6是文本的哈希值再用自己私钥加密过一遍

def dersa(Str,e,n1,d,n2):#解密 e,n1公钥 d,n2私钥
    Str2 = Str.split(",")
    Str2[0] = Str2[0].split(" ")
    Str2[1] = Str2[1].split(" ")
    udata2 = ""
    udata3 = ""
    for i in Str2[0]:
        udata2+=chr(int(i,16)**d%n2)
    for i in Str2[0]:
        udata3+=str(int(i,16)**e%n1)
    return udata2,udata3 #udata2是解密的文本用自己私钥解密,udata3是文本的哈希值用对方的公钥解密

#初始化 公钥 和 私钥
Dict = rsa_key(3,100)#这里的3和100可以改的更大,但是计算量更大,请慎重
public = Dict["public"]
private = Dict["private"]

data = enrsa("Hello world!",public[0],public[1],private[0],private[1])
print(data)
print(dersa(data,public[0],public[1],private[0],private[1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值