Cryptage rsa

Soyez le premier à donner votre avis sur cette source.

Snippet vu 41 666 fois - Téléchargée 39 fois

Contenu du snippet

Crypte selon la méthode RSA en travaillant sur les nombres premiers...

Source / Exemple :


/*
Cryptographie
Programme principal
Version 1.1

  • /
#include <conio.h> #include <stdio.h> #include <string.h> #include <alloc.h> #include <math.h> #include <time.h> #include <stdlib.h> void menu(void); void quitter(void); void erreur(void); void menu_crypto(void); void menu_calcul(void); void pgcd(void); void choix_calcul(void); void modulo(void); void p_e_e(void); void primarite(void); void choix_crypto(void); void lecture(void); void comparer(void); unsigned long int crypt(unsigned char k,unsigned long int n,unsigned long int e); unsigned char decrypt( unsigned long int k,unsigned long int d,unsigned long int n); void crypter(void); void decrypter(void); void inscri(void); int p_e_e2(int x); void pgcd2(int a,int b,int* taille,int* tab[]); void decomp(int*s,int*q,int*r,int*k); int cle_priv(int e,int z); void pq(int* p,int* q); void decomposition(void); void main(void) { printf("\n\n\n\n\n\n\n\n\t\t\t CRYPTOGRAPHIE\n\n\n\n\n\n\n\n\n"); printf("\n\n\t\t\t version 1.0"); getch(); clrscr(); menu(); getch(); } /****************************MENU PRINCIPAL************************************/ void menu(void) { int choix=0; printf("\n\n\t\t\t ****************\n"); printf("\t\t\t *MENU PRINCIPAL*\n"); printf("\t\t\t ****************\n\n\n\n"); printf("\t TAPEZ :\n\n\n\n"); printf("\t\t1\t POUR\t UTILISER LA CRYPTOGRAPHIE\n\n"); printf("\t\t2\t POUR\t REALISER DIVERS CALCULS\n\n"); printf("\t\t3\t POUR\t QUITTER LE LOGICIEL\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : clrscr(); menu_crypto(); break; case 2 : clrscr(); menu_calcul(); break; case 3 : quitter(); break; default : erreur(); } } /***************************MENU CRYPTOGRAPHIE*********************************/ void menu_crypto(void) { int choix=0; printf("\n\n\t\t\t ********************\n"); printf("\t\t\t *MENU CRYPTOGRAPHIE*\n"); printf("\t\t\t ********************\n\n\n\n"); printf("\t TAPEZ :\n\n\n\n"); printf("\t\t1\t POUR\t VOUS INSCRIRE\n\n"); printf("\t\t2\t POUR\t CRYPTER\n\n"); printf("\t\t3\t POUR\t DECRYPTER\n\n"); printf("\t\t4\t POUR\t LIRE UN FICHIER\n\n"); printf("\t\t5\t POUR\t COMPARER 2 FICHIERS\n\n"); printf("\t\t6\t POUR\t MENU PRECEDENT\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : inscri(); break; case 2 : clrscr(); crypter(); clrscr(); choix_crypto(); break; case 3 : clrscr(); decrypter(); clrscr(); choix_crypto(); break; case 4 : clrscr(); lecture(); clrscr(); choix_crypto(); break; case 5 : clrscr(); comparer(); clrscr(); choix_crypto(); break; case 6 : clrscr(); menu(); break; default : erreur(); } } /*******************************CRYPTER****************************************/ void crypter(void) { FILE *source_crypt; FILE *res_crypt; unsigned char c; unsigned long int i=0; unsigned long int k,n,e; char nom_fichier[20]; printf("\n\n\t\t\t *********\n"); printf("\t\t\t *CRYPTER*\n"); printf("\t\t\t *********\n\n\n\n"); fflush(stdin); printf("Donner le nom du fichier source avec son extension : "); gets(nom_fichier); printf("\n\n\n\tdonner votre cle publique n : "); scanf("%d",&n); printf("\n\n\n\tdonner votre cle publique e : "); scanf("%d",&e); source_crypt=fopen(nom_fichier,"rb"); if(source_crypt==NULL) { printf("Impossible d'ouvrir le fichier source.\n"); } res_crypt=fopen("result.cry" , "wb"); if(res_crypt==NULL) { printf("Impossible d'ouvrir le fichier resultat.\n"); } clrscr(); printf("\n\n\t\tATTENDEZ SVP PENDANT LE CRYPTAGE."); while((feof(source_crypt)==0) && (fread(&c,sizeof(unsigned char),1,source_crypt)!=0)) { fseek(source_crypt,sizeof(unsigned char)*i,SEEK_SET); fread(&c,sizeof(unsigned char),1,source_crypt); k=crypt(c,n,e); fwrite(&k,sizeof(unsigned long int),1,res_crypt); i=i+1; } fclose(source_crypt); fclose(res_crypt); printf("\n\n\n\n\n\n\n\n\n\nLe cryptage de votre fichier est termine."); printf("\n\nvotre fichier crypter se nomme result.cry"); getch(); } /******************************FONCTION CRYPTAGE*******************************/ unsigned long int crypt(unsigned char k,unsigned long int n,unsigned long int e) { unsigned long int i,res=1,nbre; nbre=((unsigned long int)k); for(i=0;i<e;i++) { res = res * nbre; res=fmod(res,n); } return res; } /*******************************DECRYPTER**************************************/ void decrypter(void) { FILE *source; FILE *res_decrypt; char l; unsigned long int h=0; unsigned long int d,n; unsigned long int lect_int; char nom_fichier[20],nom_fin[20]; printf("\n\n\t\t\t ***********\n"); printf("\t\t\t *DECRYPTER*\n"); printf("\t\t\t ***********\n\n\n\n"); fflush(stdin); printf("Donner le nom du fichier avec son extension : "); gets(nom_fichier); printf("Donner le nom du fichier de destination avec son extension : "); gets(nom_fin); printf("\n\n\n\tdonner votre cle prive n : "); scanf("%d",&n); printf("\n\n\n\tdonner votre cle prive d : "); scanf("%d",&d); source=fopen(nom_fichier , "rb"); if(source==NULL) { printf("Impossible d'ouvrir le fichier a decrypter.\n"); erreur(); } res_decrypt=fopen(nom_fin , "wb"); if(res_decrypt==NULL) { printf("Impossible d'ouvrir le fichier resultat.\n"); erreur(); } clrscr(); printf("\n\n\t\tATTENDEZ SVP PENDANT LE DECRYPTAGE."); while((feof(source)==0) && (fread(&lect_int,sizeof(unsigned long int),1,source)!=0)) { fseek(source,sizeof(unsigned long int)*h,SEEK_SET); fread(&lect_int,sizeof(unsigned long int),1,source); l=decrypt(lect_int,d,n); fwrite(&l,sizeof(unsigned char),1,res_decrypt); h=h+1; } fclose(source); fclose(res_decrypt); printf("\n\n\n\n\n\n\n\n\n\nLe decryptage de votre fichier est termine."); getch(); } /****************************FONCTION DECRYPTAGE*******************************/ unsigned char decrypt(unsigned long int k,unsigned long int d,unsigned long int n) { unsigned long int i,res=1; unsigned char x; for(i=0;i<d;i++) { res=res*k; res=fmod(res,n); } x=((unsigned char)res); return x; } /********************************LECTURE***************************************/ void lecture(void) { int compteur_car; int compteur_ligne; int car_lect; FILE *fichier; char nom_fichier[20]; printf("\n\n\t\t\t**********************\n"); printf("\t\t\t*LECTURE D'UN FICHIER*\n"); printf("\t\t\t**********************\n\n\n"); fflush(stdin); printf("Donner le nom du fichier a lire (avec son extension) : "); gets(nom_fichier); fichier=fopen(nom_fichier,"r"); if(fichier==NULL) { printf("\n\nImpossible d'ouvrir le fichier a lire.\n"); } compteur_ligne=0; compteur_car=0; if(fichier!=NULL){ printf("\n\nLecture du fichier en cours.\n\n"); while((car_lect = fgetc(fichier))!=EOF) { compteur_car = compteur_car + 1; printf("%c",car_lect); if(compteur_car == 40) { compteur_car = 0; compteur_ligne = compteur_ligne + 1; } if(compteur_ligne>=17) { compteur_car = 0; compteur_ligne = 0; getch(); clrscr(); } } printf("\n\n\nLa lecture du fichier est terminee."); } fclose(fichier); getch(); } /*******************************COMPARAISON************************************/ void comparer(void) { int compt=0; int car_lect,car_lect2; FILE *fichier; FILE *fichier2; char nom_fichier[20]; char nom_fichier2[20]; printf("\n\n\t\t\t ***************************\n"); printf("\t\t\t *COMPARAISON DE 2 FICHIERS*\n"); printf("\t\t\t ***************************\n\n\n"); fflush(stdin); printf("Donner le nom du fichier source (avec son extension) : "); gets(nom_fichier); printf("Donner le nom du fichier a comparer (avec son extension) : "); gets(nom_fichier2); fichier=fopen(nom_fichier,"r"); fichier2=fopen(nom_fichier2,"r"); if(fichier==NULL) { printf("\n\nImpossible d'ouvrir le fichier source.\n"); } if(fichier2==NULL) { printf("\n\nImpossible d'ouvrir le fichier a comparer.\n"); } if((fichier!=NULL) && (fichier2!=NULL)) { printf("\n\nLecture des fichiers en cours.\n\n"); while(((car_lect = fgetc(fichier))!=EOF)&&((car_lect2 = fgetc(fichier2))!=EOF)) { if(car_lect!=car_lect2) { compt=compt+1; } } if(compt==0) { printf("\n\nLes deux fichiers sont identiques."); } else { printf("\n\nIl y a %d caracteres d'ecart.",compt); } } fclose(fichier); fclose(fichier2); getch(); } /******************************CHOIX CRYPTO************************************/ void choix_crypto(void) { int choix; printf("\n\n\n\n\t QUE SOUHAITEZ VOUS FAIRE ?\n\n\n\n\n"); printf("\t TAPEZ :\n\n\n"); printf("\t\t1\t POUR\t REVENIR AU MENU PRINCIPAL\n\n"); printf("\t\t2\t POUR\t REVENIR AU MENU CRYPTOGRAPHIE\n\n"); printf("\t\t3\t POUR\t QUITTER LE LOGICIEL\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : clrscr(); menu(); break; case 2 : clrscr(); menu_crypto(); break; case 3 : quitter(); break; default : erreur(); } } /******************************MENU CALCUL*************************************/ void menu_calcul(void) { int choix=0; printf("\n\t\t\t *************\n"); printf("\t\t\t *MENU CALCUL*\n"); printf("\t\t\t *************\n\n\n"); printf("\t TAPEZ :\n\n\n\n"); printf("\t\t1\t POUR\t CALCULER LE PGCD DE 2 NOMBRES\n\n"); printf("\t\t2\t POUR\t DECOMPOSER UN NOMBRE EN NOMBRES PREMIERS\n\n"); printf("\t\t3\t POUR\t CALCULER UN MODULO\n\n"); printf("\t\t4\t POUR\t TESTER LA PRIMARITE D'UN NOMBRE\n\n"); printf("\t\t5\t POUR\t VOIR SI 2 NOMBRES SONT PREMIERS ENTRE EUX\n"); printf("\t\t6\t POUR\t MENU PRECEDENT\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : clrscr(); pgcd(); clrscr(); choix_calcul(); break; case 2 : clrscr(); decomposition(); clrscr(); choix_calcul(); break; case 3 : clrscr(); modulo(); clrscr(); choix_calcul(); break; case 4 : clrscr(); primarite(); clrscr(); choix_calcul(); break; case 5 : clrscr(); p_e_e(); clrscr(); choix_calcul(); break; case 6 : clrscr(); menu(); break; default : erreur(); } } /*********************************CALCUL DU PGCD*******************************/ void pgcd(void) { int a,b,*reste,*s,*q; reste=(int*)malloc(sizeof(int)); //initialisation de reste s=(int*)malloc(sizeof(int)); //initialisation de s q=(int*)malloc(sizeof(int)); //initialisation de q printf("\n\n\t\t\t ****************\n"); printf("\t\t\t *CALCUL DU PGCD*\n"); printf("\t\t\t ****************\n\n\n"); printf("Donner le 1er entier : "); scanf("%d",&a); printf("\nDonner le 2eme entier : "); scanf("%d",&b);
  • s=a;
  • q=b;
  • reste=fmod(*s,*q);
while(*reste!=0 && *reste>0) {
  • s=*q;
  • q=*reste;
  • reste=fmod(*s,*q);
} printf("\nle PGCD de %d et %d est %d.",a,b,*q); getch(); } /*********************************MODULO***************************************/ void modulo(void) { int res,x,y; printf("\n\n\t\t\t ******************\n"); printf("\t\t\t *CALCUL DU MODULO*\n"); printf("\t\t\t ******************\n\n\n"); printf("\n\ncalcul de X modulo Y"); printf("\n\nDonner X : "); scanf("%d",&x); printf("\n\nDonner Y : "); scanf("%d",&y); res=fmod(x,y); printf("\n\n%d modulo %d est egal a %d.",x,y,res); getch(); } /*******************************PRIMARITE**************************************/ void primarite(void) { int x,i,taille=0; printf("\n\n\t\t\t***********************\n"); printf("\t\t\t*PRIMARITE D'UN NOMBRE*\n"); printf("\t\t\t***********************\n\n\n"); fflush(stdin); printf("Donner un entier : "); scanf("%d",&x); if(x==0 || x==1) { printf("%d n'est pas premier.",x); } else { for(i=2;i<x;i++) { if(x%i==0) { taille=taille+1; } } if(taille==0) { printf("%d est premier.",x); } else { printf("%d n'est pas premier.",x); } } getch(); } /**************************PREMIERS ENTRE EUX**********************************/ void p_e_e(void) { int a,b,*reste,*s,*q; reste=(int*)malloc(sizeof(int)); //initialisation de reste s=(int*)malloc(sizeof(int)); //initialisation de s q=(int*)malloc(sizeof(int)); //initialisation de q printf("\n\n\t\t\t ********************\n"); printf("\t\t\t *PREMIERS ENTRE EUX*\n"); printf("\t\t\t ********************\n\n\n"); printf("Donner le 1er entier : "); scanf("%d",&a); printf("\nDonner le 2eme entier : "); scanf("%d",&b);
  • s=a;
  • q=b;
  • reste=fmod(*s,*q);
while(*reste!=0 && *reste>0) {
  • s=*q;
  • q=*reste;
  • reste=fmod(*s,*q);
} if(*q==1) { printf("\n\n%d et %d sont premiers entre eux.",a,b); } else { printf("\n\n%d et %d ne sont pas premiers entre eux.",a,b); } getch(); } /****************************CHOIX CALCUL**************************************/ void choix_calcul(void) { int choix; printf("\n\n\n\n\t QUE SOUHAITEZ VOUS FAIRE ?\n\n\n\n\n"); printf("\t TAPEZ :\n\n\n"); printf("\t\t1\t POUR\t REVENIR AU MENU PRINCIPAL\n\n"); printf("\t\t2\t POUR\t REVENIR AU MENU DES CALCULS\n\n"); printf("\t\t3\t POUR\t QUITTER LE LOGICIEL\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : clrscr(); menu(); break; case 2 : clrscr(); menu_calcul(); break; case 3 : quitter(); break; default : erreur(); } } /********************************ERREUR****************************************/ void erreur(void) { int choix; printf("\nERREUR DE SAISIE."); getch(); clrscr(); printf("\n\n\n\n\t\tSOUHAITEZ VOUS REVENIR AU MENU PRINCIPAL ?\n\n\n\n\n"); printf("\t TAPEZ :\n\n\n"); printf("\t\t1\t POUR\t REVENIR AU MENU PRINCIPAL\n\n"); printf("\t\t2\t POUR\t QUITTER LE LOGICIEL\n\n\n"); printf("\t CHOIX : "); scanf("%d",&choix); switch(choix) { case 1 : clrscr(); menu(); break; case 2 : quitter(); break; default : erreur(); } } /***********************************inscription********************************/ void inscri(void) { int p,q,e,z,d,n; clrscr(); printf("\n\n\t\t\t\t*************\n"); printf("\t\t\t\t*INSCRIPTION*\n"); printf("\t\t\t\t*************\n\n\n"); pq(&p,&q); n=p*q; z=(p-1)*(q-1); e=p_e_e2(z); printf("\n\n\n\n\n\n\n\n\t( n : %d ; e : %d ) est votre cle publique.",n,e); d=cle_priv(e,z); printf("\n\n\n\n\t( n : %d ; d : %d ) est votre cle privee.",n,d); getch(); getch(); getch(); clrscr(); choix_crypto(); } /******************************************************************************/ int p_e_e2(int x) { int y,*tab[100000],*taille,rep,i; taille=(int*)malloc(sizeof(int));
  • taille=0;
for(i=0;i<100000;i++) { tab[i]=(int*)malloc(sizeof(int)); } for(y=1;y<x;y++) { pgcd2(x,y,taille,tab); } randomize(); rep=*tab[rand()%*taille]; return rep; } /******************************************************************************/ void pgcd2(int a,int b,int* taille,int* tab[]) { int *reste,*k,*s,*q; reste=(int*)malloc(sizeof(int)); k=(int*)malloc(sizeof(int)); s=(int*)malloc(sizeof(int)); q=(int*)malloc(sizeof(int));
  • s=a;
  • q=b;
  • reste=1;
decomp(s,q,reste,k); while(*reste!=0&&*reste>0) {
  • s=*q;
  • q=*reste;
decomp(s,q,reste,k); } if(*q==1) {
  • tab[*taille]=b;
  • taille=*taille+1;
} } /******************************************************************************/ void decomp(int*s,int*q,int*r,int*k) {
  • k=0;
while(*s>=*q) {
  • s=*s-*q;
  • k=*k+1;
}
  • r=*s;
} /******************************************************************************/ int cle_priv(int e,int z) { int d,i=0; while((e*i)%z!=1) { i=i+1; } d=i; return d; } /******************************************************************************/ void pq(int* p,int* q) { int t[200],i,y,j,taille=0; for (i=3;i<200;i++) { y=0; for(j=2;j<i;j++) { if(i%j==0) { y=y+1; } } if(y==0) { //printf(" %d ",i); t[taille]= i; taille=taille+1; } } randomize();
  • p=t[rand()%taille];
  • q=t[rand()%taille];
} /*************************DECOMPOSITION****************************************/ void decomposition(void) { int prem[100000],puissance[100000]; int n,o,i,j,k,compt,taille=0; printf("\n\n\t\t ***********************************\n"); printf("\t\t *DECOMPOSITION EN NOMBRES PREMIERS*\n"); printf("\t\t ***********************************\n\n\n"); printf("\nDonner 1 entier : "); scanf("%d",&n); printf("\n\n"); o=n; for(i=2;i<o+1;i++) { compt=0; for(j=2;j<i;j++) { if(i%j==0) { compt=compt+1; } } if(compt==0) { prem[taille]=i; taille=taille+1; } } for(i=0;i<taille;i++) { k=0; while(fmod(o,prem[i])==0) { o=o/prem[i]; k=k+1; puissance[i]=k; } } printf("%d =",n); for(i=0;i<taille;i++) { if(puissance[i]!=0) { printf(" (%d",prem[i]); printf("^"); printf("%d)",puissance[i]); } } getch(); } /******************************************************************************/ void quitter(void) { clrscr(); printf("\n\n\n\n\n\n\n\n\n"); printf(" * * * ****** ****** * * ****** * ****** \n"); printf(" * * * * * * * * * * * * * * \n"); printf(" ***** * * ****** *** * * * * * ****** \n"); printf(" * * * * * * * * * * * * * * \n"); printf(" * * ***** * * ****** * ****** * * * \n"); } /*************************************END**************************************/

A voir également

Ajouter un commentaire

Commentaires

tres bon code merci sa ma bien aider
beaucoup trop facile a casser la clé de cryptage
tu crypte sur un seul caractère,
ca se casse même a la main presque ....
crypte sur des portions de caractères de nombre inférieur au nombre a n
c'est pas mal fait mais j'ai
juste une petite question :
est ce que le code est si facile
que ça à casser ?? parce que je
voudrais me servir de ce type
de cryptage dans un de mes programmes

merci de me répondre et a+!!
ps: soyez objectifs sur votre jugement par rapport à la fcailité de cassage du code !!
mmuller57
Messages postés
174
Date d'inscription
mardi 10 avril 2001
Statut
Membre
Dernière intervention
30 juillet 2003
1 -
C'est cool le cryptage Rivest-Shamir-Adelman :)
cs_psycho
Messages postés
232
Date d'inscription
samedi 11 mai 2002
Statut
Membre
Dernière intervention
27 octobre 2007
-
c pas mal. On peut cependant gagner un peu de temps pour la primalité ( je ne sais pas si sa ce dit primarité, mais ne chipotons pas [8)] ), puisque la boucle que tu fais (for(i=2;i<x;i++)) est "bcp trop grande" : tu n as besoin d 'aller que jusqu à int(rac(x)) c a dire la valeur entiere de la racine carree de x...mais bon, en c++, on est plus à 3 ms près...
sinon, c un bon code.
voila....@+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.