diff --git a/a.exe b/a.exe deleted file mode 100644 index 41eb146..0000000 Binary files a/a.exe and /dev/null differ diff --git a/etape3.c b/etape3.c index dd2b376..836e04f 100644 --- a/etape3.c +++ b/etape3.c @@ -1,6 +1,5 @@ #include #include -#include /* Cette fonction utilise la methode d'exponentiation rapide afin de calculer des grands nombres de maniere recursive*/ @@ -47,7 +46,7 @@ int main(void) { FILE* stream = fopen("Etape4.bin","r"); - /* Variable pour les caracteres chiffres */ + /* Variable pour les chiffres */ long long int nb; /* Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere en calculant le modulo de la valeur numerique de chacun */ @@ -56,4 +55,6 @@ int main(void) { printf("%c", (char)dechiffre); } fclose(stream); + free(stream); + return EXIT_SUCCESS; } \ No newline at end of file diff --git a/etape4.c b/etape4.c new file mode 100644 index 0000000..569d7b9 --- /dev/null +++ b/etape4.c @@ -0,0 +1,111 @@ +#include +#include +#include + +/* n = p * q => p et q sont des nombres premiers + e = pgcd(e,(p-1)(q-1)) + d doit etre inverse de e modulo(p-1)(q-1) + --> d*e = 1 mod((p-1)(q-1)) + (M^e) mod n = C + M = (C^d) mod n + + (n=5625943,e=2158731) + */ + +/* Creation de la structure qui gardera le nombre premier p et q */ +typedef struct nbPremier +{ + long long int p; + long long int q; +} premier; + +/* Verifier si un nombre est premier ou non */ +int nombrePremier(long long int x) +{ + /* Il faut que le nombre soit superieur a 1 */ + if (x < 2) + { + return 0; + } + /* Test pour savoir si c'est un nombre premier */ + for (int i = 2; i * i <= x; i++) + { + if (x % i == 0) + { + return 0; + } + } + return 1; +} + + +/* 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 pq; + for (int i = 2; i < n; i++){ + if (n % i == 0){ + if (nombrePremier(i) && nombrePremier(n/i)){ + pq.q = i; + pq.p = n/i; + 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 = 5625943; + long long int e = 2158731; + 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) { + 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); + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/etape5.c b/etape5.c new file mode 100644 index 0000000..f1a38df --- /dev/null +++ b/etape5.c @@ -0,0 +1,110 @@ +#include +#include +#include + +/* n = p * q => p et q sont des nombres premiers + e = pgcd(e,(p-1)(q-1)) + d doit etre inverse de e modulo(p-1)(q-1) + --> d*e = 1 mod((p-1)(q-1)) + (M^e) mod n = C + M = (C^d) mod n + + (n=5625943,e=2158731) + */ + +/* Creation de la structure qui gardera le nombre premier p et q */ +typedef struct nbPremier +{ + long long int p; + long long int q; +} premier; + +/* Verifier si un nombre est premier ou non */ +int nombrePremier(long long int x) +{ + /* Il faut que le nombre */ + if (x < 2) + { + return 0; + } + for (int i = 2; i * i <= x; i++) + { + if (x % i == 0) + { + return 0; + } + } + return 1; +} + + +/* 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 pq; + for (int i = 2; i < n; i++){ + if (n % i == 0){ + if (nombrePremier(i) && nombrePremier(n/i)){ + pq.q = i; + pq.p = n/i; + 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; + + /* 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) { + 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); + return EXIT_SUCCESS; +} \ No newline at end of file