RSA生成公私钥及签名算法

Miller_Rabin素数检测算法
multimod 快速幂取模算法

公私钥生成算法

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值