Algorothme RSA utilisant des float
azalee
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai essayé d'écrire un algorithme de cryptage (RSA). Le code à bien marché avec des int. J'ai changé les int par des float. Au moment du décryptage la console m'affiche un zéro. Le problème se trouve au niveau de la ligne suivnte : "*M=fmod((*M*C),n);"
Voici mon code :
#include<stdio.h>
#include<conio.h>
#include<math.h>
float pgcd(float x, float y)
{
float r;
while(y!=0)
{
r=fmod(x,y);
x=y;
y=r;
}
return x;
}
int check_prime_number(float x)
{
float sqrt_n;
int i;
if (!fmod(x,2)) return 0;
sqrt_n = sqrt(x);
for (i = 3; i <= sqrt_n; i+=2) {
if (!fmod(x,i)) return 0;
}
return 1;
}
int check_e(float PHI,float e,float p,float q)
{
if((pgcd(PHI,e)==1)&&(e<PHI)&&(e!=p)&&(e!=q))
return 1;
else return 0;
}
float find_d(float PHI, float E)
{
float d=1;
while(fmod((E*d),PHI)!=1)
{
d++;
}
return d;
}
void encrypt(float M, float *C, float e, float n)
{
int i;
*C = 1;
for(i=0;i<e;i++)
*C=fmod((*C*M),n);
*C = fmod(*C,n);
}
void decrypt(float C, float *M, float d, float n)
{
int i;
*M = 1;
for(i=0;i<d;i++)
{
*M=fmod((*M*C),n);
}
*M = fmod(*M,n);
}
void main()
{
float M,c,f,p,q,n,phi,e,d;
do
{
printf("\nDonner p (naturel premier) : ");
scanf("%f",&p);
}while(check_prime_number(p)==0);
do
{
printf("\nDonner q (naturel premier) superieur a %.0f: ",p);
scanf("%f",&q);
}while((check_prime_number(q)==0)||(q<=p));
printf("\nEnter votre cle : ");
scanf("%f",&M);
n = p*q;
phi=(p-1)*(q-1);
do
{
printf("\nDonner e (phi = %.0f ): ",phi);
scanf("%f",&e);
}while(check_e(phi,e,p,q)==0);
encrypt(M,&c,e,n);
printf("\nCle cryptee : %.0f",c);
printf("\n\nEntrer la cle cryptee : ");
scanf("%d",&c);
d=find_d(phi,e);
decrypt(c,&f,d,n);
printf("\nCle decryptee : %.0f",f);
getch();
}
Merci d'avance
J'ai essayé d'écrire un algorithme de cryptage (RSA). Le code à bien marché avec des int. J'ai changé les int par des float. Au moment du décryptage la console m'affiche un zéro. Le problème se trouve au niveau de la ligne suivnte : "*M=fmod((*M*C),n);"
Voici mon code :
#include<stdio.h>
#include<conio.h>
#include<math.h>
float pgcd(float x, float y)
{
float r;
while(y!=0)
{
r=fmod(x,y);
x=y;
y=r;
}
return x;
}
int check_prime_number(float x)
{
float sqrt_n;
int i;
if (!fmod(x,2)) return 0;
sqrt_n = sqrt(x);
for (i = 3; i <= sqrt_n; i+=2) {
if (!fmod(x,i)) return 0;
}
return 1;
}
int check_e(float PHI,float e,float p,float q)
{
if((pgcd(PHI,e)==1)&&(e<PHI)&&(e!=p)&&(e!=q))
return 1;
else return 0;
}
float find_d(float PHI, float E)
{
float d=1;
while(fmod((E*d),PHI)!=1)
{
d++;
}
return d;
}
void encrypt(float M, float *C, float e, float n)
{
int i;
*C = 1;
for(i=0;i<e;i++)
*C=fmod((*C*M),n);
*C = fmod(*C,n);
}
void decrypt(float C, float *M, float d, float n)
{
int i;
*M = 1;
for(i=0;i<d;i++)
{
*M=fmod((*M*C),n);
}
*M = fmod(*M,n);
}
void main()
{
float M,c,f,p,q,n,phi,e,d;
do
{
printf("\nDonner p (naturel premier) : ");
scanf("%f",&p);
}while(check_prime_number(p)==0);
do
{
printf("\nDonner q (naturel premier) superieur a %.0f: ",p);
scanf("%f",&q);
}while((check_prime_number(q)==0)||(q<=p));
printf("\nEnter votre cle : ");
scanf("%f",&M);
n = p*q;
phi=(p-1)*(q-1);
do
{
printf("\nDonner e (phi = %.0f ): ",phi);
scanf("%f",&e);
}while(check_e(phi,e,p,q)==0);
encrypt(M,&c,e,n);
printf("\nCle cryptee : %.0f",c);
printf("\n\nEntrer la cle cryptee : ");
scanf("%d",&c);
d=find_d(phi,e);
decrypt(c,&f,d,n);
printf("\nCle decryptee : %.0f",f);
getch();
}
Merci d'avance
A voir également:
- Algorothme RSA utilisant des float
- Gertrude a préparé la liste des affaires à prendre pour l'excursion. juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
- En utilisant les filtres des colonnes, n'affichez que les personnes de 20 ans habitant à calais. combien sont-elles ? - Forum Matériel & Système
- Manipulation des listes ✓ - Forum Python
- Cliquez sur ce lien. en n'utilisant que le clavier, quel mot obtenez-vous ? ✓ - Forum Matériel & Système
- Modifications - Forum Mail
4 réponses
Salut,
Faire du RSA avec des float ?? Quelle idée saugrenue. ^^.
Sinon, l'erreur doit se localiser ici : scanf("%d",&c);
c est un float. Il faut donc utiliser : scanf("%f",&c);
Cdlt
Faire du RSA avec des float ?? Quelle idée saugrenue. ^^.
Sinon, l'erreur doit se localiser ici : scanf("%d",&c);
c est un float. Il faut donc utiliser : scanf("%f",&c);
Cdlt
Merci c'est réglé, faute d'inattention. En fait, j'ai utilisé des floats juste pour le format des clé. Si je dois utiliser des clé de 64 bits donc j suis obligée d'utiliser des floats (je vais utiliser DES pour les messages). Mais le problème maintenant c'est que le code ne marche pas pour des nombre de grande taille il plante au niveau du décryptage.
exemple :
J'ai mis p=7, q=17, e=5 et la clé =19 j'ai eu un résultat correcte
Ensuite j'ai mis p=47207 q=49999 e=5 et la clé=476545437 Il plante au niveau du décryptage. J'ai utilisé également p=7, q=17, e=5 mais avec une clé =476545437 j'ai eu le même problème.
Cela ne serait pas par hasard un problème au niveau du Borland C++?
exemple :
J'ai mis p=7, q=17, e=5 et la clé =19 j'ai eu un résultat correcte
Ensuite j'ai mis p=47207 q=49999 e=5 et la clé=476545437 Il plante au niveau du décryptage. J'ai utilisé également p=7, q=17, e=5 mais avec une clé =476545437 j'ai eu le même problème.
Cela ne serait pas par hasard un problème au niveau du Borland C++?
Déjà, la règle est simple. Si tu veux faire du chiffrement, oublie les nombres flottants.
Ensuite, pour les int, tu peux essayer les unsigned long long.
De plus, pour éviter de dépasser la capacité des entiers, tu peux améliorer assez facilement le calcul de l'exponentiation modulaire : https://fr.wikipedia.org/wiki/Exponentiation_modulaire
Et enfin, pour travailler avec les grands nombres, il te faudra te construire un type le permettant. Ou utiliser une bibliothèque le permettant, comme celle d'openssl avec son type BIGNUM.
Ensuite, pour les int, tu peux essayer les unsigned long long.
De plus, pour éviter de dépasser la capacité des entiers, tu peux améliorer assez facilement le calcul de l'exponentiation modulaire : https://fr.wikipedia.org/wiki/Exponentiation_modulaire
Et enfin, pour travailler avec les grands nombres, il te faudra te construire un type le permettant. Ou utiliser une bibliothèque le permettant, comme celle d'openssl avec son type BIGNUM.
Désolée de répondre deux fois, mais je pense que pour une clé de 64 bits je ne peux pas utiliser le type unsigned long int. Une clé de 64 bits donne une nombre maximale égale à 2 puissance 64 (d'après ce que j'ai compris). mais le type unsigned long int donne au maximum le nombre 4 294 967 295. Je ne peux pas utiliser DES avec une si petite clé.