diff --git a/rsa.py b/rsa.py index 788a85c1c8a7c1251b8b2a47200f56aebc4402d8..df7401d360b78655ff0a2dd2c6658a8c8130b8c8 100644 --- a/rsa.py +++ b/rsa.py @@ -1,20 +1,21 @@ """ -Project : TP numéro 2 : RSA -Lesson : IT 121 – 2021-2022 -Authors : Florian BURGENER, Gawen ACKERMANN, Quentin FASLER, Dario GENGA +Project : Travail Pratique RSA +Course : ISC_121 – 2021-2022 +Authors : Dario GENGA, Florian BURGENER, Gawen ACKERMANN, Quentin FASLER, Date : 2021-2022 """ +import math def get_bezout_coefficients(a, b): - """Find the Bézout coefficients of a and b. + """Find the Bézout coefficients for the numbers a and b. Args: a (int): The number a b (int): The number b. Returns: - tuple: Bézout coefficients. + tuple: The Bézout coefficients. """ r = [a, b] x = [1, 0] @@ -24,24 +25,26 @@ def get_bezout_coefficients(a, b): while r[i] > 0: i += 1 + r.append(r[i - 2] % r[i - 1]) q.append(int(r[i - 2] / r[i - 1])) if r[i] > 0: x.append(x[i - 2] - q[i] * x[i - 1]) y.append(y[i - 2] - q[i] * y[i - 1]) + return x[-1], y[-1] def modular_inverse(a, n): - """Compute the modular inverse of a number a modulo n. + """Calculates the modular inverse of a number a modulo n. Args: - a (int): The number to reverse. + a (int): The number to be reversed. n (int): The modulo. Returns: - int: The reversed number. + int: The inverted number. """ coefficients = get_bezout_coefficients(a, n) @@ -50,119 +53,72 @@ def modular_inverse(a, n): return None -def get_q_p(n): - """Get the value of q and p from n by bruteforce. +def break_encryption(n): + """Breaks RSA encryption using the brute force technique. Args: - n (int): One of the two value of the public key. + n (int): The component of the public key which is the product of p and q. Returns: - tuple: The two value that represent n. + tuple: The prime numbers p and q. """ - p = 2 - while True: - if n % p == 0: - q = n // p - return (p, q) - p += 1 + range_low = 3 + range_high = int(math.ceil(math.sqrt(n))) + + for x in [2] + list(range(range_low, range_high, 2)): + if n % x == 0: + return (x, n // x) + + return None def modular_pow(base, exponent, modulus): - """Compute the modular power. + """Computes the modular exponentiation. Args: - base (int): The value of a part of the message to be decoded. - exponent (int): The private key. - modulus (int): One of the two value of the public key. + base (int): Power base. + exponent (int): Power exponent. + modulus (int): The modulos. Returns: - int: The int value of the value, ready to be decoded to utf-8. + int: The result of the exponentiation. """ if modulus == 1: return 0 + result = 1 base %= modulus + while exponent > 0: if exponent % 2 == 1: result = (result * base) % modulus + exponent = exponent >> 1 base = (base * base) % modulus + return result def main(): e = 5249 n = 1653973759 - messages = ( - 1511395078, - 260436590, - 1630654276, - 1190458520, - 790492067, - 515550941, - 297140366, - 755589582, - 647075331, - 1191707844, - 901889430, - 660956124, - 1500654109, - 984322720, - 1275630738, - 1244853107, - 1445928913, - 1312523810, - 265093060, - 933013993, - 1375592761, - 195866064, - 534502441, - 928270408, - 166404031, - 621272622, - 1304987439, - 905393335, - 55120151, - 772595721, - 506609577, - 1172751778, - 162439707, - 233959833, - 1468937795, - 1358701120, - 901889430, - 495995733, - 1524090698, - 1043509086, - 934992314, - 1545639379, - 1061595897, - 1348452679, - 1135067876, - 905393335, - 621272622, - 55120151, - 233959833, - 1220119699, - 708711266, - 517797467, - 195866064, - 1579814353, - 412378626, - 498875436, - 445485200, - 7656659 - ) - - p, q = get_q_p(n) + encrypted_data = (1511395078, 260436590, 1630654276, 1190458520, 790492067, 515550941, 297140366, 755589582, 647075331, 1191707844, 901889430, 660956124, 1500654109, 984322720, 1275630738, 1244853107, 1445928913, 1312523810, 265093060, 933013993, 1375592761, 195866064, 534502441, 928270408, 166404031, 621272622, 1304987439, 905393335, 55120151, 772595721, 506609577, 1172751778, 162439707, 233959833, 1468937795, 1358701120, 901889430, 495995733, 1524090698, 1043509086, 934992314, 1545639379, 1061595897, 1348452679, 1135067876, 905393335, 621272622, 55120151, 233959833, 1220119699, 708711266, 517797467, 195866064, 1579814353, 412378626, 498875436, 445485200, 7656659) + + p, q = break_encryption(n) + + # Calculation of the decryption key. d = modular_inverse(e, (p - 1) * (q - 1)) - result = "" - for x in messages: - tmp = modular_pow(x, d, n) - mBytes = tmp.to_bytes(tmp.bit_length(), byteorder="little") - result += mBytes.decode("utf-8") + decrypted_data = [] + + for x in encrypted_data: + decrypted_data.append(modular_pow(x, d, n)) + + decoded_data = "" + + for x in decrypted_data: + decoded_data += x.to_bytes((x.bit_length() + 7) // 8, "little").decode("utf-8") - print(result) + print(decoded_data) if __name__ == "__main__": diff --git a/annexe /Group_13_Enonce.txt "b/\303\251nonc\303\251/RSA_Groupe_13.txt" similarity index 100% rename from annexe /Group_13_Enonce.txt rename to "\303\251nonc\303\251/RSA_Groupe_13.txt" diff --git a/annexe /enonce_tp_RSA.pdf "b/\303\251nonc\303\251/TP2-RSA.pdf" similarity index 100% rename from annexe /enonce_tp_RSA.pdf rename to "\303\251nonc\303\251/TP2-RSA.pdf"