diff --git a/src/euclide.py b/src/euclide.py new file mode 100644 index 0000000000000000000000000000000000000000..1e16b6615ea7083f63125fd678a9bb7cfaa9b698 --- /dev/null +++ b/src/euclide.py @@ -0,0 +1,55 @@ +''' + Description : Calcule le PGCD de deux nombres et leurs + coefficients de bezout + Return : PGCD, Coef de X, Coef de Y + (X est le nombre le plus grand) +''' +def pgcd_etendu(a, b): + a, b = abs(a), abs(b) + # On s'assure que le plus grand nombre est a + #if b > a: + #b,a = a,b + + # Vérification que le plus petit nombre n'est pas 0 + assert(not (b == 0)) + + r = [None] * 100 + q = [None] * 100 + x = [None] * 100 + y = [None] * 100 + etape = 2 + + # Phase d'initialisation + r[0] = a + x[0] = 1 + y[0] = 0 + + r[1] = b + x[1] = 0 + y[1] = 1 + + while (r[etape-1] != 0): + r[etape] = a % b + q[etape] = a // b + x[etape] = x[etape-2] - q[etape] * x[etape-1] + y[etape] = y[etape-2] - q[etape] * y[etape-1] + + a, b = b, r[etape] + etape += 1 + + return r[etape-2], x[etape-2], y[etape-2] + +def pgcd_etendu_verif(a, b, x, y, pgcd): + if (pgcd == (a*x + b*y)): + return True + + return False + +if __name__ == '__main__': + + b = 4991 + a = 1197 + + print(pgcd_etendu(a, b)) + pgcd, x, y = pgcd_etendu(a, b) + print(pgcd_etendu_verif(a, b, x, y, pgcd)) \ No newline at end of file diff --git a/src/prime.py b/src/prime.py new file mode 100644 index 0000000000000000000000000000000000000000..eb284d3df6445c162664a5132ccd2f2863a7fc62 --- /dev/null +++ b/src/prime.py @@ -0,0 +1,19 @@ +from math import * + +"""Check wether a number is prime or not + Bruteforcing method +""" +def isPrimeNumber(number): + if number == 1: # 1 is not prime + return False + if number == 2: # 2 is a prime number + return True + if number > 2 and number % 2 == 0: # even numbers are not prime + return False + + for i in range( 3, floor( sqrt(number) + 1 ), 2 ): + if number % i == 0: + return False + return True + + diff --git a/src/private_key.py b/src/private_key.py new file mode 100644 index 0000000000000000000000000000000000000000..73f275684a9f3666a2789b7bcbdd49957aed24e5 --- /dev/null +++ b/src/private_key.py @@ -0,0 +1,20 @@ +from prime import * +from euclide import * + +def find_p_q(n): + for p in range(3, int(n/2), 2): + if (n / p).is_integer(): + return p, n/p + + +def find_private_key(p, q, e): + z = (p-1) * (q-1) + r, x, y = pgcd_etendu(e, z) + return (x % z) + +if __name__ == '__main__': + n = 124344401 #Clé publique 1. + e = 1919 #Clé publique 2. + p, q = find_p_q(n) + private_key = find_private_key(p, q, e) #Clé privé + print(private_key)