我团队有个项目可能用到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]))