begin process at 2010 03 21 18:51:35
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

Algorithme RSA utilisation des floats


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Algorithme RSA utilisation des floats

jeudi 2 avril 2009 à 00:37:56 | Algorithme RSA utilisation des floats

douss4

Bonsoir,

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
jeudi 2 avril 2009 à 07:46:10 | Re : Algorithme RSA utilisation des floats

coucou747

salut

les floats ne sont pas adaptes a ce genre de problemes.

t'as une imprecision quand tu codes sur un float.
jeudi 2 avril 2009 à 11:10:17 | Re : Algorithme RSA utilisation des floats

douss4

Bonjours,

Vous êtes sûre qu'il n'y a pas de solution pour les floats? Je suis vraiment obligée de chiffrer une clé de 64 bits. Connaissant les tailles des types en C je ne peux donc utiliser que des floats. Comme je l'ai déjà dit en plus le code marche sauf pendant le décryptage il m'affiche un zéro.

Merci d'avance.
jeudi 2 avril 2009 à 22:00:58 | Re : Algorithme RSA utilisation des floats

juju12

un float fait 32 bits donc t'es mal barrée
un double fait 64 bits mais seulement 49 (je crois) pour la mantisse donc idem
un long double... ça pourrait passer, je me rappelle plus.
Mais comme dit coucou, les flottants ne sont absolument pas adaptés à ce type de problèmes, il te faut utiliser des entiers de taille plus grande; tu peux gérer cela par toi-même en définissant une structure, un tableau etc...
vendredi 3 avril 2009 à 08:33:43 | Re : Algorithme RSA utilisation des floats

Pistol_Pete

Salut
Sous windows les long double correspondent à des double...
cf http://msdn.microsoft.com/en-us/library/9cx8xs15(VS.80).aspx
A+

____________________________________________________________________________
Mon site internet :
  
[ Lien ]

vendredi 3 avril 2009 à 22:21:37 | Re : Algorithme RSA utilisation des floats

juju12

ah tiens je savais pas...
marrant que ça n'existe plus, les calculs se font toujours en 80 bits dans le FPU...
faut dire que j'ai pas vu souvent de long double utilisés.

lundi 6 avril 2009 à 11:22:54 | Re : Algorithme RSA utilisation des floats

douss4

Bonjour,

J'ai déjà pensé à faire une structure et de crypter chiffre par chiffre mais ça plante toujours au niveau du modulo (error : illegal use of floating point).
En fait je ne cherche pas a faire un programme compliqué (c'est juste un mini projet), j'ai pas le droit d'inclure ma bibliothèque. Au moins un programme qui peut chiffrer un nombre de 7 chiffres. J'ai fait mes recherches et apparemment ça demande beaucoup de travail, en plus c'est pas évident de comprendre les codes d'autres utilisateurs.
L'erreur dans mon code c'était "printf("\n\nEntrer la cle cryptee : ");scanf("%d",&c);", il fallait mettre %f. Je l'ai testé et ça marche. Le problème c'est que j'ai une limite au niveau des choix de p et q (ce n'est pas un dépassement) à partir d'une certaine combinaison il donne un résultat faux après le décryptage.


Cette discussion est classée dans : int, return, fmod, float, phi


Répondre à ce message

Sujets en rapport avec ce message

dépassement capacité d'un float et int [ par golum ] result=scanf("%f",&coef); if (result !=0 && coef !=0)Voila si j'entre un nombre délirant style 9999999999999999999999999999999999999999999999999999999 ressources et API !!!! [ par Xs ] salut !voila, pour me simplifier la tache, j'utlise les ressources pour creer une boite de dialog (sous VC++ 6).mais j'obtiens, lors de la compilation scanf() [ par clb ] bonjour à tous,j'ecris par exemple :int fonction(){ if(true) return 0; else return -1}dans main, si cette fonction retourne 0,alors j'appli 2 return d'une fonction [ par Silver360 ] Hello tout le monde!Je voulais savoir s'il est possible qu'une fonction retourne 2 paramètres ( dans le genre int int mafonction() ) ou si je dois fai que des boucles. [ par pratix ] Salut à tous.Je post mon prg cherchenbr modifié (voir sujet précédent ''int main" ).Programme compilé avec visual C++ 06. ( zéro erreur )j'ai essay arondir un float en int [ par guillaume21 ] je voudrai convertir un float en int (le cast tronque mais n'arrondi pas) sans utiliser la "bidouille" :inr i;float f;char car[6];sprintf(car,"%6.0f", Probl avec float et int [ par David2907 ] Après un calcul, comment faire pour afficher un resultat sans virgule ou un resultat avec virugule???Merci cosinus [ par anek971 ] Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.Et en faite c juste pr une verification car mon progra récursivité et factorielle!!! [ par cabarrus ] salut je veux écrire un programme qui calcule et renvoie le résultat factorielle en utilisant la récursivité de n'importe qu'elle nombre entier voici AIDEZ MOI scp problème de texture bmp avec glaux [ par progundeath ] aidez moi svp g un big problème que j'arrive pas à résoudre mais bon je ne suis qu'un newbie d'autres le résoluront en 10 secondes enfin j'espère donc


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales