#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; }