5 réponses
Si tu n'obtiens pas le même message en enchaînant cryptage et décryptage, c'est que ton algorithme est mauvais ou mal implémenté.
S'il s'agit d'un cryptage connu, tu peux peut-être trouver un autre programme pour comparer ses résultats avec le sien.
Peux-tu mettre le code ? Nous pourrons le regarder, s'il n'est pas trop compliqué.
S'il s'agit d'un cryptage connu, tu peux peut-être trouver un autre programme pour comparer ses résultats avec le sien.
Peux-tu mettre le code ? Nous pourrons le regarder, s'il n'est pas trop compliqué.
Tout d'abord, merci d'utiliser 'Répondre à la question' pour répondre à la question. 'Ajouter un commentaire' ne devrait servir qu'à faire des commentaires.
Ensuite, quand tu postes du code, utilise les balises < code > ( le bouton avec <> en haut de la fenêtre de saisie des messages, parce le code que tu as posté est illisible.
Enfin j'en viens à ton problème. Avec quelle valeur du paramètre e1 as-tu essayé ton algorithme ? Il y a une élévation à la puissance qui provoque probablement un débordement. As-tu essayé avec e1 = 1 ?
Ensuite, quand tu postes du code, utilise les balises < code > ( le bouton avec <> en haut de la fenêtre de saisie des messages, parce le code que tu as posté est illisible.
Enfin j'en viens à ton problème. Avec quelle valeur du paramètre e1 as-tu essayé ton algorithme ? Il y a une élévation à la puissance qui provoque probablement un débordement. As-tu essayé avec e1 = 1 ?
alors
les codes que j'ai envoyé ce sont des classes
j'ai fé l'essai avec e
< void main()
{ int flag[30];
unsigned long long p =0, q = 0 ;
int i,phi,n,e= 0,d=0,s,C,FLAG=0;
long double x, y;
unsigned long int div, div1;
char M[50];
printf(" le premier nombre premier p \t: " );
do
{
p = myRandom();
}
while(!Miller(p,5));
printf ("%d\n", p);
printf(" le deuxieme nombre premier q \t: " );
do
{
q = myRandom();
}
while(!Miller(q,5));
printf ("%d", q);
n = p*q;
phi=(p-1)*(q-1);
printf("\n\tF(n)\t= %d",phi);
{
printf("\n\nEnter e\t: " );
scanf("%d",&e);
}while(FLAG==1);
d = 1;
do
{
s = (d*e)%phi;
d++;
}while(s!=1);
d = d-1;
printf("\n\tPublic Key\t: {%d,%d}\n",e,n);
printf("\n\tPrivate Key\t: {%d,%d}\n",d,n);
printf("Entrer le message \n" );
scanf("%s",M);
for(int i=0;i<strlen(M);i++)
{
flag[i]=0;
if(M[i]>='a'&& M[i]<='z')
flag[i]=1;
else
continue;
}
printf("Encryption:\n" );
cryptage CR = cryptage(e, M);
CR.crypt( e , M, n);
printf("%s",M);
/*printf("\nEntrer le message crypter\n" );
scanf("%s",M);*/
printf("\nDecryption:\n" );
decryptage D = decryptage( d, M);
D.decrypt(d ,M , n);
printf("%s",M);
getch();
}
>
les codes que j'ai envoyé ce sont des classes
j'ai fé l'essai avec e
< void main()
{ int flag[30];
unsigned long long p =0, q = 0 ;
int i,phi,n,e= 0,d=0,s,C,FLAG=0;
long double x, y;
unsigned long int div, div1;
char M[50];
printf(" le premier nombre premier p \t: " );
do
{
p = myRandom();
}
while(!Miller(p,5));
printf ("%d\n", p);
printf(" le deuxieme nombre premier q \t: " );
do
{
q = myRandom();
}
while(!Miller(q,5));
printf ("%d", q);
n = p*q;
phi=(p-1)*(q-1);
printf("\n\tF(n)\t= %d",phi);
{
printf("\n\nEnter e\t: " );
scanf("%d",&e);
}while(FLAG==1);
d = 1;
do
{
s = (d*e)%phi;
d++;
}while(s!=1);
d = d-1;
printf("\n\tPublic Key\t: {%d,%d}\n",e,n);
printf("\n\tPrivate Key\t: {%d,%d}\n",d,n);
printf("Entrer le message \n" );
scanf("%s",M);
for(int i=0;i<strlen(M);i++)
{
flag[i]=0;
if(M[i]>='a'&& M[i]<='z')
flag[i]=1;
else
continue;
}
printf("Encryption:\n" );
cryptage CR = cryptage(e, M);
CR.crypt( e , M, n);
printf("%s",M);
/*printf("\nEntrer le message crypter\n" );
scanf("%s",M);*/
printf("\nDecryption:\n" );
decryptage D = decryptage( d, M);
D.decrypt(d ,M , n);
printf("%s",M);
getch();
}
>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu n'as pas utilisé les bonnes balises. Ol ne s'agit pas de mettre < avant et > après, il faut sélectionner tout le code et cliquer sur le bouton <>.
Ceci ajoute une balise < code avant et une balise </ code> après. ET tu peux utiliser le bouton prévisualiser pour voir que ça marche.
Je ne vois pas avec quelles valeur de e tu as crypté. Jusqu'à preuve du contraire, je suppose que lors de l'élévation à la puissance, que tu fais par une multiplication répétée sur des int, il y a débordement.
De plus, je viens de jeter un coup d'oeil à la page de wikipedia sur l'algorithme RSA, et je ne vois pas comment justifier tes bricolages avec les lettres majuscules / minuscules.
Ceci ajoute une balise < code avant et une balise </ code> après. ET tu peux utiliser le bouton prévisualiser pour voir que ça marche.
Je ne vois pas avec quelles valeur de e tu as crypté. Jusqu'à preuve du contraire, je suppose que lors de l'élévation à la puissance, que tu fais par une multiplication répétée sur des int, il y a débordement.
De plus, je viens de jeter un coup d'oeil à la page de wikipedia sur l'algorithme RSA, et je ne vois pas comment justifier tes bricolages avec les lettres majuscules / minuscules.
{ public:
int e,i;
char M[50];
int flag[30];
cryptage(int e1, char M1[50])
{
e=e1;
*M=*M1;
}
/*int funct(char M)
{
int x;
for (int i=0; i< strlen(M); i++)
{
if(M >='a'&& M <='z')
x=M -96;
if(M >='A'&& M <='Z')
x=M -64;
x = static_cast<int>(M);
}
return x;
} */
void crypt(int e , char M[50], int n)
{
int phi, s, c[30];
long long int x;
unsigned long long int div;
char cc;
for(int i=0;i<strlen(M);i++)
{
flag[i]=0;
if(M[i]>='a'&& M[i]<='z')
flag[i]=1;
else
continue;
}
for(int i=0;i < strlen(M);i++)
{
/* s=funct(M[i]);
for (int j= 0; j<e; i++)
x= s * cccc ;
div= (unsigned long int)x;
c[i]=fmod(div,n);}*/
s = static_cast<int>(M[i]); //convertir en code ascii
if(flag[i]==0)
s=s-64;
else
s=s-96;
//printf("%d",s);
x=1;
for(int j=0; j<e;j++)
x=x*s;
// x=pow(((long int)s),((long int)e));
div=(unsigned long long int)x;
c[i]=div%n;
//printf ("%d",c[i]);
if(flag[i]==0)
//printf("%c",(c[i]+64));
c[i]=c[i]+64;
else
//printf("%c",(c[i]+96));
c[i]=c[i]+96;
cc = static_cast<char>(c[i]); //convertir en char
// printf ("%c",cc);
M[i]=cc;
}
}
};
{
public:
int n,d, phi, ss, p2[30];
long long int y;
unsigned long long int div1;
char M[50];
int flag[30];
decryptage(int d1,char M1[50])
{
d=d1;
*M=*M1;
}
/*int funct(char M)
{
int x;
for (int i=0; i< 500; i++)
{
if(M >='a'&& M <='z')
x=M -96;
if(M >='A'&& M <='Z')
x=M -64;}
return x;
} */
void decrypt(int d , char M[50], int n)
{
//int cccc=1;
char pp;
for(int i=0;i<strlen(M);i++)
{
flag[i]=0;
if(M[i]>='a'&& M[i]<='z')
flag[i]=1;
else
continue;
}
for(int i=0; i < strlen(M);i++)
{
/*for (int j= 0; j<d; j++)
y= ss * cccc ;
div1= (unsigned long int)y;
p2[i]=div1%n;}*/
ss = static_cast<int>(M[i]);
if(flag[i]==0)
ss=ss-64;
else
ss=ss-96;
y=1;
for(int j=0; j<d;j++)
y=y*ss;
// y=pow(((long int)ss),((long int)d));
div1=(unsigned long long int)y;
p2[i]=div1%n;
if(flag[i]==0)
p2[i]=p2[i]+64;
// printf("%c ",(p2[i]+64));
else
p2[i]=p2[i]+96;
//printf("%c ",(p2[i]+96));
pp = static_cast<char>(p2[i]);
// printf ("%c",pp);
M[i]=pp;
}
}
};