Etape 4
This commit is contained in:
parent
a79fe2b5ee
commit
c6453b3a4c
5
etape3.c
5
etape3.c
@ -1,6 +1,5 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/* Cette fonction utilise la methode d'exponentiation rapide
|
/* Cette fonction utilise la methode d'exponentiation rapide
|
||||||
afin de calculer des grands nombres de maniere recursive*/
|
afin de calculer des grands nombres de maniere recursive*/
|
||||||
@ -47,7 +46,7 @@ int main(void) {
|
|||||||
|
|
||||||
FILE* stream = fopen("Etape4.bin","r");
|
FILE* stream = fopen("Etape4.bin","r");
|
||||||
|
|
||||||
/* Variable pour les caracteres chiffres */
|
/* Variable pour les chiffres */
|
||||||
long long int nb;
|
long long int nb;
|
||||||
/* Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere
|
/* Tant que la fin du fichier n'est pas atteinte, dechiffrer chaque caractere
|
||||||
en calculant le modulo de la valeur numerique de chacun */
|
en calculant le modulo de la valeur numerique de chacun */
|
||||||
@ -56,4 +55,6 @@ int main(void) {
|
|||||||
printf("%c", (char)dechiffre);
|
printf("%c", (char)dechiffre);
|
||||||
}
|
}
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
|
free(stream);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
111
etape4.c
Normal file
111
etape4.c
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
110
etape5.c
Normal file
110
etape5.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user