从零写RSA二:RSA原理及其实现

RSA算法就是基于大素数难以分解而得到的一种算法,通过公钥和私钥来进行对数据的加密解密。

  1. 选择两个大素数p,q。计算n=p*q
  2. 计算s=lcm(p-1,q-1),即p-1和q-1的最小公倍数
  3. 随机选择e,使得1<e<s,且gcd(e,s)=1
  4. 计算e的模逆元e*x % s = 1(即de=1 mod (p-1)(q-1))
  5. 则(n,e)为公钥,(n,d)为私钥
  6. RSA加解密的算法,设M为明文,C为密文,则:
  7. ​ M=C^d mod n;

    ​C=M^e mod n;

代码实现就是直接套公式就可以了。

import random,rabinMiller

def gcd(a, b):
    while a != 0:
        a, b = b % a, a
    return b

def findModInverse(a, m):
    if gcd(a,m)!=1:
        return None
    u1,u2,u3 = 1,0,a
    v1,v2,v3 = 0,1,m
    while v3!=0:
        q=u3//v3
        v1, v2, v3,u1,u2,u3=(u1-q*v1), (u2-q*v2), (u3-q*v3),v1, v2, v3
    return u1%m

def generateRSAkey(keySize=1024):
    p = rabinMiller.generateLargePrime(keySize)
    q = rabinMiller.generateLargePrime(keySize)
    n = p*q

    while True:
        e = random.randrange(2 ** (keySize - 1), 2 ** (keySize))
        if gcd(e, (p - 1) * (q - 1)) == 1:
            break
    d = findModInverse(e, (p - 1) * (q - 1))

    publicKey = (n, e)
    privateKey = (n, d)
    print(publicKey)
    print(privateKey)
    return publicKey,privateKey

if __name__=="__main__":
    publicKey, privateKey =generateRSAkey()

    msg = 'hello world!'

    msg = list(msg.encode('ascii'))
    emsg = []
    for m in msg:
        emsg.append(pow(m, publicKey[1], publicKey[0]))

    print(emsg)

    dmsg = []
    for c in emsg:
        dmsg.append(pow(c, privateKey[1], privateKey[0]))

    msg_ = bytes(dmsg).decode('ascii')

    print(msg_)

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0xweb3q

有钱的捧个钱场,没钱的捧个人场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值