decodages/etape5.c

80 lines
2.2 KiB
C
Raw Normal View History

2024-01-24 18:22:15 +01:00
#include <stdio.h>
#include <stdlib.h>
2024-01-24 19:19:15 +01:00
#include <stdint.h>
2024-01-24 18:22:15 +01:00
/* 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
2024-01-24 19:19:15 +01:00
(n=1028648100739351553,e=138115088263636411)
2024-01-24 18:22:15 +01:00
*/
/* Creation de la structure qui gardera le nombre premier p et q */
typedef struct nbPremier
{
2024-01-24 19:19:15 +01:00
unsigned long long int p;
unsigned long long int q;
2024-01-24 18:22:15 +01:00
} premier;
/* Verifier si un nombre est premier ou non */
2024-01-24 19:19:15 +01:00
int nombrePremier(unsigned long long int x)
2024-01-24 18:22:15 +01:00
{
2024-01-24 19:19:15 +01:00
/* Il faut que le nombre soit superieur a 1 */
2024-01-24 18:22:15 +01:00
if (x < 2)
{
return 0;
}
2024-01-24 19:19:15 +01:00
/* Test pour savoir si c'est un nombre premier */
for (unsigned long long int i = 2; i < x; i++)
2024-01-24 18:22:15 +01:00
{
2024-01-24 19:19:15 +01:00
if ((x % i) == 0)
2024-01-24 18:22:15 +01:00
{
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 */
2024-01-24 19:19:15 +01:00
premier findPq(unsigned long long int n)
2024-01-24 18:22:15 +01:00
{
premier pq;
2024-01-24 19:19:15 +01:00
for (unsigned long long int i = 2; i < n; i++){
if (n % i == 0) {
2024-01-24 18:22:15 +01:00
if (nombrePremier(i) && nombrePremier(n/i)){
pq.q = i;
pq.p = n/i;
2024-01-24 19:19:15 +01:00
printf("p = %llu\n", pq.p);
printf("q = %llu\n", pq.q);
2024-01-24 18:22:15 +01:00
return pq;
}
}
}
}
int main(void) {
/*Parametres RSA*/
2024-01-24 19:19:15 +01:00
unsigned long long int n = 1028648100739351553;
unsigned long long int e = 138115088263636411;
unsigned long long int d, nb, phi;
2024-01-24 18:22:15 +01:00
/* 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 */
2024-01-24 19:19:15 +01:00
for (unsigned long long int i = 1; i < phi; i++) {
if (e * i % phi == 1) {
2024-01-24 18:22:15 +01:00
d = i;
break;
}
}
2024-01-24 19:19:15 +01:00
printf("La cle privee d est : %llu", d);
2024-01-24 18:22:15 +01:00
return EXIT_SUCCESS;
}