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

你可能感兴趣的:(python,算法,开发语言)