import random from Crypto.Util.number import getPrime, inverse from Crypto.Util.number import inverse def moc_encryption_message(p, q): message = int.from_bytes("flaggy".encode(), 'big') print("original message: ", message) c = pow(message,p,q) return c def modular_inverse(p, phi_q): x = inverse(p, phi_q) return x % phi_q def decrypt_message(encrypted, p, q): phi_q = q - 1 d = modular_inverse(p, phi_q) message = pow(encrypted, d, q) return message if __name__ == "__main__": bit_length = 992 o = getPrime(bit_length*2) q = getPrime(bit_length*2) e, n = int(o), int(q) if not (bit_length * 2 - 1 <= n.bit_length() <= bit_length * 2): # has to be not print("wrong bit count") c = moc_encryption_message(o, q) m = decrypt_message(c, o, q) print("decrypted message: ", m) byte_length = (m.bit_length() + 7) // 8 decoded_string = m.to_bytes(byte_length, 'big').decode() print("Decrypted_message_to_string: ", decoded_string)