36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
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) |