公私钥生成算法
from random import randint
from algorithm.g_prime import Miller_Rabin
from algorithm.g_prime import multimod
# 求最大公约数
def gy(m,n):
if m < n: # 如果m比n小,互换m和n的位置
m, n = n, m
r = m % n # 求出m除n的余数
while r: # 如果余数不为0,进行循环
m = n # 把n赋值给m
n = r # 把r赋值给n
r = m % n # 求余数
return n
# 扩展欧几里得求逆元
def exgcd(a, b):
if b == 0:
return 1, 0, a
else:
x, y, q = exgcd(b, a % b)
x, y = y, (x - (a // b) * y)
return x, y, q
# 扩展欧几里得求逆元
def ModReverse(a,p):
x, y, q = exgcd(a,p)
if q != 1:
raise Exception("No solution.")
else:
return (x + p) % p #防止负数
# 生产大素数
def g_p():
p = randint(2 ** 64, 2 ** 65)
while Miller_Rabin(p,8)!=True:
if(p%2)==1:
p+=2
else:
p=p+1
# p,'出错概率为',1/(4**4))
return p
# 生产公私钥对
def g_keypairs():
# 生成两个大素数
p=g_p()
q=g_p()
# print("p",p,'\n',"q",q)
# n与phi(n)
N=q*p
r=(p-1)*(q-1)
# print("r", r);
# 随机数e与r互质
e=randint(2**10,2**16)
while(gy(e,r)!=1):
e-=1
d=ModReverse(e,r)
# print("逆元",e*d)
# print("逆元",e*d%r)
# print(pub_key,pri_key)
return [e,N,d]
"""
用来加解密测试公私钥对的正确性
"""
if __name__=="__main__":
print(ModReverse(100,1093))
# a=g_keypairs()
#
# m=1000
# c=multimod(m,a[0][1],a[0][0])
# print(c)
# n=multimod(c,a[1][1],a[0][0])
# print("m",n)
签名算法
这里的签名只对64位16进制有效
from algorithm.g_prime import multimod
# 需要签名的都是 64位16进制的 hash值
def sign(server,text):
a,b,c,d=int(text[0:16],16),int(text[16:32],16),int(text[32:48],16),int(text[48:64],16)
result=[]
for i in a,b,c,d:
signed=multimod(i,server.keypairs[2],server.keypairs[1])
result.append(signed)
return result
def design(server,signed):
m=""
for i in signed:
r=multimod(i,server.keypairs[0],server.keypairs[1])
temp=str(hex(r))
if 16-len(temp[2:])!=0:
m+='0'*(16-len(temp))+temp
return m