On y est presque ?

This commit is contained in:
SombrAbsol 2024-01-24 19:19:15 +01:00
parent c6453b3a4c
commit 155d7bbe64
3 changed files with 21 additions and 52 deletions

Binary file not shown.

View File

@ -1,6 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h>
/* n = p * q => p et q sont des nombres premiers /* n = p * q => p et q sont des nombres premiers
e = pgcd(e,(p-1)(q-1)) e = pgcd(e,(p-1)(q-1))
@ -28,7 +27,7 @@ int nombrePremier(long long int x)
return 0; return 0;
} }
/* Test pour savoir si c'est un nombre premier */ /* 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) if (x % i == 0)
{ {

View File

@ -1,6 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <stdint.h>
/* n = p * q => p et q sont des nombres premiers /* n = p * q => p et q sont des nombres premiers
e = pgcd(e,(p-1)(q-1)) e = pgcd(e,(p-1)(q-1))
@ -9,27 +9,28 @@
(M^e) mod n = C (M^e) mod n = C
M = (C^d) mod n 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 */ /* Creation de la structure qui gardera le nombre premier p et q */
typedef struct nbPremier typedef struct nbPremier
{ {
long long int p; unsigned long long int p;
long long int q; unsigned long long int q;
} premier; } premier;
/* Verifier si un nombre est premier ou non */ /* 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) if (x < 2)
{ {
return 0; 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; 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. /* 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 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 */ 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; premier pq;
for (int i = 2; i < n; i++){ for (unsigned long long int i = 2; i < n; i++){
if (n % i == 0){ if (n % i == 0) {
if (nombrePremier(i) && nombrePremier(n/i)){ if (nombrePremier(i) && nombrePremier(n/i)){
pq.q = i; pq.q = i;
pq.p = n/i; pq.p = n/i;
printf("p = %llu\n", pq.p);
printf("q = %llu\n", pq.q);
return pq; 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) { int main(void) {
/*Parametres RSA*/ /*Parametres RSA*/
long long int n = 1028648100739351553; unsigned long long int n = 1028648100739351553;
long long int e = 138115088263636411; unsigned long long int e = 138115088263636411;
long long int d, nb, phi; unsigned long long int d, nb, phi;
/* Recherche des nombres premiers p et q */ /* Recherche des nombres premiers p et q */
premier facteurs = findPq(n); premier facteurs = findPq(n);
phi = (facteurs.p - 1)*(facteurs.q - 1); phi = (facteurs.p - 1)*(facteurs.q - 1);
/* Calcul de la cle privee d a partir de la formule : (e*d) mod phi = 1 */ /* Calcul de la cle privee d a partir de la formule : (e*d) mod phi = 1 */
for (int i = 1; i < phi; i++) { for (unsigned long long int i = 1; i < phi; i++) {
if ((e * i) % phi == 1) { if (e * i % phi == 1) {
d = i; d = i;
break; break;
} }
} }
printf("La cle privee d est : %llu", d);
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; return EXIT_SUCCESS;
} }