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实现RSA加密解密算法
最新推荐文章于 2024-02-21 05:07:45 发布