Python实现RSA加密解密算法

import random                                     # import random to use randint
from Crypto.Util import number

import Crypto
# import Crypto.Util.number to use getPrime
def str_to_int(s):
    b = str.encode(s)  # str to bytes
    return int.from_bytes(b, 'big')  # bytes to int


def int_to_str(i, str_len):  # str_len is the length of str converted
    b = i.to_bytes(str_len, 'big')  # convert int to bytes
    return bytes.decode(b)
def powMod(a, b, c):
    a = a % c
    ans = 1
    while b != 0:
        if b & 1:
            ans = (ans * a) % c
        b >>= 1
        a = (a * a) % c
    return ans
def Exgcd(r0, r1):  # compute s, t, r satisfying s * r0 + t * r1 = r = gcd(r0, r1)
    s0, s1 = 1, 0
    t0, t1 = 0, 1
    q, r = r0 // r1, r0 % r1
    while (r):
        s, t = s0 - q * s1, t0 - q * t1
        s0, s1, t0, t1 = s1, s, t1, t
        r0, r1 = r1, r
        q, r = r0 // r1, r0 % r1
    return s1, t1, r1
def GenKey(bitlen):
    p = number.getPrime(bitlen)                   # generate prime p
    q = number.getPrime(bitlen)

    n = p * q                                     # n = p * q
    phi_n = (p-1) * (q-1)                         # phi_n = (p-1) * (q-1)
    e = random.randint(0, phi_n - 1)              # randomly choose e
    while (Exgcd(e, phi_n)[-1] != 1):
        e = random.randint(0, phi_n - 1)
        
    [d, k, r] = Exgcd(e, phi_n)

    d = d % phi_n                                 # d = d % phi_n
    return n, e, d
if __name__ == '__main__':                        # main function
    [n, e, d] = GenKey(512)
    print("\nn = %d\ne = %d\nd = %d\n" %(n,e,d))  # print n, e, d
    m = input("Input message: ")
    msg = m
    print("\n    m = %s\n" %m)
    m = str_to_int(m)
    
    
    c = powMod(int(m),e,n)
    # c = Enc(int(m),e,n)
    print("c = %d\n" %int(c))
    m_dec=powMod(c,d,n)
    m_dec = int_to_str(m_dec,len(msg))
    # m_dec = Dec(c,d,n)                          # decrypt c
    print("m_dec = %s\n" %m_dec)                  # print the decrypted message m_dec
    print(msg == m_dec)                        # check if m == m_dec

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

alasnot

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值