diff --git a/decodages.zip b/decodages.zip deleted file mode 100644 index 86e2b61..0000000 Binary files a/decodages.zip and /dev/null differ diff --git a/etape4.c b/etape4.c index 569d7b9..37d9823 100644 --- a/etape4.c +++ b/etape4.c @@ -1,6 +1,5 @@ #include #include -#include /* n = p * q => p et q sont des nombres premiers e = pgcd(e,(p-1)(q-1)) @@ -28,7 +27,7 @@ int nombrePremier(long long int x) return 0; } /* Test pour savoir si c'est un nombre premier */ - for (int i = 2; i * i <= x; i++) + for (int i = 2; i < x; i++) { if (x % i == 0) { diff --git a/etape5.c b/etape5.c index f1a38df..8308278 100644 --- a/etape5.c +++ b/etape5.c @@ -1,6 +1,6 @@ #include #include -#include +#include /* n = p * q => p et q sont des nombres premiers e = pgcd(e,(p-1)(q-1)) @@ -9,27 +9,28 @@ (M^e) mod n = C M = (C^d) mod n - (n=5625943,e=2158731) + (n=1028648100739351553,e=138115088263636411) */ /* Creation de la structure qui gardera le nombre premier p et q */ typedef struct nbPremier { - long long int p; - long long int q; + unsigned long long int p; + unsigned long long int q; } premier; /* Verifier si un nombre est premier ou non */ -int nombrePremier(long long int x) +int nombrePremier(unsigned long long int x) { - /* Il faut que le nombre */ + /* Il faut que le nombre soit superieur a 1 */ if (x < 2) { return 0; } - for (int i = 2; i * i <= x; i++) + /* Test pour savoir si c'est un nombre premier */ + for (unsigned long long int i = 2; i < x; i++) { - if (x % i == 0) + if ((x % i) == 0) { return 0; } @@ -41,70 +42,39 @@ int nombrePremier(long long int x) /* Trouver p et q a partir d'une boucle for : on va tester si un nombre est diviseur de n. Si c'est le cas, on teste si ce nombre est premier et si nombre/n est premier (car nombre * (nombre/n) = n Si les deux nombres sont premiers, alors on a nos 2 facteurs premiers qui multiplier ensemble donnent n */ -premier findPq(long long int n) +premier findPq(unsigned long long int n) { premier pq; - for (int i = 2; i < n; i++){ - if (n % i == 0){ + for (unsigned long long int i = 2; i < n; i++){ + if (n % i == 0) { if (nombrePremier(i) && nombrePremier(n/i)){ pq.q = i; pq.p = n/i; + printf("p = %llu\n", pq.p); + printf("q = %llu\n", pq.q); return pq; } } } } -/* Cette fonction utilise la methode d'exponentiation rapide - afin de calculer des grands nombres de maniere recursive*/ -long long int exponentiation(long long int nb, long long int d, long long int n) { - - /* Si on arrive a la puissance 0*/ - if (d == 0) { - return 1; - } - - /* Si la puissance est paire, on la divise par 2 - et on peut ainsi mette notre nombre au carre */ - else if (d % 2 == 0) { - nb = exponentiation(nb, d / 2, n); - return (nb * nb) % n; - } - - /* Sinon la puissance est impaire, on la transforme en puissance paire en enlevant 1 - a la puissance d lors de l'appel recursif de la fonction et en multipliant le resultat par nb */ - else { - return (nb * exponentiation(nb, d - 1, n)) % n; - } -} - int main(void) { /*Parametres RSA*/ - long long int n = 1028648100739351553; - long long int e = 138115088263636411; - long long int d, nb, phi; + unsigned long long int n = 1028648100739351553; + unsigned long long int e = 138115088263636411; + unsigned long long int d, nb, phi; /* Recherche des nombres premiers p et q */ premier facteurs = findPq(n); phi = (facteurs.p - 1)*(facteurs.q - 1); /* Calcul de la cle privee d a partir de la formule : (e*d) mod phi = 1 */ - for (int i = 1; i < phi; i++) { - if ((e * i) % phi == 1) { + for (unsigned long long int i = 1; i < phi; i++) { + if (e * i % phi == 1) { d = i; break; } } - - FILE* stream = fopen("Etape5.bin","r"); - - /* Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere - en calculant le modulo de la valeur numerique de chacun */ - while (fread(&nb, sizeof(long long int), 1, stream) != 0) { - long long int dechiffre = exponentiation(nb, d, n); - printf("%c", (char)dechiffre); - } - fclose(stream); - free(stream); + printf("La cle privee d est : %llu", d); return EXIT_SUCCESS; } \ No newline at end of file