from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes from math import gcd import time # key generation p = getPrime(512) # 512-bit prime number q = getPrime(512) # 512-bit prime number n = p * q phi = (p - 1) * (q - 1) e = 65537 # = 2^16 +1 = 10000000000000001 assert gcd(e, phi) == 1 d = pow(e, -1, phi) # encryption def encrypt(message): m = bytes_to_long(message.encode()) c = pow(m, e, n) return c # decryption def decrypt(cipher_int): m = pow(cipher_int, d, n) message = long_to_bytes(m).decode() return message m = "Hello World" c = encrypt(m) start = time.perf_counter() m_recover = decrypt(c) end = time.perf_counter() print("Ciphertext: ", c) print("Message: ", m_recover) print(f"decrypt time: {(end-start)*1e3:.3f} ms")