Accueil > > > CRYPTAGE AVEC DES
CRYPTAGE AVEC DES
Information sur la source
Description
ce code à été réaliser dans 3 jous uniquement pour le but de mini projet de cryptage ce code à été présenter à issats le compilateur est BorlantC++
Source
- #include <stdio.h>
- #include <conio.h>
- #include <windows.h>
- #include <stdlib.h>
-
- char t[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};// Tableau utiliser en convertion Binaire ---> Hexadecimale
-
- //-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 64bits
- void convBinHex64 (int *b , char *h)
- {
- int *q, *a,i,j,*c1;
- char *c;
- c=(char*)malloc(16*sizeof(char));
- q=(int*)malloc(64*sizeof(int));
- a=(int*)malloc(4*sizeof(int));
- c1=(int*)malloc(1*sizeof(int));
- q=b;
- c=h;
- for(i=0;i<16;i++)
- {
- for (j=0;j<4;j++)
- *(a+j)=*(q+j+i*4);
- *c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
- *(c+i) = t[*c1];
- }
- }
-
-
-
- //-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 48 bits
- void convBinHex48 (int *b , char *h)
- {
- int *q, *a,i,j,*c1;
- char *c;
- c=(char*)malloc(12*sizeof(char));
- q=(int*)malloc(48*sizeof(int));
- a=(int*)malloc(4*sizeof(int));
- c1=(int*)malloc(1*sizeof(int));
- q=b;
- c=h;
- for(i=0;i<12;i++)
- {
- for (j=0;j<4;j++)
- *(a+j)=*(q+j+i*4);
- *c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
- *(c+i) = t[*c1];
- }
- }
-
- //-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 32bits
- void convBinHex32 (int *b , char *h)
- {
- int *q, *a,i,j,*c1;
- char *c;
- c=(char*)malloc(8*sizeof(char));
- q=(int*)malloc(32*sizeof(int));
- a=(int*)malloc(4*sizeof(int));
- c1=(int*)malloc(1*sizeof(int));
- q=b;
- c=h;
- for(i=0;i<8;i++)
- {
- for (j=0;j<4;j++)
- *(a+j)=*(q+j+i*4);
- *c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
- *(c+i) = t[*c1];
- }
- }
-
-
- //-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 28 bits
- void convBinHex28 (int *b , char *h)
- {
- int *q, *a,i,j,*c1;
- char *c;
- c=(char*)malloc(7*sizeof(char));
- q=(int*)malloc(28*sizeof(int));
- a=(int*)malloc(4*sizeof(int));
- c1=(int*)malloc(1*sizeof(int));
- q=b;
- c=h;
- for(i=0;i<7;i++)
- {
- for (j=0;j<4;j++)
- *(a+j)=*(q+j+i*4);
- *c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
- *(c+i) = t[*c1];
- }
- }
-
- //------------affiche tableau b avec l nombre de ligne et c nombre de colonne
- void affiche_tab(int *b,int l,int c)
- {int *p,*q;
- for (p=b;p<b+l*c;p+=c)
- {for (q=p;q<p+c;q++)
- printf("%d",*q);
- }
- }
-
- //------------convertion de dicimale vers binaire
- void convert (int d,int *b)
- {
- int i,j=63, *p,*q;
- int div,div2;
- for(p=b;p<b+64;p+=8)
- for(q=p;q<p+8;q++)
- *q=0;
-
- div=d;
-
- do
- {
- div2 = div / 2;
- *(b+j) =(div - div2*2);
- j--;
- div = div2;
- } while (j > 0 && div2 != 0);
- }
-
- //------------Premutation de 64bits en 56bits
- void pc1(int *a,int *b)//a de dimension 64 bits et b de dimension 56 bits
- { int *p1, *q1;
-
- p1=(int*)malloc(64*sizeof(int));
- q1=(int*)malloc(56*sizeof(int));
- p1=a;q1=b;
-
- *q1=*(p1+56);*(q1+1)=*(p1+48);*(q1+2)=*(p1+40);*(q1+3)=*(p1+32);*(q1+4)=*(p1+24);*(q1+5)=*(p1+16);*(q1+6)=*(p1+8);
- *(q1+7)=*(p1);*(q1+8)=*(p1+57);*(q1+9)=*(p1+49);*(q1+10)=*(p1+41);*(q1+11)=*(p1+33);*(q1+12)=*(p1+25);*(q1+13)=*(p1+17);
- *(q1+14)=*(p1+9);*(q1+15)=*(p1+1);*(q1+16)=*(p1+58);*(q1+17)=*(p1+50);*(q1+18)=*(p1+42);*(q1+19)=*(p1+34);*(q1+20)=*(p1+26);
- *(q1+21)=*(p1+18);*(q1+22)=*(p1+10);*(q1+23)=*(p1+2);*(q1+24)=*(p1+59);*(q1+25)=*(p1+51);*(q1+26)=*(p1+43);*(q1+27)=*(p1+35);
- *(q1+28)=*(p1+62);*(q1+29)=*(p1+54);*(q1+30)=*(p1+46);*(q1+31)=*(p1+38);*(q1+32)=*(p1+30);*(q1+33)=*(p1+22);*(q1+34)=*(p1+14);
- *(q1+35)=*(p1+6);*(q1+36)=*(p1+61);*(q1+37)=*(p1+53);*(q1+38)=*(p1+45);*(q1+39)=*(p1+37);*(q1+40)=*(p1+29);*(q1+41)=*(p1+21);
- *(q1+42)=*(p1+13);*(q1+43)=*(p1+5);*(q1+44)=*(p1+60);*(q1+45)=*(p1+52);*(q1+46)=*(p1+44);*(q1+47)=*(p1+36);*(q1+48)=*(p1+28);
- *(q1+49)=*(p1+20);*(q1+50)=*(p1+12);*(q1+51)=*(p1+4);*(q1+52)=*(p1+27);*(q1+53)=*(p1+19);*(q1+54)=*(p1+11);*(q1+55)=*(p1+3);
-
- }
-
- //-------------Permutation de 56bits en 48 bits
- void pc2(int *a,int *b) //a de dimension 56 et b de dimension 48
- { int *p, *q;
-
- p=(int*)malloc(56*sizeof(int));
- q=(int*)malloc(48*sizeof(int));
- p=a;q=b;
- *q=*(p+13); *(q+1)=*(p+16);*(q+2)=*(p+10);*(q+3)=*(p+23);*(q+4)=*p;*(q+5)=*(p+4);
- *(q+6)=*(p+2); *(q+7)=*(p+27);*(q+8)=*(p+14);*(q+9)=*(p+5);*(q+10)=*(p+20);*(q+11)=*(p+9);
- *(q+12)=*(p+22);*(q+13)=*(p+18);*(q+14)=*(p+11);*(q+15)=*(p+3);*(q+16)=*(p+25);*(q+17)=*(p+7);
- *(q+18)=*(p+15);*(q+19)=*(p+6);*(q+20)=*(p+26);*(q+21)=*(p+19);*(q+22)=*(p+12);*(q+23)=*(p+1);
- *(q+24)=*(p+40);*(q+25)=*(p+51);*(q+26)=*(p+30);*(q+27)=*(p+36);*(q+28)=*(p+46);*(q+29)=*(p+54);
- *(q+30)=*(p+29);*(q+31)=*(p+39);*(q+32)=*(p+50);*(q+33)=*(p+44);*(q+34)=*(p+32);*(q+35)=*(p+47);
- *(q+36)=*(p+43);*(q+37)=*(p+48);*(q+38)=*(p+38);*(q+39)=*(p+55);*(q+40)=*(p+33);*(q+41)=*(p+52);
- *(q+42)=*(p+45);*(q+43)=*(p+41);*(q+44)=*(p+49);*(q+45)=*(p+35);*(q+46)=*(p+28);*(q+47)=*(p+31);
- }
-
- //--------------------permet d'avoir 48bits à partir de 32 bits
- void expansion(int *b,int *a) //a de dimension 32 b de dimension 48
- { int *p2, *q2;
-
- p2=(int*)malloc(32*sizeof(int));
- q2=(int*)malloc(48*sizeof(int));
-
- p2=b;q2=a;
-
- *q2=*(p2+31);*(q2+1)=*(p2+0);*(q2+2)=*(p2+1);*(q2+3)=*(p2+2);*(q2+4)=*(p2+3);*(q2+5)=*(p2+4);
- *(q2+6)=*(p2+3);*(q2+7)=*(p2+4);*(q2+8)=*(p2+5);*(q2+9)=*(p2+6);*(q2+10)=*(p2+7);*(q2+11)=*(p2+8);
- *(q2+12)=*(p2+7);*(q2+13)=*(p2+8);*(q2+14)=*(p2+9);*(q2+15)=*(p2+10);*(q2+16)=*(p2+11);*(q2+17)=*(p2+12);
- *(q2+18)=*(p2+11);*(q2+19)=*(p2+12);*(q2+20)=*(p2+13);*(q2+21)=*(p2+14);*(q2+22)=*(p2+15);*(q2+23)=*(p2+16);
- *(q2+24)=*(p2+15);*(q2+25)=*(p2+16);*(q2+26)=*(p2+17);*(q2+27)=*(p2+18);*(q2+28)=*(p2+19);*(q2+29)=*(p2+20);
- *(q2+30)=*(p2+19);*(q2+31)=*(p2+20);*(q2+32)=*(p2+21);*(q2+33)=*(p2+22);*(q2+34)=*(p2+23);*(q2+35)=*(p2+24);
- *(q2+36)=*(p2+23);*(q2+37)=*(p2+24);*(q2+38)=*(p2+25);*(q2+39)=*(p2+26);*(q2+40)=*(p2+27);*(q2+41)=*(p2+28);
- *(q2+42)=*(p2+27);*(q2+43)=*(p2+28);*(q2+44)=*(p2+29);*(q2+45)=*(p2+30);*(q2+46)=*(p2+31);*(q2+47)=*p2;
-
-
- }
-
- //---------------------permet diviser les 48 bits de cles divercifier en deux tableaux de 28 bits
- void division (int *b ,int *g, int *d, int n)
- {
- int *a, *p,*q;
- a=b;
- p=g;
- q=d;
- for (p=g; p<g+n; p++)
- {
- *p=*a;
- a++;
- }
- a= b+n;
- for (q=d; q<d+n; q++)
- {
- *q=*a;
- a++;
- }
- }
-
- //---------------permet la rotation vers le gauche de tableau a en fonction de son tour r
- void rotation ( int *a, int r)// a est de dimension 28 et r est le nombre de tour du clé
- {
- int *p, aux;
- p= a;
- aux = *p;
- for ( p=a ;p<a+27 ; p++)
- {
- *p=*(p+1);
- }
- *(a+27)= aux;
- if ((r!= 1)&&(r!= 2)&&(r!= 9)&&(r!= 16))
- {
- p= a;
- aux = *p;
- for ( p=a ;p<a+27 ; p++)
- {
- *p=*(p+1);
- }
- *(a+27)= aux;
- }
- }
-
-
-
- //////////////////////////////////////FONCTION DE GENERATION DU CLES///////////////
- //-----------Permet de générer les cles utiliser pour le chiffrement
- void generation (int *b, int *cles,int ronde,int etat) // cles table contenant les 16 cles; si etat=1, on va afficher les itirations
- {
- int i,j,k,*p,*q,*t,*a,*g,*d,*n, t1[56];
- char *aff_hex,*aff_hex1;
-
- p=cles;
- g=(int*)malloc(28*sizeof(int));
- aff_hex=(char*)malloc(7*sizeof(char));
- aff_hex1=(char*)malloc(13*sizeof(char));
- d=(int*)malloc(28*sizeof(int));
- t=(int*)malloc(56*sizeof(int));
- q=(int*)malloc(56*sizeof(int));
- a=(int*)malloc(48*sizeof(int));
- n=(int*)malloc(48*sizeof(int));
- //ronde=(int*)malloc(1*sizeof(int));
-
- pc1 (b,t);// t est de 56 bits
-
- division (t,g,d,28);
- if (etat==1)
- {
- printf ("-----------------------------------------------------\n");
- printf ("C0: ");
- affiche_tab(g,1,28);
- convBinHex28(g,aff_hex);
- printf (" = ");
- puts (aff_hex);
- printf ("D0: ");
- affiche_tab(d,1,28);
- convBinHex28(d,aff_hex);
- printf (" = ");
- puts (aff_hex);
- printf ("-----------------------------------------------------\n");
- }
- for (i=1; i<=ronde;i++)
- {
- rotation(g,i);
- rotation(d,i);
- if (etat==1)
- {
- printf ("C%d: ",i);
- affiche_tab(g,1,28);
- convBinHex28(g,aff_hex);
- printf (" = ");
- puts (aff_hex);
- printf ("D%d: ",i);
- affiche_tab(d,1,28);
- convBinHex28(d,aff_hex);
- printf (" = ");
- puts (aff_hex);
- }
- k=0;
- for (j=0;j<56;j++)
- {
- if (j<28)
- t1[j]=*(g+j);
- else
- {
- t1[j]=*(d+k);
- k++ ;
- } }
- q=t1;
- pc2 (q,a);// a est 48 bits
- n=a;
- int y;
- for(n=a;n<a+48;n++)
- {
- *p=*n;
- p++;
- }
- if (etat==1)
- {
- printf ("K%d: ",i);
- affiche_tab(a,1,48);
- convBinHex48(a,aff_hex1);
- printf (" = ");
- puts(aff_hex1);
- printf ("\n-----------------------------------------------------\n");
- }
- }
- if (etat==1)
- printf ("les iterations de cles sont termines........\n");
- }
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //------------Permutation initiale de bloc de 64bits
- void pi(int *a,int *b)//a de dimension 64 bits permutation initiale
- { int *p, *q;
-
- p=(int*)malloc(64*sizeof(int));
- q=(int*)malloc(64*sizeof(int));
- p=a;q=b;
-
- *q=*(p+57);*(q+1)=*(p+49);*(q+2)=*(p+41);*(q+3)=*(p+33);*(q+4)=*(p+25);*(q+5)=*(p+17);*(q+6)=*(p+9);*(q+7)=*(p+1);
- *(q+8)=*(p+59);*(q+9)=*(p+51);*(q+10)=*(p+43);*(q+11)=*(p+35);*(q+12)=*(p+27);*(q+13)=*(p+19);*(q+14)=*(p+11);*(q+15)=*(p+3);
- *(q+16)=*(p+61);*(q+17)=*(p+53);*(q+18)=*(p+45);*(q+19)=*(p+37);*(q+20)=*(p+29);*(q+21)=*(p+21);*(q+22)=*(p+13);*(q+23)=*(p+5);
- *(q+24)=*(p+63);*(q+25)=*(p+55);*(q+26)=*(p+47);*(q+27)=*(p+39);*(q+28)=*(p+31);*(q+29)=*(p+23);*(q+30)=*(p+15);*(q+31)=*(p+7);
- *(q+32)=*(p+56);*(q+33)=*(p+48);*(q+34)=*(p+40);*(q+35)=*(p+32);*(q+36)=*(p+24);*(q+37)=*(p+16);*(q+38)=*(p+8);*(q+39)=*(p+0);
- *(q+40)=*(p+58);*(q+41)=*(p+50);*(q+42)=*(p+42);*(q+43)=*(p+34);*(q+44)=*(p+26);*(q+45)=*(p+18);*(q+46)=*(p+10);*(q+47)=*(p+2);
- *(q+48)=*(p+60);*(q+49)=*(p+52);*(q+50)=*(p+44);*(q+51)=*(p+36);*(q+52)=*(p+28);*(q+53)=*(p+20);*(q+54)=*(p+12);*(q+55)=*(p+4);
- *(q+56)=*(p+62);*(q+57)=*(p+54);*(q+58)=*(p+46);*(q+59)=*(p+38);*(q+60)=*(p+30);*(q+61)=*(p+22);*(q+62)=*(p+14);*(q+63)=*(p+6);
- }
- //------------Permutation finale de bloc de 64bits
- void pf(int *a,int *b)//a de dimension 64 bits permutation FINALE
- { int *p, *q;
-
- p=(int*)malloc(64*sizeof(int));
- q=(int*)malloc(64*sizeof(int));
- p=a;q=b;
-
- *q=*(p+39); *(q+1)=*(p+7); *(q+2)=*(p+47);*(q+3)=*(p+15);*(q+4)=*(p+55);*(q+5)=*(p+23);*(q+6)=*(p+63);*(q+7)=*(p+31);
- *(q+8)=*(p+38); *(q+9)=*(p+6); *(q+10)=*(p+46);*(q+11)=*(p+14);*(q+12)=*(p+54);*(q+13)=*(p+22);*(q+14)=*(p+62);*(q+15)=*(p+30);
- *(q+16)=*(p+37);*(q+17)=*(p+5); *(q+18)=*(p+45);*(q+19)=*(p+13);*(q+20)=*(p+53);*(q+21)=*(p+21);*(q+22)=*(p+61);*(q+23)=*(p+29);
- *(q+24)=*(p+36);*(q+25)=*(p+4); *(q+26)=*(p+44);*(q+27)=*(p+12);*(q+28)=*(p+52);*(q+29)=*(p+20);*(q+30)=*(p+60);*(q+31)=*(p+28);
- *(q+32)=*(p+35);*(q+33)=*(p+3); *(q+34)=*(p+43);*(q+35)=*(p+11);*(q+36)=*(p+51);*(q+37)=*(p+19);*(q+38)=*(p+59);*(q+39)=*(p+27);
- *(q+40)=*(p+34);*(q+41)=*(p+2); *(q+42)=*(p+42);*(q+43)=*(p+10);*(q+44)=*(p+50);*(q+45)=*(p+18);*(q+46)=*(p+58);*(q+47)=*(p+26);
- *(q+48)=*(p+33);*(q+49)=*(p+1); *(q+50)=*(p+41);*(q+51)=*(p+9);*(q+52)=*(p+49);*(q+53)=*(p+17);*(q+54)=*(p+57);*(q+55)=*(p+25);
- *(q+56)=*(p+32);*(q+57)=*(p+0); *(q+58)=*(p+40);*(q+59)=*(p+8);*(q+60)=*(p+48);*(q+61)=*(p+16);*(q+62)=*(p+56);*(q+63)=*(p+24);
- }
-
- //----------permet la permutation de la résultat de s-box
- void pp(int *a,int *b)//a de dimension 32 bits permutation p
- { int *p, *q;
-
- p=(int*)malloc(32*sizeof(int));
- q=(int*)malloc(32*sizeof(int));
- p=a;
- q=b;
-
-
- *q=*(p+15); *(q+1)=*(p+6); *(q+2)=*(p+19); *(q+3)=*(p+20);
- *(q+4)=*(p+28); *(q+5)=*(p+11); *(q+6)=*(p+27); *(q+7)=*(p+16);
- *(q+8)=*p; *(q+9)=*(p+14); *(q+10)=*(p+22); *(q+11)=*(p+25);
- *(q+12)=*(p+4); *(q+13)=*(p+17); *(q+14)=*(p+30); *(q+15)=*(p+9);
- *(q+16)=*(p+1); *(q+17)=*(p+7); *(q+18)=*(p+23); *(q+19)=*(p+13);
- *(q+20)=*(p+31); *(q+21)=*(p+26); *(q+22)=*(p+2); *(q+23)=*(p+8);
- *(q+24)=*(p+18); *(q+25)=*(p+12); *(q+26)=*(p+29); *(q+27)=*(p+5);
- *(q+28)=*(p+21); *(q+29)=*(p+10); *(q+30)=*(p+3); *(q+31)=*(p+24);
- }
-
- //-----------------convertir de binaire à la base dicimale
- void convertBinDec (int *a, int *l , int *c )// a est de 6 bits
- {
- *l= *(a+5)+*a*2;
- *c= *(a+4)+*(a+3)*2+*(a+2)*4+*(a+1)*8;
- }
-
- //--------------------permet d'avoir 32 bits à partir de 48bits
- void s_box(int *a ,int *b)// a de 48 et b de 32
- {
- int s1[4][16],s2[4][16],s8[4][16],s3[4][16],s4[4][16],s5[4][16],s6[4][16],s7[4][16];
- int s,i,k,j, *h,*p,*q,*r,*l,*c;
- p=(int*)malloc(48*sizeof(int));
- q=(int*)malloc(6*sizeof(int));
- h=(int*)malloc(48*sizeof(int));
- r=(int*)malloc(64*sizeof(int));
- l=(int*)malloc(1*sizeof(int));
- c=(int*)malloc(1*sizeof(int));
-
- s1[0][0]=14; s1[0][1]=4; s1[0][2]=13; s1[0][3]=1; s1[0][4]=2; s1[0][5]=15; s1[0][6]=11; s1[0][7]=8; s1[0][8]=3; s1[0][9]=10; s1[0][10]=6; s1[0][11]=12; s1[0][12]=5; s1[0][13]=9; s1[0][14]=0; s1[0][15]=7;
- s1[1][0]=0; s1[1][1]=15; s1[1][2]=7; s1[1][3]=4; s1[1][4]=14; s1[1][5]=2; s1[1][6]=13; s1[1][7]=1; s1[1][8]=10; s1[1][9]=6; s1[1][10]=12; s1[1][11]=11; s1[1][12]=9; s1[1][13]=5; s1[1][14]=3; s1[1][15]=8;
- s1[2][0]=4; s1[2][1]=1; s1[2][2]=14; s1[2][3]=8; s1[2][4]=13; s1[2][5]=6; s1[2][6]=2; s1[2][7]=11; s1[2][8]=15; s1[2][9]=12; s1[2][10]=9; s1[2][11]=7; s1[2][12]=3; s1[2][13]=10; s1[2][14]=5; s1[2][15]=0;
- s1[3][0]=15; s1[3][1]=12; s1[3][2]=8; s1[3][3]=2; s1[3][4]=4; s1[3][5]=9; s1[3][6]=1; s1[3][7]=7; s1[3][8]=5; s1[3][9]=11; s1[3][10]=3; s1[3][11]=14; s1[3][12]=10; s1[3][13]=0; s1[3][14]=6; s1[3][15]=13;
-
- s2[0][0]=15; s2[0][1]=1; s2[0][2]=8; s2[0][3]=14; s2[0][4]=6; s2[0][5]=11; s2[0][6]=3; s2[0][7]=4; s2[0][8]=9; s2[0][9]=7; s2[0][10]=2; s2[0][11]=13; s2[0][12]=12; s2[0][13]=0; s2[0][14]=5; s2[0][15]=10;
- s2[1][0]=3; s2[1][1]=13; s2[1][2]=4; s2[1][3]=7; s2[1][4]=15; s2[1][5]=2; s2[1][6]=8; s2[1][7]=14; s2[1][8]=12; s2[1][9]=0; s2[1][10]=1; s2[1][11]=10; s2[1][12]=6; s2[1][13]=9; s2[1][14]=11; s2[1][15]=5;
- s2[2][0]=0; s2[2][1]=14; s2[2][2]=7; s2[2][3]=11; s2[2][4]=10; s2[2][5]=4; s2[2][6]=13; s2[2][7]=1; s2[2][8]=5; s2[2][9]=8; s2[2][10]=12; s2[2][11]=6; s2[2][12]=9; s2[2][13]=3; s2[2][14]=2; s2[2][15]=15;
- s2[3][0]=13; s2[3][1]=8; s2[3][2]=10; s2[3][3]=1; s2[3][4]=3; s2[3][5]=15; s2[3][6]=4; s2[3][7]=2; s2[3][8]=11; s2[3][9]=6; s2[3][10]=7; s2[3][11]=12; s2[3][12]=0; s2[3][13]=5; s2[3][14]=14; s2[3][15]=9;
-
- s3[0][0]=10; s3[0][1]=0; s3[0][2]=9; s3[0][3]=14; s3[0][4]=6; s3[0][5]=3; s3[0][6]=15; s3[0][7]=5; s3[0][8]=1; s3[0][9]=13; s3[0][10]=12; s3[0][11]=7; s3[0][12]=11; s3[0][13]=4; s3[0][14]=2; s3[0][15]=8;
- s3[1][0]=13; s3[1][1]=7; s3[1][2]=0; s3[1][3]=9; s3[1][4]=3; s3[1][5]=4; s3[1][6]=6; s3[1][7]=10; s3[1][8]=2; s3[1][9]=8; s3[1][10]=5; s3[1][11]=14; s3[1][12]=12; s3[1][13]=11; s3[1][14]=15; s3[1][15]=1;
- s3[2][0]=13; s3[2][1]=6; s3[2][2]=4; s3[2][3]=9; s3[2][4]=8; s3[2][5]=15; s3[2][6]=3; s3[2][7]=0; s3[2][8]=11; s3[2][9]=1; s3[2][10]=2; s3[2][11]=12; s3[2][12]=5; s3[2][13]=10; s3[2][14]=14; s3[2][15]=7;
- s3[3][0]=1; s3[3][1]=10; s3[3][2]=13; s3[3][3]=0; s3[3][4]=6; s3[3][5]=9; s3[3][6]=8; s3[3][7]=7; s3[3][8]=4; s3[3][9]=15; s3[3][10]=14; s3[3][11]=3; s3[3][12]=11; s3[3][13]=5; s3[3][14]=2; s3[3][15]=12;
-
- s4[0][0]=7; s4[0][1]=13; s4[0][2]=14; s4[0][3]=3; s4[0][4]=0; s4[0][5]=6; s4[0][6]=9; s4[0][7]=10; s4[0][8]=1; s4[0][9]=2; s4[0][10]=8; s4[0][11]=5; s4[0][12]=11; s4[0][13]=12; s4[0][14]=4; s4[0][15]=15;
- s4[1][0]=13; s4[1][1]=8; s4[1][2]=11; s4[1][3]=5; s4[1][4]=6; s4[1][5]=15; s4[1][6]=0; s4[1][7]=3; s4[1][8]=4; s4[1][9]=7; s4[1][10]=2; s4[1][11]=12; s4[1][12]=1; s4[1][13]=10; s4[1][14]=14; s4[1][15]=9;
- s4[2][0]=10; s4[2][1]=6; s4[2][2]=9; s4[2][3]=0; s4[2][4]=12; s4[2][5]=11; s4[2][6]=7; s4[2][7]=13; s4[2][8]=15; s4[2][9]=1; s4[2][10]=3; s4[2][11]=14; s4[2][12]=5; s4[2][13]=2; s4[2][14]=8; s4[2][15]=4;
- s4[3][0]=3; s4[3][1]=15; s4[3][2]=0; s4[3][3]=6; s4[3][4]=10; s4[3][5]=1; s4[3][6]=13; s4[3][7]=8; s4[3][8]=9; s4[3][9]=4; s4[3][10]=5; s4[3][11]=11; s4[3][12]=12; s4[3][13]=7; s4[3][14]=2; s4[3][15]=14;
-
- s5[0][0]=2; s5[0][1]=12; s5[0][2]=4; s5[0][3]=1; s5[0][4]=7; s5[0][5]=10; s5[0][6]=11; s5[0][7]=6; s5[0][8]=8; s5[0][9]=5; s5[0][10]=3; s5[0][11]=15; s5[0][12]=13; s5[0][13]=0; s5[0][14]=14; s5[0][15]=9;
- s5[1][0]=14; s5[1][1]=11; s5[1][2]=2; s5[1][3]=12; s5[1][4]=4; s5[1][5]=7; s5[1][6]=13; s5[1][7]=1; s5[1][8]=5; s5[1][9]=0; s5[1][10]=15; s5[1][11]=10; s5[1][12]=3; s5[1][13]=9; s5[1][14]=8; s5[1][15]=6;
- s5[2][0]=4; s5[2][1]=2; s5[2][2]=1; s5[2][3]=11; s5[2][4]=10; s5[2][5]=13; s5[2][6]=7; s5[2][7]=8; s5[2][8]=15; s5[2][9]=9; s5[2][10]=12; s5[2][11]=5; s5[2][12]=6; s5[2][13]=3; s5[2][14]=0; s5[2][15]=14;
- s5[3][0]=11; s5[3][1]=8; s5[3][2]=12; s5[3][3]=7; s5[3][4]=1; s5[3][5]=14; s5[3][6]=2; s5[3][7]=13; s5[3][8]=6; s5[3][9]=15; s5[3][10]=0; s5[3][11]=9; s5[3][12]=10; s5[3][13]=4; s5[3][14]=5; s5[3][15]=3;
-
- s6[0][0]=12; s6[0][1]=1; s6[0][2]=10; s6[0][3]=15; s6[0][4]=9; s6[0][5]=2; s6[0][6]=6; s6[0][7]=8; s6[0][8]=0; s6[0][9]=13; s6[0][10]=3; s6[0][11]=4; s6[0][12]=14; s6[0][13]=7; s6[0][14]=5; s6[0][15]=11;
- s6[1][0]=10; s6[1][1]=15; s6[1][2]=4; s6[1][3]=2; s6[1][4]=7; s6[1][5]=12; s6[1][6]=9; s6[1][7]=5; s6[1][8]=6; s6[1][9]=1; s6[1][10]=13; s6[1][11]=14; s6[1][12]=0; s6[1][13]=11; s6[1][14]=3; s6[1][15]=8;
- s6[2][0]=9; s6[2][1]=14; s6[2][2]=15; s6[2][3]=5; s6[2][4]=2; s6[2][5]=8; s6[2][6]=12; s6[2][7]=3; s6[2][8]=7; s6[2][9]=0; s6[2][10]=4; s6[2][11]=10; s6[2][12]=1; s6[2][13]=13; s6[2][14]=11; s6[2][15]=6;
- s6[3][0]=4; s6[3][1]=3; s6[3][2]=2; s6[3][3]=12; s6[3][4]=9; s6[3][5]=5; s6[3][6]=15; s6[3][7]=10; s6[3][8]=11; s6[3][9]=14; s6[3][10]=1; s6[3][11]=7; s6[3][12]=6; s6[3][13]=0; s6[3][14]=8; s6[3][15]=13;
-
- s7[0][0]=4; s7[0][1]=11; s7[0][2]=2; s7[0][3]=14; s7[0][4]=15; s7[0][5]=0; s7[0][6]=8; s7[0][7]=13; s7[0][8]=3; s7[0][9]=12; s7[0][10]=9; s7[0][11]=7; s7[0][12]=5; s7[0][13]=10; s7[0][14]=6; s7[0][15]=1;
- s7[1][0]=13; s7[1][1]=0; s7[1][2]=11; s7[1][3]=7; s7[1][4]=4; s7[1][5]=9; s7[1][6]=1; s7[1][7]=10; s7[1][8]=14; s7[1][9]=3; s7[1][10]=5; s7[1][11]=12; s7[1][12]=2; s7[1][13]=15; s7[1][14]=8; s7[1][15]=6;
- s7[2][0]=1; s7[2][1]=4; s7[2][2]=11; s7[2][3]=13; s7[2][4]=12; s7[2][5]=3; s7[2][6]=7; s7[2][7]=14; s7[2][8]=10; s7[2][9]=15; s7[2][10]=6; s7[2][11]=8; s7[2][12]=0; s7[2][13]=5; s7[2][14]=9; s7[2][15]=2;
- s7[3][0]=6; s7[3][1]=11; s7[3][2]=13; s7[3][3]=8; s7[3][4]=1; s7[3][5]=4; s7[3][6]=10; s7[3][7]=7; s7[3][8]=9; s7[3][9]=5; s7[3][10]=0; s7[3][11]=15; s7[3][12]=14; s7[3][13]=2; s7[3][14]=3; s7[3][15]=12;
-
- s8[0][0]=13; s8[0][1]=2; s8[0][2]=8; s8[0][3]=4; s8[0][4]=6; s8[0][5]=15; s8[0][6]=11; s8[0][7]=1; s8[0][8]=10; s8[0][9]=9; s8[0][10]=3; s8[0][11]=14; s8[0][12]=5; s8[0][13]=0; s8[0][14]=12; s8[0][15]=7;
- s8[1][0]=1; s8[1][1]=15; s8[1][2]=13; s8[1][3]=8; s8[1][4]=10; s8[1][5]=3; s8[1][6]=7; s8[1][7]=4; s8[1][8]=12; s8[1][9]=5; s8[1][10]=6; s8[1][11]=11; s8[1][12]=0; s8[1][13]=14; s8[1][14]=9; s8[1][15]=2;
- s8[2][0]=7; s8[2][1]=11; s8[2][2]=4; s8[2][3]=1; s8[2][4]=9; s8[2][5]=12; s8[2][6]=14; s8[2][7]=2; s8[2][8]=0; s8[2][9]=6; s8[2][10]=10; s8[2][11]=13; s8[2][12]=15; s8[2][13]=3; s8[2][14]=5; s8[2][15]=8;
- s8[3][0]=2; s8[3][1]=1; s8[3][2]=14; s8[3][3]=7; s8[3][4]=4; s8[3][5]=10; s8[3][6]=8; s8[3][7]=13; s8[3][8]=15; s8[3][9]=12; s8[3][10]=9; s8[3][11]=10; s8[3][12]=3; s8[3][13]=5; s8[3][14]=6; s8[3][15]=11;
- h=b;
- s=0 ;
- i=60;
- ///////////////////
- //for (q=a;q<a+6;q++)
- for (j=0;j<6;j++)
- {
- *(q+j)=*(a+j);
- }
- convertBinDec(q,l,c);
- convert (s1[*l][*c],r);
-
-
- for (s=0;s<4;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
- ////////////////////
-
- i=60;
- k=0;
-
- ///////////////////
- for (j=6;j<12;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s2[*l][*c],r);
-
-
-
- for (s=4;s<8;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
- ////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=12;j<18;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s3[*l][*c],r);
-
-
- for (s=8;s<12;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
- ////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=18;j<24;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s4[*l][*c],r);
- for (s=12;s<16;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
-
- ////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=24;j<30;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s5[*l][*c],r);
- for (s=16;s<20;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
- ////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=30;j<36;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s6[*l][*c],r);
- for (s=20;s<24;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
-
- ////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=36;j<42;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s7[*l][*c],r);
- for (s=24;s<28;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
- ////////////////////////
- i=60;
- k=0;
- ///////////////////
- for (j=42;j<48;j++)
- {
- *(q+k)=*(a+j);
- k++;
- }
- convertBinDec(q,l,c);
- convert (s8[*l][*c],r);
- for (s=28;s<32;s++)
- {
- *(h+s)=*(r+i);
- i++;
- }
- ////////////////////
-
- }
-
- //------------retourne la foncion xor entre deux bits
- int xor (int a, int b)
- {
- if (a==b)
- return 0;
- else
- return 1;
- }
-
- //------------------mettre le resultat de la fonction xor entre les deux tables texte et cles dans resultat
- void exor (int *texte , int *cles, int *resultat, int n)// tous de n bits
- {
- int *p,*q,*v,i;
- p=(int*)malloc(n*sizeof(int));
- q=(int*)malloc(n*sizeof(int));
- v=(int*)malloc(n*sizeof(int));
- p=texte;
- q=cles;
- v=resultat;
- for (i=0; i<n;i++)
- *(v+i)=xor(*(p+i),*(q+i));
- }
-
- //-------------fonction ff permet de combiner la partie droite de texte avec le cles divercifier
- //etat(1:affiche les iteration, 0:donner le resultat directement)
- void ff(int *texte,int *cles,int *resultat,int etat)// texte de 32 bits cles de 48 bits resultat 32 bits
- {
- int *p,*q,*texte48,*r,*rr;
- char *aff_hex,*aff_hex1,*aff_hex2,*aff_hex3;
- aff_hex=(char*)malloc(13*sizeof(char));
- aff_hex1=(char*)malloc(13*sizeof(char));
- aff_hex2=(char*)malloc(13*sizeof(char));
- aff_hex3=(char*)malloc(8*sizeof(char));
- r=(int*)malloc(48*sizeof(int));
- rr=(int*)malloc(32*sizeof(int));
- texte48=(int*)malloc(49*sizeof(int));
- p=(int*)malloc(48*sizeof(int));
- q=(int*)malloc(48*sizeof(int));
-
- expansion(texte,texte48);
-
- exor(texte48,cles,r,48);
-
- s_box(r,rr);
-
- pp(rr,resultat);
-
- if ( etat == 1)
- {
- printf(" E(A) :");
- affiche_tab(texte48,1,48);
- convBinHex48(texte48,aff_hex);
- printf (" = ");
- puts (aff_hex);
-
- printf(" J :");
- affiche_tab(cles,1,48);
- convBinHex48(cles,aff_hex1);
- printf (" = ");
- puts (aff_hex1);
-
- printf(" E(A)+J :");
- affiche_tab(r,1,48);
- convBinHex48(r,aff_hex2);
- printf (" = ");
- puts (aff_hex2);
-
- printf(" C :");
- affiche_tab(rr,1,32);
-
- convBinHex32(rr,aff_hex3);
- printf (" = ");
- puts (aff_hex3);
- printf("\n");
- printf ("\n-----------------------------------------------------\n");
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////////////////////////////////
- //---------------fonction globale qui permet de crypte le texte donner en parametre en utilisant le cles
- //le resutat est envoyer en tcrypte. mode (DES ou DEA),ronde(nombre de ronde),etat(1:affiche les iteration, 0:donner le resultat directement)
- void cryptage(int *texte,int *cles,int *tcrypte, int mode, int ronde,int etat)
- {
- int mod,*t2,*cles2,i,*aux,*cles1,j,*r,*rr,*bloc,k=0,*gauche,*droite;
- char *aff_hex, *aff_hex1,*aff_hex5, *aff_hex11, *aff_hex3, *aff_hex55;
- mod=1;
- aff_hex=(char*)malloc(8*sizeof(char));
- aff_hex1=(char*)malloc(8*sizeof(char));
- aff_hex5=(char*)malloc(8*sizeof(char));
- aff_hex11=(char*)malloc(8*sizeof(char));
- aff_hex3=(char*)malloc(32*sizeof(char));
- aff_hex55=(char*)malloc(32*sizeof(char));
- t2=(int*)malloc(64*sizeof(int));
- bloc=(int*)malloc(64*sizeof(int));
- gauche=(int*)malloc(33*sizeof(int));
- droite=(int*)malloc(33*sizeof(int));
- cles2=(int*)malloc(48*sizeof(int));
- aux=(int*)malloc(49*sizeof(int));
- rr=(int*)malloc(49*sizeof(int));
- r=(int*)malloc(32*sizeof(int));
- cles1=(int*)malloc(48*16*sizeof(int));
-
-
- generation(cles,cles1,ronde,etat); //cles1 est de dimension 16*48
-
-
- if (mode == 1)
- {
- pi(texte,t2);
- }
-
- else
- {
- for (j=0;j<64;j++)
- *(t2+j)=*(texte+j);
- }
-
- division(t2,gauche,droite,32);
-
- if (etat == 1)
- {
- printf ("\n-----------------------------------------------------\n");
- printf ("L0 :");
- affiche_tab(gauche,1,32);
- convBinHex32(gauche,aff_hex3);
- printf (" = ");
- puts (aff_hex3);
- printf ("\n");
- printf ("R0 :");
- affiche_tab(droite,1,32);
- convBinHex32(droite,aff_hex55);
- printf (" = ");
- puts (aff_hex55);
- printf("\n");
- }
- for(i=0;i<ronde;i++)
- {
- for(j=0;j<32;j++)
- *(aux+j)=*(droite+j);
- for(j=0;j<48;j++)
- *(cles2+j)=*(cles1+j+i*48);
-
- ff(droite,cles2,r,etat);
- exor(r,gauche,rr,32);
-
- for(j=0;j<32;j++)
- {
- *(droite+j)=*(rr+j);
- *(gauche+j)=*(aux+j);
- }
- if (etat == 1)
- {
- printf ("L%d :",i+1);
- affiche_tab(gauche,1,32);
- convBinHex32(gauche,aff_hex3);
- printf (" = ");
- puts (aff_hex3);
- printf ("R%d :",i+1);
- affiche_tab(droite,1,32);
- convBinHex32(droite,aff_hex55);
- printf (" = ");
- puts (aff_hex55);
- printf("\n");
- }
- }
- k=0;
- for (j=0;j<64;j++)
- {
- if (j<32)
- *(bloc+j)=*(droite+j);
- else
- {
- *(bloc+j)=*(gauche+k);
- k++;
- } }
-
- if (mode == 1)
- {
- pf(bloc,tcrypte);
- }
- else
- {
- for (j=0;j<64;j++)
- *(tcrypte+j)=*(bloc+j);
-
- }
-
- printf("\n \n texte cryptee : \n");
-
- ////////////////////////////////////////////////////////////////
- }
- void menu()
- {
-
- //LE BOUTON NOUVEAU EST SELECTIONNE PAR DEFAULT.
- textcolor(15);
- printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n");
- printf("³ ³\n");
- printf("³ Bien venue sur le progamme ³\n");
- printf("³ ³\n");
- printf("³ DES ³\n");
- printf("³ ³\n");
- printf("³ (DATA ENCRYPTION STANDARD) ³\n");
- printf("³ ³\n");
- printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n");
-
-
-
- //LEGENDE
- printf("\n\n\n\n\nChoisissez ce que vous voulez faire.\n\n");
- textbackground(9);
- cprintf("\n\n\n\r h : Aide \n");
- printf ("\n");
- cprintf("\r k : Cles \n");
- printf ("\n");
- cprintf("\r t : Texte \n");
- printf ("\n");
- cprintf("\r r : Nombre de rondes \n");
- printf ("\n");
- cprintf("\r m : Mode de chiffrement (DES = 1, DEA = 0)\n");
- printf ("\n");
- cprintf("\r a : Affiche detaille \n");
- printf ("\n");
- cprintf("\r v : Information Supplementaire \n");
- printf ("\n");
- cprintf("\r b : Retour au Menu Principale \n");
- printf ("\n");
- cprintf("\r q : Quitter \n\n\n\n\n");
-
- //SELECTION DES CHOIX.
- }
-
- //------------retourne le resultat de recherche du caractere f dans le table t declare comme parametre globale
- int recherche(char f){
- int i,r=0;
- for(i=0;i<16;i++)
- if (t[i]==f)
- r=1;
- return r;
- }
-
- //------------permet de convertir un entier decimale en binaire
- void convert1 (int d,int *b)
- {
- int i,j=3, *p,*q;
- int div,div2;
- for(p=b;p<b+4;p++)
- *p=0;
-
- div=d;
-
- do
- {
- div2 = div / 2;
- *(b+j) =(div - div2*2);
- j--;
- div = div2;
- } while (j >= 0 && div2 != 0);
- }
-
-
- //-----------permet de transformer un tableau en hexadecimale en un tableau en binaire
- int transforme (char *tab,int *tab1)
- {
- int *b,*q,*u;
- char *p;
-
- q=(int*)malloc(64*sizeof(int));
- p=(char*)malloc(16*sizeof(char));
- b=(int*)malloc(4*sizeof(int));
- int r=1,a,z;
- q=tab1;
- p=tab;
- for(p=tab;p<tab+16;p++)
- {
- if (recherche(*p)==0)
- {
- p=tab+16;r=0;
- }
- a=(int)*p-48;
- if (a>=17)
- a=a-7;
-
- convert1(a,b);
- for(z=0;z<4;z++)
- {
- *q=*(b+z);
- q++;
- }
-
- }
- return (r);
- }
-
- //---------fonction utiliser dans l'animation
- void ralentir(void) {
- int i0;
- for (i0 = 0; i0 < 1500; i0++){
- gotoxy(1,1);
- cputs("");
- }
- return;
- }
- //----------Animation
- char *bye[] = {
- "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",
- "³ ÛÛÛÛÛ Û Û ÛÛÛÛÛÛ ³",
- "³ Û Û Û Û Û ³",
- "³ Û Û Û Û Û ³",
- "³ Û Û Û Û Û ³",
- "³ ÛÛÛÛÛ Û ÛÛÛÛÛ ³",
- "³ Û Û Û Û ³",
- "³ Û Û Û Û ³",
- "³ Û Û Û Û ³",
- "³ ÛÛÛÛÛ Û ÛÛÛÛÛÛ ³",
- "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´",
- "³ ESC FIN DU PROGRAMME....................³",
- "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
- };
- //----------Animation
- void effet_aller_retour(int col_depart,int col_fin, int ligne_depart) {
- int i1, i2;
-
-
- int max_menu = sizeof(bye) / sizeof(bye[0]);
-
- // faire sortir le bye vers la droite
- for (i2 = 0; i2 <= strlen(bye[0]) ; ++i2) {
- for (i1 = 0; i1 < max_menu ; ++i1) {
-
- gotoxy(col_depart,ligne_depart + i1 );
- cprintf( "%1s", strlen(bye[i1])+ bye[i1] -i2);
-
- }
- ralentir(); // ralentir l'effet
- }
-
-
- ralentir(); // temps d'attente
-
- // deplacer le bye vers la gauche
- for (i2 = 0; col_depart-i2 >= col_fin ; ++i2) {
- for (i1 = 0; i1 < max_menu ; ++i1) {
-
- gotoxy(col_depart-i2,ligne_depart + i1 );
- cprintf( "%1s ", bye[i1] );
-
- }
- ralentir(); // ralentir l'effet
- }
-
- ralentir(); // temps d'attente
-
- // faire repartir le bye
- for (i2 = 0; i2 <= strlen(bye[0]) ; ++i2) {
- for (i1 = 0; i1 < max_menu ; ++i1) {
-
- gotoxy(col_fin ,ligne_depart + i1 );
- cprintf("%s ",bye[i1] + i2);
-
- }
- ralentir(); // ralentir l'effet
- }
-
- return ;
-
- }
-
- //----------Animation
- char *DES[] = {
- ".......................................",
- ".ÛÛÛÛÛÛÛ........ÛÛÛÛÛÛÛÛÛ.....ÛÛÛÛÛÛÛÛ.",
- ".Û......Û.......Û.............Û........",
- ".Û.......Û......Û.............Û........",
- ".Û.......Û......Û.............Û........",
- ".Û........Û.....ÛÛÛÛÛÛÛ.......ÛÛÛÛÛÛÛÛ.",
- ".Û.......Û......Û....................Û.",
- ".Û.......Û......Û....................Û.",
- ".Û......Û.......Û....................Û.",
- ".ÛÛÛÛÛÛÛ........ÛÛÛÛÛÛÛÛÛ.....ÛÛÛÛÛÛÛÛ.",
- "......................................."
-
-
- };
-
- //----------Animation
- void effet2_haut_bas(int col, int ligne_depart,int ligne_fin) {
-
- int i1, i2;
- textbackground(0);
- // nbre d'element dans le des
- int max_menu = sizeof(DES) / sizeof(DES[0]);
-
- for (i1 = 0; i1 < max_menu ; ++i1) {
-
- for (i2 = 0; i2 < ligne_fin - i1 ; ++i2) {
-
- gotoxy(col,ligne_depart + i2);
- cprintf("%s",DES[ (max_menu -1) -i1]);
-
- ralentir(); // ralentir l'effet
- gotoxy(col,ligne_depart-1 + i2);
- cprintf("%48c",'\0'); // ligne vide
-
- }
- }
- return ;
- }
-
-
- void main()
- {
- //DEBUT DU PROGRAMME.
- int chargement;
- char sel, *cle_hex,*def_cle,*txt_hex,*def_txt,*aff_hex;
- int i,rech,rech1, *p,*q,etat1=0,mode1=1,round =16,*b, *t,*tt,*b1,*a , *gauche, *droite,*cles,*tcry;
- int *ronde,*etat,*mode,entrer ;
-
- b=(int*)malloc(8*8*sizeof(int));//cle binaire
- cle_hex=(char*)malloc(16*sizeof(char));//cle hexadecimal
- def_cle=(char*)malloc(16*sizeof(char));//cle hexadecimal par defaut
- txt_hex=(char*)malloc(16*sizeof(char));//Texte hexadecimal
- def_txt=(char*)malloc(16*sizeof(char));//Texte hexadecimal par defaut
- aff_hex=(char*)malloc(16*sizeof(char));//resultat de convertion hexadecimal
- b1=(int*)malloc(8*8*sizeof(int));//texte
- tcry=(int*)malloc(8*8*sizeof(int));
- mode=(int*)malloc(1*sizeof(int));
- etat=(int*)malloc(1*sizeof(int));
- ronde =(int*)malloc(1*sizeof(int));
- def_cle ="133457799BBCDFF1";
- def_txt ="0123456789ABCDEF";
- *ronde =16;
- *etat=1;
- *mode=1;
-
- ///////////////////////////////////////////Menu/////////////////////
-
- char nom [200]={'R','e','a','l','i','s','e',' ','p','a','r',' ',':','\n','\t','\t','\t','\t','\t','-','A','b','b','a','s','s','i',' ','I','s','s','a','m','\n','\n','\t','\t','\t','\t','\t','-','M','a','b','r','o','u','k',' ','K','h','a','l','e','d','\n','\n','\t','\t','\t','\t','\t','-','O','m','r','a','n','i',' ','S','a','d','e','k','\n'};
- int g;
- //BARRE DE CHARGEMENT.
- printf ("\n");
- textcolor(15);
- cprintf("Chargement en cours :\n\n\r");
- textbackground(11);
- for(chargement = 0; chargement < 80; chargement++)
- {
- cprintf(" "); Sleep(50);
- }
- entrer=0;
- do{
- // colonne = 15 ligne_depart = 1 ligne_fin = 24
- effet2_haut_bas(18,8, 15); // decouper_haut_bas
- if (entrer==0)
- {entrer=1;
- printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
-
- for(g= 0;g < 80;g++)
- {
- printf ("%c",nom[g]);Sleep(50);
-
- }
- printf ("\n\n\n\n");
- textcolor(11);
- textbackground(0);
- cprintf("SVP Taper une touche pour passer........\r");
- }}
- while(!kbhit());
- getch();
- system("cls");
-
- menu();
-
- rech =transforme (def_cle,b);
- rech1 =transforme (def_txt,b1);
-
- do
- {
- sel = getch ();
- switch(sel)
- {
- //AIDE.
- case 'h':
- system("cls");
- textbackground(0);
- system("cls");
- printf ("l'objectif de ce programme est la realisation d'une implementation du \n\n cryptosysteme a cles secrtet DES en C\n\n");
- printf("Ce projet est realiser par :Abbassi Issam, Mabrouk Khaled,Omrani Sadek \n\n 1er annee cycle de formation d'ingenieurs ");
- printf("dans le cadre de travaux pratiques de \ncryptographie \n\n");
- printf("Date de creation 09/12/2006 ");
- printf("\n\n\n Plusieurs fonctions disponibles dans ce programme:");
- cprintf("\n\n\n\r h : Aide ");
- printf ("\n");
- cprintf("\r k : Cles ");
- printf ("\n");
- cprintf("\r t : Texte ");
- printf ("\n");
- cprintf("\r r : Nombre de rondes ");
- printf ("\n");
- cprintf("\r m : Mode de chiffrement (DES = 1, DEA = 0)");
- printf ("\n");
- cprintf("\r a : Affiche detaille ");
- printf ("\n");
- cprintf("\r v : Information Supplementaire ");
- printf ("\n");
- cprintf("\r b : Retour au Menu Principale ");
- cprintf("\r q : Quitter \n\n\n");
-
- textcolor(4);
- textbackground(0);
- cprintf("\rREMARQUES \n\n\n\rSi l'utilisateur utilse la fonction de chiffrement sans modifier \n\n \rles parametres de cryptage (cles, texte, nb de ronde.... )\n\n");
- cprintf("\rle systeme chiffre avec les valeurs par defaut: \n\n");
- cprintf("\rcles = 13345779 9BBCDFF1 \n\n");
- cprintf("\rtexte = 0123456789ABCDEF\n\n");
- cprintf("\rNombre de ronde = 16 ");
-
- break;
-
- //CLES.
- case 'k': system("cls");
- textbackground(0);
- system("cls");
-
- printf("\n Donner votre cles en Hexadicimal : \n\n");
- scanf("%s",cle_hex);
- rech=transforme (cle_hex,b);
- if (rech ==0)
- {
- printf ("\n Desole, Votre cles est non valide SVP verifier votre cles... \n\n Le systeme va choisir le cles par defaut... \n");
- rech =transforme (def_cle,b);
- getch ();
- system("cls");
- textbackground(0);
- system("cls");
- menu ();
- }
- else
- {
- printf ("\n Cles valide.... \n");
- getch ();
- system("cls");
- textbackground(0);
- system("cls");
- menu ();
- }
- break;
-
- //TEXTE.
- case 't':
- system("cls");
- textbackground(0);
- system("cls");
-
- printf("\n Donner votre Texte en Hexadicimal : \n\n");
- scanf("%s",txt_hex);
- rech1=transforme (txt_hex,b1);
- if (rech1 ==0)
- {
- printf ("\n Desole, Votre Texte est non valide SVP verifier votre Texte... \n\n Le systeme va choisir le Texte par defaut... \n");
- rech =transforme (def_txt,b1);
- getch ();
- system("cls");
- textbackground(0);
- system("cls");
- menu ();
- }
- else
- {
- printf ("\n Texte valide.... \n");
-
- getch ();
- system("cls");
- textbackground(0);
- system("cls");
- menu ();
- }
- break;
- //RONDE.
- case 'r': do
- {
- textbackground(0);
- system("cls");
- printf("\nDonner le nombre de rondes (compris entre 1 et 16:) \n\n");
- scanf("%d",ronde);
-
- }
- while ((*ronde <1) || (*ronde >16));
- system("cls");
-
- menu();
- break;
- //MODE DE CHIFFREMENT.
- case 'm':
- do
- {
- textbackground(0);
- system("cls");
- printf ("\n\n Donner SVP le mode du cryptage ( DES = 1 ; DEA = 0 ):\n");
- printf("\t");
- scanf (" %d",mode);
- }
- while ((*mode !=1) && (*mode !=0));
- if ( *mode == 1)
- printf("\n Vous avez choisi le mode DES :\n\n\n");
- else
- printf("\n Vous avez choisi le mode DEA :\n\n\n");
- round =*ronde;
- etat1 =*etat;
- mode1 =*mode;
- printf("\n Votre texte en claire est :\n\n");
- printf("\n EN BINAIRE :\n");
- affiche_tab(b1,1,64);
- printf("\n EN HEXADECIMALE :\n");
- convBinHex64(b1,aff_hex);
- puts (aff_hex);
- getch ();
- cryptage(b1,b,tcry,mode1,round,etat1);
- printf("\n");
-
- printf("\n EN BINAIRE :\n");
- affiche_tab(tcry,1,64);
- printf("\n EN HEXADECIMALE :\n");
- convBinHex64(tcry,aff_hex);
- puts (aff_hex);
-
- break;
- //INFORMATION SUPPLEMENTAIRE.
- case 'v':
- system("cls");
- textbackground(0);
- system("cls");
-
- printf("\n\n\t\tPresentation exhaustive du systeme DES\n\n\n\n");
- printf("Ce systeme de chiffrement a cles privee est le plus connu. Un cryptosysteme\n\npermet a deux protagonistes");
- printf("de communiquer ensemble sur un canal peu sur lorsqu'\n\nun opposant souhaite espionner cette conversation. Evidemment");
- printf("cet opposant ne\n\ndoit pas comprendre les informations qui sont echangees. \n\n\n");
- printf("Pour un cryptosysteme on définie les expressions suivantes: \n\n\n");
- textcolor(13);
- textbackground(0);
- cprintf(" \r- Texte clair :");
- printf(" Information que l'emetteur souhaite transmettre au recepteur\n\n\t\t(Ex : texte en francais, donnee numerique etc...).\n\n\n");
- cprintf(" \r- Chiffrement :");
- printf(" Processus de transformation d’un message M de telle maniere\n\n\t\ta le rendre incomprehensible. Ce processus est base sur une\n\n\t\tfonction de chiffrement E et permet de ");
- printf("generer ainsi un message\n\n\t\tchiffre C = E(M).\n\n\n");
- cprintf(" \r- Dechiffrement: ");
- printf("Processus de reconstruction du message clair a partir du\n\n\t\tmessage chiffre, base sur une fonction de dechiffrement D.\n");
- break;
- //RETOUR AU MENU PRINCIPALE.
- case 'b':
- system("cls");
- textbackground(0);
- system("cls");
- menu();
- break;
- //AFFICHE DETAILLES.
- case 'a':
- do
- {
- textbackground(0);
- system("cls");
- printf ("\n\n vous voulez vraiment afficher les detaille du cryptage ( OUI = 1 ; NON = 0 ):\n\n");
- printf("\t");
- scanf (" %d",etat);
- }
- while ((*etat !=1) && (*etat !=0));
- system("cls");
- menu ();
- break;
- //QUITTER.
- case 'q':
- textbackground(0);
- system("cls");
- system("cls");
-
-
- _setcursortype(_NOCURSOR);
- textcolor(LIGHTGREEN);
-
-
-
- gotoxy(30, 3);
- cprintf("TAPER ESC pour sortir ");
-
- do {
-
- textcolor(LIGHTCYAN);
-
- // colonne depart = 37 colonne fin = 15 ligne depart = 4
- effet_aller_retour(37,15, 10);
-
- } while (!kbhit());
-
-
- exit(0);
- break;
- }
- //0 = QUITTER.
- }
- while (sel != 'q');
-
-
- free(tcry);
-
-
-
- getch();
- }
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
char t[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};// Tableau utiliser en convertion Binaire ---> Hexadecimale
//-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 64bits
void convBinHex64 (int *b , char *h)
{
int *q, *a,i,j,*c1;
char *c;
c=(char*)malloc(16*sizeof(char));
q=(int*)malloc(64*sizeof(int));
a=(int*)malloc(4*sizeof(int));
c1=(int*)malloc(1*sizeof(int));
q=b;
c=h;
for(i=0;i<16;i++)
{
for (j=0;j<4;j++)
*(a+j)=*(q+j+i*4);
*c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
*(c+i) = t[*c1];
}
}
//-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 48 bits
void convBinHex48 (int *b , char *h)
{
int *q, *a,i,j,*c1;
char *c;
c=(char*)malloc(12*sizeof(char));
q=(int*)malloc(48*sizeof(int));
a=(int*)malloc(4*sizeof(int));
c1=(int*)malloc(1*sizeof(int));
q=b;
c=h;
for(i=0;i<12;i++)
{
for (j=0;j<4;j++)
*(a+j)=*(q+j+i*4);
*c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
*(c+i) = t[*c1];
}
}
//-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 32bits
void convBinHex32 (int *b , char *h)
{
int *q, *a,i,j,*c1;
char *c;
c=(char*)malloc(8*sizeof(char));
q=(int*)malloc(32*sizeof(int));
a=(int*)malloc(4*sizeof(int));
c1=(int*)malloc(1*sizeof(int));
q=b;
c=h;
for(i=0;i<8;i++)
{
for (j=0;j<4;j++)
*(a+j)=*(q+j+i*4);
*c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
*(c+i) = t[*c1];
}
}
//-------------------------------------fonction de convertion de base binaire à la base hexadicimale de taille 28 bits
void convBinHex28 (int *b , char *h)
{
int *q, *a,i,j,*c1;
char *c;
c=(char*)malloc(7*sizeof(char));
q=(int*)malloc(28*sizeof(int));
a=(int*)malloc(4*sizeof(int));
c1=(int*)malloc(1*sizeof(int));
q=b;
c=h;
for(i=0;i<7;i++)
{
for (j=0;j<4;j++)
*(a+j)=*(q+j+i*4);
*c1= *(a+3)+*(a+2)*2+*(a+1)*4+*(a+0)*8;
*(c+i) = t[*c1];
}
}
//------------affiche tableau b avec l nombre de ligne et c nombre de colonne
void affiche_tab(int *b,int l,int c)
{int *p,*q;
for (p=b;p<b+l*c;p+=c)
{for (q=p;q<p+c;q++)
printf("%d",*q);
}
}
//------------convertion de dicimale vers binaire
void convert (int d,int *b)
{
int i,j=63, *p,*q;
int div,div2;
for(p=b;p<b+64;p+=8)
for(q=p;q<p+8;q++)
*q=0;
div=d;
do
{
div2 = div / 2;
*(b+j) =(div - div2*2);
j--;
div = div2;
} while (j > 0 && div2 != 0);
}
//------------Premutation de 64bits en 56bits
void pc1(int *a,int *b)//a de dimension 64 bits et b de dimension 56 bits
{ int *p1, *q1;
p1=(int*)malloc(64*sizeof(int));
q1=(int*)malloc(56*sizeof(int));
p1=a;q1=b;
*q1=*(p1+56);*(q1+1)=*(p1+48);*(q1+2)=*(p1+40);*(q1+3)=*(p1+32);*(q1+4)=*(p1+24);*(q1+5)=*(p1+16);*(q1+6)=*(p1+8);
*(q1+7)=*(p1);*(q1+8)=*(p1+57);*(q1+9)=*(p1+49);*(q1+10)=*(p1+41);*(q1+11)=*(p1+33);*(q1+12)=*(p1+25);*(q1+13)=*(p1+17);
*(q1+14)=*(p1+9);*(q1+15)=*(p1+1);*(q1+16)=*(p1+58);*(q1+17)=*(p1+50);*(q1+18)=*(p1+42);*(q1+19)=*(p1+34);*(q1+20)=*(p1+26);
*(q1+21)=*(p1+18);*(q1+22)=*(p1+10);*(q1+23)=*(p1+2);*(q1+24)=*(p1+59);*(q1+25)=*(p1+51);*(q1+26)=*(p1+43);*(q1+27)=*(p1+35);
*(q1+28)=*(p1+62);*(q1+29)=*(p1+54);*(q1+30)=*(p1+46);*(q1+31)=*(p1+38);*(q1+32)=*(p1+30);*(q1+33)=*(p1+22);*(q1+34)=*(p1+14);
*(q1+35)=*(p1+6);*(q1+36)=*(p1+61);*(q1+37)=*(p1+53);*(q1+38)=*(p1+45);*(q1+39)=*(p1+37);*(q1+40)=*(p1+29);*(q1+41)=*(p1+21);
*(q1+42)=*(p1+13);*(q1+43)=*(p1+5);*(q1+44)=*(p1+60);*(q1+45)=*(p1+52);*(q1+46)=*(p1+44);*(q1+47)=*(p1+36);*(q1+48)=*(p1+28);
*(q1+49)=*(p1+20);*(q1+50)=*(p1+12);*(q1+51)=*(p1+4);*(q1+52)=*(p1+27);*(q1+53)=*(p1+19);*(q1+54)=*(p1+11);*(q1+55)=*(p1+3);
}
//-------------Permutation de 56bits en 48 bits
void pc2(int *a,int *b) //a de dimension 56 et b de dimension 48
{ int *p, *q;
p=(int*)malloc(56*sizeof(int));
q=(int*)malloc(48*sizeof(int));
p=a;q=b;
*q=*(p+13); *(q+1)=*(p+16);*(q+2)=*(p+10);*(q+3)=*(p+23);*(q+4)=*p;*(q+5)=*(p+4);
*(q+6)=*(p+2); *(q+7)=*(p+27);*(q+8)=*(p+14);*(q+9)=*(p+5);*(q+10)=*(p+20);*(q+11)=*(p+9);
*(q+12)=*(p+22);*(q+13)=*(p+18);*(q+14)=*(p+11);*(q+15)=*(p+3);*(q+16)=*(p+25);*(q+17)=*(p+7);
*(q+18)=*(p+15);*(q+19)=*(p+6);*(q+20)=*(p+26);*(q+21)=*(p+19);*(q+22)=*(p+12);*(q+23)=*(p+1);
*(q+24)=*(p+40);*(q+25)=*(p+51);*(q+26)=*(p+30);*(q+27)=*(p+36);*(q+28)=*(p+46);*(q+29)=*(p+54);
*(q+30)=*(p+29);*(q+31)=*(p+39);*(q+32)=*(p+50);*(q+33)=*(p+44);*(q+34)=*(p+32);*(q+35)=*(p+47);
*(q+36)=*(p+43);*(q+37)=*(p+48);*(q+38)=*(p+38);*(q+39)=*(p+55);*(q+40)=*(p+33);*(q+41)=*(p+52);
*(q+42)=*(p+45);*(q+43)=*(p+41);*(q+44)=*(p+49);*(q+45)=*(p+35);*(q+46)=*(p+28);*(q+47)=*(p+31);
}
//--------------------permet d'avoir 48bits à partir de 32 bits
void expansion(int *b,int *a) //a de dimension 32 b de dimension 48
{ int *p2, *q2;
p2=(int*)malloc(32*sizeof(int));
q2=(int*)malloc(48*sizeof(int));
p2=b;q2=a;
*q2=*(p2+31);*(q2+1)=*(p2+0);*(q2+2)=*(p2+1);*(q2+3)=*(p2+2);*(q2+4)=*(p2+3);*(q2+5)=*(p2+4);
*(q2+6)=*(p2+3);*(q2+7)=*(p2+4);*(q2+8)=*(p2+5);*(q2+9)=*(p2+6);*(q2+10)=*(p2+7);*(q2+11)=*(p2+8);
*(q2+12)=*(p2+7);*(q2+13)=*(p2+8);*(q2+14)=*(p2+9);*(q2+15)=*(p2+10);*(q2+16)=*(p2+11);*(q2+17)=*(p2+12);
*(q2+18)=*(p2+11);*(q2+19)=*(p2+12);*(q2+20)=*(p2+13);*(q2+21)=*(p2+14);*(q2+22)=*(p2+15);*(q2+23)=*(p2+16);
*(q2+24)=*(p2+15);*(q2+25)=*(p2+16);*(q2+26)=*(p2+17);*(q2+27)=*(p2+18);*(q2+28)=*(p2+19);*(q2+29)=*(p2+20);
*(q2+30)=*(p2+19);*(q2+31)=*(p2+20);*(q2+32)=*(p2+21);*(q2+33)=*(p2+22);*(q2+34)=*(p2+23);*(q2+35)=*(p2+24);
*(q2+36)=*(p2+23);*(q2+37)=*(p2+24);*(q2+38)=*(p2+25);*(q2+39)=*(p2+26);*(q2+40)=*(p2+27);*(q2+41)=*(p2+28);
*(q2+42)=*(p2+27);*(q2+43)=*(p2+28);*(q2+44)=*(p2+29);*(q2+45)=*(p2+30);*(q2+46)=*(p2+31);*(q2+47)=*p2;
}
//---------------------permet diviser les 48 bits de cles divercifier en deux tableaux de 28 bits
void division (int *b ,int *g, int *d, int n)
{
int *a, *p,*q;
a=b;
p=g;
q=d;
for (p=g; p<g+n; p++)
{
*p=*a;
a++;
}
a= b+n;
for (q=d; q<d+n; q++)
{
*q=*a;
a++;
}
}
//---------------permet la rotation vers le gauche de tableau a en fonction de son tour r
void rotation ( int *a, int r)// a est de dimension 28 et r est le nombre de tour du clé
{
int *p, aux;
p= a;
aux = *p;
for ( p=a ;p<a+27 ; p++)
{
*p=*(p+1);
}
*(a+27)= aux;
if ((r!= 1)&&(r!= 2)&&(r!= 9)&&(r!= 16))
{
p= a;
aux = *p;
for ( p=a ;p<a+27 ; p++)
{
*p=*(p+1);
}
*(a+27)= aux;
}
}
//////////////////////////////////////FONCTION DE GENERATION DU CLES///////////////
//-----------Permet de générer les cles utiliser pour le chiffrement
void generation (int *b, int *cles,int ronde,int etat) // cles table contenant les 16 cles; si etat=1, on va afficher les itirations
{
int i,j,k,*p,*q,*t,*a,*g,*d,*n, t1[56];
char *aff_hex,*aff_hex1;
p=cles;
g=(int*)malloc(28*sizeof(int));
aff_hex=(char*)malloc(7*sizeof(char));
aff_hex1=(char*)malloc(13*sizeof(char));
d=(int*)malloc(28*sizeof(int));
t=(int*)malloc(56*sizeof(int));
q=(int*)malloc(56*sizeof(int));
a=(int*)malloc(48*sizeof(int));
n=(int*)malloc(48*sizeof(int));
//ronde=(int*)malloc(1*sizeof(int));
pc1 (b,t);// t est de 56 bits
division (t,g,d,28);
if (etat==1)
{
printf ("-----------------------------------------------------\n");
printf ("C0: ");
affiche_tab(g,1,28);
convBinHex28(g,aff_hex);
printf (" = ");
puts (aff_hex);
printf ("D0: ");
affiche_tab(d,1,28);
convBinHex28(d,aff_hex);
printf (" = ");
puts (aff_hex);
printf ("-----------------------------------------------------\n");
}
for (i=1; i<=ronde;i++)
{
rotation(g,i);
rotation(d,i);
if (etat==1)
{
printf ("C%d: ",i);
affiche_tab(g,1,28);
convBinHex28(g,aff_hex);
printf (" = ");
puts (aff_hex);
printf ("D%d: ",i);
affiche_tab(d,1,28);
convBinHex28(d,aff_hex);
printf (" = ");
puts (aff_hex);
}
k=0;
for (j=0;j<56;j++)
{
if (j<28)
t1[j]=*(g+j);
else
{
t1[j]=*(d+k);
k++ ;
} }
q=t1;
pc2 (q,a);// a est 48 bits
n=a;
int y;
for(n=a;n<a+48;n++)
{
*p=*n;
p++;
}
if (etat==1)
{
printf ("K%d: ",i);
affiche_tab(a,1,48);
convBinHex48(a,aff_hex1);
printf (" = ");
puts(aff_hex1);
printf ("\n-----------------------------------------------------\n");
}
}
if (etat==1)
printf ("les iterations de cles sont termines........\n");
}
//////////////////////////////////////////////////////////////////////////////////
//------------Permutation initiale de bloc de 64bits
void pi(int *a,int *b)//a de dimension 64 bits permutation initiale
{ int *p, *q;
p=(int*)malloc(64*sizeof(int));
q=(int*)malloc(64*sizeof(int));
p=a;q=b;
*q=*(p+57);*(q+1)=*(p+49);*(q+2)=*(p+41);*(q+3)=*(p+33);*(q+4)=*(p+25);*(q+5)=*(p+17);*(q+6)=*(p+9);*(q+7)=*(p+1);
*(q+8)=*(p+59);*(q+9)=*(p+51);*(q+10)=*(p+43);*(q+11)=*(p+35);*(q+12)=*(p+27);*(q+13)=*(p+19);*(q+14)=*(p+11);*(q+15)=*(p+3);
*(q+16)=*(p+61);*(q+17)=*(p+53);*(q+18)=*(p+45);*(q+19)=*(p+37);*(q+20)=*(p+29);*(q+21)=*(p+21);*(q+22)=*(p+13);*(q+23)=*(p+5);
*(q+24)=*(p+63);*(q+25)=*(p+55);*(q+26)=*(p+47);*(q+27)=*(p+39);*(q+28)=*(p+31);*(q+29)=*(p+23);*(q+30)=*(p+15);*(q+31)=*(p+7);
*(q+32)=*(p+56);*(q+33)=*(p+48);*(q+34)=*(p+40);*(q+35)=*(p+32);*(q+36)=*(p+24);*(q+37)=*(p+16);*(q+38)=*(p+8);*(q+39)=*(p+0);
*(q+40)=*(p+58);*(q+41)=*(p+50);*(q+42)=*(p+42);*(q+43)=*(p+34);*(q+44)=*(p+26);*(q+45)=*(p+18);*(q+46)=*(p+10);*(q+47)=*(p+2);
*(q+48)=*(p+60);*(q+49)=*(p+52);*(q+50)=*(p+44);*(q+51)=*(p+36);*(q+52)=*(p+28);*(q+53)=*(p+20);*(q+54)=*(p+12);*(q+55)=*(p+4);
*(q+56)=*(p+62);*(q+57)=*(p+54);*(q+58)=*(p+46);*(q+59)=*(p+38);*(q+60)=*(p+30);*(q+61)=*(p+22);*(q+62)=*(p+14);*(q+63)=*(p+6);
}
//------------Permutation finale de bloc de 64bits
void pf(int *a,int *b)//a de dimension 64 bits permutation FINALE
{ int *p, *q;
p=(int*)malloc(64*sizeof(int));
q=(int*)malloc(64*sizeof(int));
p=a;q=b;
*q=*(p+39); *(q+1)=*(p+7); *(q+2)=*(p+47);*(q+3)=*(p+15);*(q+4)=*(p+55);*(q+5)=*(p+23);*(q+6)=*(p+63);*(q+7)=*(p+31);
*(q+8)=*(p+38); *(q+9)=*(p+6); *(q+10)=*(p+46);*(q+11)=*(p+14);*(q+12)=*(p+54);*(q+13)=*(p+22);*(q+14)=*(p+62);*(q+15)=*(p+30);
*(q+16)=*(p+37);*(q+17)=*(p+5); *(q+18)=*(p+45);*(q+19)=*(p+13);*(q+20)=*(p+53);*(q+21)=*(p+21);*(q+22)=*(p+61);*(q+23)=*(p+29);
*(q+24)=*(p+36);*(q+25)=*(p+4); *(q+26)=*(p+44);*(q+27)=*(p+12);*(q+28)=*(p+52);*(q+29)=*(p+20);*(q+30)=*(p+60);*(q+31)=*(p+28);
*(q+32)=*(p+35);*(q+33)=*(p+3); *(q+34)=*(p+43);*(q+35)=*(p+11);*(q+36)=*(p+51);*(q+37)=*(p+19);*(q+38)=*(p+59);*(q+39)=*(p+27);
*(q+40)=*(p+34);*(q+41)=*(p+2); *(q+42)=*(p+42);*(q+43)=*(p+10);*(q+44)=*(p+50);*(q+45)=*(p+18);*(q+46)=*(p+58);*(q+47)=*(p+26);
*(q+48)=*(p+33);*(q+49)=*(p+1); *(q+50)=*(p+41);*(q+51)=*(p+9);*(q+52)=*(p+49);*(q+53)=*(p+17);*(q+54)=*(p+57);*(q+55)=*(p+25);
*(q+56)=*(p+32);*(q+57)=*(p+0); *(q+58)=*(p+40);*(q+59)=*(p+8);*(q+60)=*(p+48);*(q+61)=*(p+16);*(q+62)=*(p+56);*(q+63)=*(p+24);
}
//----------permet la permutation de la résultat de s-box
void pp(int *a,int *b)//a de dimension 32 bits permutation p
{ int *p, *q;
p=(int*)malloc(32*sizeof(int));
q=(int*)malloc(32*sizeof(int));
p=a;
q=b;
*q=*(p+15); *(q+1)=*(p+6); *(q+2)=*(p+19); *(q+3)=*(p+20);
*(q+4)=*(p+28); *(q+5)=*(p+11); *(q+6)=*(p+27); *(q+7)=*(p+16);
*(q+8)=*p; *(q+9)=*(p+14); *(q+10)=*(p+22); *(q+11)=*(p+25);
*(q+12)=*(p+4); *(q+13)=*(p+17); *(q+14)=*(p+30); *(q+15)=*(p+9);
*(q+16)=*(p+1); *(q+17)=*(p+7); *(q+18)=*(p+23); *(q+19)=*(p+13);
*(q+20)=*(p+31); *(q+21)=*(p+26); *(q+22)=*(p+2); *(q+23)=*(p+8);
*(q+24)=*(p+18); *(q+25)=*(p+12); *(q+26)=*(p+29); *(q+27)=*(p+5);
*(q+28)=*(p+21); *(q+29)=*(p+10); *(q+30)=*(p+3); *(q+31)=*(p+24);
}
//-----------------convertir de binaire à la base dicimale
void convertBinDec (int *a, int *l , int *c )// a est de 6 bits
{
*l= *(a+5)+*a*2;
*c= *(a+4)+*(a+3)*2+*(a+2)*4+*(a+1)*8;
}
//--------------------permet d'avoir 32 bits à partir de 48bits
void s_box(int *a ,int *b)// a de 48 et b de 32
{
int s1[4][16],s2[4][16],s8[4][16],s3[4][16],s4[4][16],s5[4][16],s6[4][16],s7[4][16];
int s,i,k,j, *h,*p,*q,*r,*l,*c;
p=(int*)malloc(48*sizeof(int));
q=(int*)malloc(6*sizeof(int));
h=(int*)malloc(48*sizeof(int));
r=(int*)malloc(64*sizeof(int));
l=(int*)malloc(1*sizeof(int));
c=(int*)malloc(1*sizeof(int));
s1[0][0]=14; s1[0][1]=4; s1[0][2]=13; s1[0][3]=1; s1[0][4]=2; s1[0][5]=15; s1[0][6]=11; s1[0][7]=8; s1[0][8]=3; s1[0][9]=10; s1[0][10]=6; s1[0][11]=12; s1[0][12]=5; s1[0][13]=9; s1[0][14]=0; s1[0][15]=7;
s1[1][0]=0; s1[1][1]=15; s1[1][2]=7; s1[1][3]=4; s1[1][4]=14; s1[1][5]=2; s1[1][6]=13; s1[1][7]=1; s1[1][8]=10; s1[1][9]=6; s1[1][10]=12; s1[1][11]=11; s1[1][12]=9; s1[1][13]=5; s1[1][14]=3; s1[1][15]=8;
s1[2][0]=4; s1[2][1]=1; s1[2][2]=14; s1[2][3]=8; s1[2][4]=13; s1[2][5]=6; s1[2][6]=2; s1[2][7]=11; s1[2][8]=15; s1[2][9]=12; s1[2][10]=9; s1[2][11]=7; s1[2][12]=3; s1[2][13]=10; s1[2][14]=5; s1[2][15]=0;
s1[3][0]=15; s1[3][1]=12; s1[3][2]=8; s1[3][3]=2; s1[3][4]=4; s1[3][5]=9; s1[3][6]=1; s1[3][7]=7; s1[3][8]=5; s1[3][9]=11; s1[3][10]=3; s1[3][11]=14; s1[3][12]=10; s1[3][13]=0; s1[3][14]=6; s1[3][15]=13;
s2[0][0]=15; s2[0][1]=1; s2[0][2]=8; s2[0][3]=14; s2[0][4]=6; s2[0][5]=11; s2[0][6]=3; s2[0][7]=4; s2[0][8]=9; s2[0][9]=7; s2[0][10]=2; s2[0][11]=13; s2[0][12]=12; s2[0][13]=0; s2[0][14]=5; s2[0][15]=10;
s2[1][0]=3; s2[1][1]=13; s2[1][2]=4; s2[1][3]=7; s2[1][4]=15; s2[1][5]=2; s2[1][6]=8; s2[1][7]=14; s2[1][8]=12; s2[1][9]=0; s2[1][10]=1; s2[1][11]=10; s2[1][12]=6; s2[1][13]=9; s2[1][14]=11; s2[1][15]=5;
s2[2][0]=0; s2[2][1]=14; s2[2][2]=7; s2[2][3]=11; s2[2][4]=10; s2[2][5]=4; s2[2][6]=13; s2[2][7]=1; s2[2][8]=5; s2[2][9]=8; s2[2][10]=12; s2[2][11]=6; s2[2][12]=9; s2[2][13]=3; s2[2][14]=2; s2[2][15]=15;
s2[3][0]=13; s2[3][1]=8; s2[3][2]=10; s2[3][3]=1; s2[3][4]=3; s2[3][5]=15; s2[3][6]=4; s2[3][7]=2; s2[3][8]=11; s2[3][9]=6; s2[3][10]=7; s2[3][11]=12; s2[3][12]=0; s2[3][13]=5; s2[3][14]=14; s2[3][15]=9;
s3[0][0]=10; s3[0][1]=0; s3[0][2]=9; s3[0][3]=14; s3[0][4]=6; s3[0][5]=3; s3[0][6]=15; s3[0][7]=5; s3[0][8]=1; s3[0][9]=13; s3[0][10]=12; s3[0][11]=7; s3[0][12]=11; s3[0][13]=4; s3[0][14]=2; s3[0][15]=8;
s3[1][0]=13; s3[1][1]=7; s3[1][2]=0; s3[1][3]=9; s3[1][4]=3; s3[1][5]=4; s3[1][6]=6; s3[1][7]=10; s3[1][8]=2; s3[1][9]=8; s3[1][10]=5; s3[1][11]=14; s3[1][12]=12; s3[1][13]=11; s3[1][14]=15; s3[1][15]=1;
s3[2][0]=13; s3[2][1]=6; s3[2][2]=4; s3[2][3]=9; s3[2][4]=8; s3[2][5]=15; s3[2][6]=3; s3[2][7]=0; s3[2][8]=11; s3[2][9]=1; s3[2][10]=2; s3[2][11]=12; s3[2][12]=5; s3[2][13]=10; s3[2][14]=14; s3[2][15]=7;
s3[3][0]=1; s3[3][1]=10; s3[3][2]=13; s3[3][3]=0; s3[3][4]=6; s3[3][5]=9; s3[3][6]=8; s3[3][7]=7; s3[3][8]=4; s3[3][9]=15; s3[3][10]=14; s3[3][11]=3; s3[3][12]=11; s3[3][13]=5; s3[3][14]=2; s3[3][15]=12;
s4[0][0]=7; s4[0][1]=13; s4[0][2]=14; s4[0][3]=3; s4[0][4]=0; s4[0][5]=6; s4[0][6]=9; s4[0][7]=10; s4[0][8]=1; s4[0][9]=2; s4[0][10]=8; s4[0][11]=5; s4[0][12]=11; s4[0][13]=12; s4[0][14]=4; s4[0][15]=15;
s4[1][0]=13; s4[1][1]=8; s4[1][2]=11; s4[1][3]=5; s4[1][4]=6; s4[1][5]=15; s4[1][6]=0; s4[1][7]=3; s4[1][8]=4; s4[1][9]=7; s4[1][10]=2; s4[1][11]=12; s4[1][12]=1; s4[1][13]=10; s4[1][14]=14; s4[1][15]=9;
s4[2][0]=10; s4[2][1]=6; s4[2][2]=9; s4[2][3]=0; s4[2][4]=12; s4[2][5]=11; s4[2][6]=7; s4[2][7]=13; s4[2][8]=15; s4[2][9]=1; s4[2][10]=3; s4[2][11]=14; s4[2][12]=5; s4[2][13]=2; s4[2][14]=8; s4[2][15]=4;
s4[3][0]=3; s4[3][1]=15; s4[3][2]=0; s4[3][3]=6; s4[3][4]=10; s4[3][5]=1; s4[3][6]=13; s4[3][7]=8; s4[3][8]=9; s4[3][9]=4; s4[3][10]=5; s4[3][11]=11; s4[3][12]=12; s4[3][13]=7; s4[3][14]=2; s4[3][15]=14;
s5[0][0]=2; s5[0][1]=12; s5[0][2]=4; s5[0][3]=1; s5[0][4]=7; s5[0][5]=10; s5[0][6]=11; s5[0][7]=6; s5[0][8]=8; s5[0][9]=5; s5[0][10]=3; s5[0][11]=15; s5[0][12]=13; s5[0][13]=0; s5[0][14]=14; s5[0][15]=9;
s5[1][0]=14; s5[1][1]=11; s5[1][2]=2; s5[1][3]=12; s5[1][4]=4; s5[1][5]=7; s5[1][6]=13; s5[1][7]=1; s5[1][8]=5; s5[1][9]=0; s5[1][10]=15; s5[1][11]=10; s5[1][12]=3; s5[1][13]=9; s5[1][14]=8; s5[1][15]=6;
s5[2][0]=4; s5[2][1]=2; s5[2][2]=1; s5[2][3]=11; s5[2][4]=10; s5[2][5]=13; s5[2][6]=7; s5[2][7]=8; s5[2][8]=15; s5[2][9]=9; s5[2][10]=12; s5[2][11]=5; s5[2][12]=6; s5[2][13]=3; s5[2][14]=0; s5[2][15]=14;
s5[3][0]=11; s5[3][1]=8; s5[3][2]=12; s5[3][3]=7; s5[3][4]=1; s5[3][5]=14; s5[3][6]=2; s5[3][7]=13; s5[3][8]=6; s5[3][9]=15; s5[3][10]=0; s5[3][11]=9; s5[3][12]=10; s5[3][13]=4; s5[3][14]=5; s5[3][15]=3;
s6[0][0]=12; s6[0][1]=1; s6[0][2]=10; s6[0][3]=15; s6[0][4]=9; s6[0][5]=2; s6[0][6]=6; s6[0][7]=8; s6[0][8]=0; s6[0][9]=13; s6[0][10]=3; s6[0][11]=4; s6[0][12]=14; s6[0][13]=7; s6[0][14]=5; s6[0][15]=11;
s6[1][0]=10; s6[1][1]=15; s6[1][2]=4; s6[1][3]=2; s6[1][4]=7; s6[1][5]=12; s6[1][6]=9; s6[1][7]=5; s6[1][8]=6; s6[1][9]=1; s6[1][10]=13; s6[1][11]=14; s6[1][12]=0; s6[1][13]=11; s6[1][14]=3; s6[1][15]=8;
s6[2][0]=9; s6[2][1]=14; s6[2][2]=15; s6[2][3]=5; s6[2][4]=2; s6[2][5]=8; s6[2][6]=12; s6[2][7]=3; s6[2][8]=7; s6[2][9]=0; s6[2][10]=4; s6[2][11]=10; s6[2][12]=1; s6[2][13]=13; s6[2][14]=11; s6[2][15]=6;
s6[3][0]=4; s6[3][1]=3; s6[3][2]=2; s6[3][3]=12; s6[3][4]=9; s6[3][5]=5; s6[3][6]=15; s6[3][7]=10; s6[3][8]=11; s6[3][9]=14; s6[3][10]=1; s6[3][11]=7; s6[3][12]=6; s6[3][13]=0; s6[3][14]=8; s6[3][15]=13;
s7[0][0]=4; s7[0][1]=11; s7[0][2]=2; s7[0][3]=14; s7[0][4]=15; s7[0][5]=0; s7[0][6]=8; s7[0][7]=13; s7[0][8]=3; s7[0][9]=12; s7[0][10]=9; s7[0][11]=7; s7[0][12]=5; s7[0][13]=10; s7[0][14]=6; s7[0][15]=1;
s7[1][0]=13; s7[1][1]=0; s7[1][2]=11; s7[1][3]=7; s7[1][4]=4; s7[1][5]=9; s7[1][6]=1; s7[1][7]=10; s7[1][8]=14; s7[1][9]=3; s7[1][10]=5; s7[1][11]=12; s7[1][12]=2; s7[1][13]=15; s7[1][14]=8; s7[1][15]=6;
s7[2][0]=1; s7[2][1]=4; s7[2][2]=11; s7[2][3]=13; s7[2][4]=12; s7[2][5]=3; s7[2][6]=7; s7[2][7]=14; s7[2][8]=10; s7[2][9]=15; s7[2][10]=6; s7[2][11]=8; s7[2][12]=0; s7[2][13]=5; s7[2][14]=9; s7[2][15]=2;
s7[3][0]=6; s7[3][1]=11; s7[3][2]=13; s7[3][3]=8; s7[3][4]=1; s7[3][5]=4; s7[3][6]=10; s7[3][7]=7; s7[3][8]=9; s7[3][9]=5; s7[3][10]=0; s7[3][11]=15; s7[3][12]=14; s7[3][13]=2; s7[3][14]=3; s7[3][15]=12;
s8[0][0]=13; s8[0][1]=2; s8[0][2]=8; s8[0][3]=4; s8[0][4]=6; s8[0][5]=15; s8[0][6]=11; s8[0][7]=1; s8[0][8]=10; s8[0][9]=9; s8[0][10]=3; s8[0][11]=14; s8[0][12]=5; s8[0][13]=0; s8[0][14]=12; s8[0][15]=7;
s8[1][0]=1; s8[1][1]=15; s8[1][2]=13; s8[1][3]=8; s8[1][4]=10; s8[1][5]=3; s8[1][6]=7; s8[1][7]=4; s8[1][8]=12; s8[1][9]=5; s8[1][10]=6; s8[1][11]=11; s8[1][12]=0; s8[1][13]=14; s8[1][14]=9; s8[1][15]=2;
s8[2][0]=7; s8[2][1]=11; s8[2][2]=4; s8[2][3]=1; s8[2][4]=9; s8[2][5]=12; s8[2][6]=14; s8[2][7]=2; s8[2][8]=0; s8[2][9]=6; s8[2][10]=10; s8[2][11]=13; s8[2][12]=15; s8[2][13]=3; s8[2][14]=5; s8[2][15]=8;
s8[3][0]=2; s8[3][1]=1; s8[3][2]=14; s8[3][3]=7; s8[3][4]=4; s8[3][5]=10; s8[3][6]=8; s8[3][7]=13; s8[3][8]=15; s8[3][9]=12; s8[3][10]=9; s8[3][11]=10; s8[3][12]=3; s8[3][13]=5; s8[3][14]=6; s8[3][15]=11;
h=b;
s=0 ;
i=60;
///////////////////
//for (q=a;q<a+6;q++)
for (j=0;j<6;j++)
{
*(q+j)=*(a+j);
}
convertBinDec(q,l,c);
convert (s1[*l][*c],r);
for (s=0;s<4;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=6;j<12;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s2[*l][*c],r);
for (s=4;s<8;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=12;j<18;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s3[*l][*c],r);
for (s=8;s<12;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=18;j<24;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s4[*l][*c],r);
for (s=12;s<16;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=24;j<30;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s5[*l][*c],r);
for (s=16;s<20;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=30;j<36;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s6[*l][*c],r);
for (s=20;s<24;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
i=60;
k=0;
///////////////////
for (j=36;j<42;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s7[*l][*c],r);
for (s=24;s<28;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////////
i=60;
k=0;
///////////////////
for (j=42;j<48;j++)
{
*(q+k)=*(a+j);
k++;
}
convertBinDec(q,l,c);
convert (s8[*l][*c],r);
for (s=28;s<32;s++)
{
*(h+s)=*(r+i);
i++;
}
////////////////////
}
//------------retourne la foncion xor entre deux bits
int xor (int a, int b)
{
if (a==b)
return 0;
else
return 1;
}
//------------------mettre le resultat de la fonction xor entre les deux tables texte et cles dans resultat
void exor (int *texte , int *cles, int *resultat, int n)// tous de n bits
{
int *p,*q,*v,i;
p=(int*)malloc(n*sizeof(int));
q=(int*)malloc(n*sizeof(int));
v=(int*)malloc(n*sizeof(int));
p=texte;
q=cles;
v=resultat;
for (i=0; i<n;i++)
*(v+i)=xor(*(p+i),*(q+i));
}
//-------------fonction ff permet de combiner la partie droite de texte avec le cles divercifier
//etat(1:affiche les iteration, 0:donner le resultat directement)
void ff(int *texte,int *cles,int *resultat,int etat)// texte de 32 bits cles de 48 bits resultat 32 bits
{
int *p,*q,*texte48,*r,*rr;
char *aff_hex,*aff_hex1,*aff_hex2,*aff_hex3;
aff_hex=(char*)malloc(13*sizeof(char));
aff_hex1=(char*)malloc(13*sizeof(char));
aff_hex2=(char*)malloc(13*sizeof(char));
aff_hex3=(char*)malloc(8*sizeof(char));
r=(int*)malloc(48*sizeof(int));
rr=(int*)malloc(32*sizeof(int));
texte48=(int*)malloc(49*sizeof(int));
p=(int*)malloc(48*sizeof(int));
q=(int*)malloc(48*sizeof(int));
expansion(texte,texte48);
exor(texte48,cles,r,48);
s_box(r,rr);
pp(rr,resultat);
if ( etat == 1)
{
printf(" E(A) :");
affiche_tab(texte48,1,48);
convBinHex48(texte48,aff_hex);
printf (" = ");
puts (aff_hex);
printf(" J :");
affiche_tab(cles,1,48);
convBinHex48(cles,aff_hex1);
printf (" = ");
puts (aff_hex1);
printf(" E(A)+J :");
affiche_tab(r,1,48);
convBinHex48(r,aff_hex2);
printf (" = ");
puts (aff_hex2);
printf(" C :");
affiche_tab(rr,1,32);
convBinHex32(rr,aff_hex3);
printf (" = ");
puts (aff_hex3);
printf("\n");
printf ("\n-----------------------------------------------------\n");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------fonction globale qui permet de crypte le texte donner en parametre en utilisant le cles
//le resutat est envoyer en tcrypte. mode (DES ou DEA),ronde(nombre de ronde),etat(1:affiche les iteration, 0:donner le resultat directement)
void cryptage(int *texte,int *cles,int *tcrypte, int mode, int ronde,int etat)
{
int mod,*t2,*cles2,i,*aux,*cles1,j,*r,*rr,*bloc,k=0,*gauche,*droite;
char *aff_hex, *aff_hex1,*aff_hex5, *aff_hex11, *aff_hex3, *aff_hex55;
mod=1;
aff_hex=(char*)malloc(8*sizeof(char));
aff_hex1=(char*)malloc(8*sizeof(char));
aff_hex5=(char*)malloc(8*sizeof(char));
aff_hex11=(char*)malloc(8*sizeof(char));
aff_hex3=(char*)malloc(32*sizeof(char));
aff_hex55=(char*)malloc(32*sizeof(char));
t2=(int*)malloc(64*sizeof(int));
bloc=(int*)malloc(64*sizeof(int));
gauche=(int*)malloc(33*sizeof(int));
droite=(int*)malloc(33*sizeof(int));
cles2=(int*)malloc(48*sizeof(int));
aux=(int*)malloc(49*sizeof(int));
rr=(int*)malloc(49*sizeof(int));
r=(int*)malloc(32*sizeof(int));
cles1=(int*)malloc(48*16*sizeof(int));
generation(cles,cles1,ronde,etat); //cles1 est de dimension 16*48
if (mode == 1)
{
pi(texte,t2);
}
else
{
for (j=0;j<64;j++)
*(t2+j)=*(texte+j);
}
division(t2,gauche,droite,32);
if (etat == 1)
{
printf ("\n-----------------------------------------------------\n");
printf ("L0 :");
affiche_tab(gauche,1,32);
convBinHex32(gauche,aff_hex3);
printf (" = ");
puts (aff_hex3);
printf ("\n");
printf ("R0 :");
affiche_tab(droite,1,32);
convBinHex32(droite,aff_hex55);
printf (" = ");
puts (aff_hex55);
printf("\n");
}
for(i=0;i<ronde;i++)
{
for(j=0;j<32;j++)
*(aux+j)=*(droite+j);
for(j=0;j<48;j++)
*(cles2+j)=*(cles1+j+i*48);
ff(droite,cles2,r,etat);
exor(r,gauche,rr,32);
for(j=0;j<32;j++)
{
*(droite+j)=*(rr+j);
*(gauche+j)=*(aux+j);
}
if (etat == 1)
{
printf ("L%d :",i+1);
affiche_tab(gauche,1,32);
convBinHex32(gauche,aff_hex3);
printf (" = ");
puts (aff_hex3);
printf ("R%d :",i+1);
affiche_tab(droite,1,32);
convBinHex32(droite,aff_hex55);
printf (" = ");
puts (aff_hex55);
printf("\n");
}
}
k=0;
for (j=0;j<64;j++)
{
if (j<32)
*(bloc+j)=*(droite+j);
else
{
*(bloc+j)=*(gauche+k);
k++;
} }
if (mode == 1)
{
pf(bloc,tcrypte);
}
else
{
for (j=0;j<64;j++)
*(tcrypte+j)=*(bloc+j);
}
printf("\n \n texte cryptee : \n");
////////////////////////////////////////////////////////////////
}
void menu()
{
//LE BOUTON NOUVEAU EST SELECTIONNE PAR DEFAULT.
textcolor(15);
printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n");
printf("³ ³\n");
printf("³ Bien venue sur le progamme ³\n");
printf("³ ³\n");
printf("³ DES ³\n");
printf("³ ³\n");
printf("³ (DATA ENCRYPTION STANDARD) ³\n");
printf("³ ³\n");
printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n");
//LEGENDE
printf("\n\n\n\n\nChoisissez ce que vous voulez faire.\n\n");
textbackground(9);
cprintf("\n\n\n\r h : Aide \n");
printf ("\n");
cprintf("\r k : Cles \n");
printf ("\n");
cprintf("\r t : Texte \n");
printf ("\n");
cprintf("\r r : Nombre de rondes \n");
printf ("\n");
cprintf("\r m : Mode de chiffrement (DES = 1, DEA = 0)\n");
printf ("\n");
cprintf("\r a : Affiche detaille \n");
printf ("\n");
cprintf("\r v : Information Supplementaire \n");
printf ("\n");
cprintf("\r b : Retour au Menu Principale \n");
printf ("\n");
cprintf("\r q : Quitter \n\n\n\n\n");
//SELECTION DES CHOIX.
}
//------------retourne le resultat de recherche du caractere f dans le table t declare comme parametre globale
int recherche(char f){
int i,r=0;
for(i=0;i<16;i++)
if (t[i]==f)
r=1;
return r;
}
//------------permet de convertir un entier decimale en binaire
void convert1 (int d,int *b)
{
int i,j=3, *p,*q;
int div,div2;
for(p=b;p<b+4;p++)
*p=0;
div=d;
do
{
div2 = div / 2;
*(b+j) =(div - div2*2);
j--;
div = div2;
} while (j >= 0 && div2 != 0);
}
//-----------permet de transformer un tableau en hexadecimale en un tableau en binaire
int transforme (char *tab,int *tab1)
{
int *b,*q,*u;
char *p;
q=(int*)malloc(64*sizeof(int));
p=(char*)malloc(16*sizeof(char));
b=(int*)malloc(4*sizeof(int));
int r=1,a,z;
q=tab1;
p=tab;
for(p=tab;p<tab+16;p++)
{
if (recherche(*p)==0)
{
p=tab+16;r=0;
}
a=(int)*p-48;
if (a>=17)
a=a-7;
convert1(a,b);
for(z=0;z<4;z++)
{
*q=*(b+z);
q++;
}
}
return (r);
}
//---------fonction utiliser dans l'animation
void ralentir(void) {
int i0;
for (i0 = 0; i0 < 1500; i0++){
gotoxy(1,1);
cputs("");
}
return;
}
//----------Animation
char *bye[] = {
"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",
"³ ÛÛÛÛÛ Û Û ÛÛÛÛÛÛ ³",
"³ Û Û Û Û Û ³",
"³ Û Û Û Û Û ³",
"³ Û Û Û Û Û ³",
"³ ÛÛÛÛÛ Û ÛÛÛÛÛ ³",
"³ Û Û Û Û ³",
"³ Û Û Û Û ³",
"³ Û Û Û Û ³",
"³ ÛÛÛÛÛ Û ÛÛÛÛÛÛ ³",
"ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´",
"³ ESC FIN DU PROGRAMME....................³",
"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
};
//----------Animation
void effet_aller_retour(int col_depart,int col_fin, int ligne_depart) {
int i1, i2;
int max_menu = sizeof(bye) / sizeof(bye[0]);
// faire sortir le bye vers la droite
for (i2 = 0; i2 <= strlen(bye[0]) ; ++i2) {
for (i1 = 0; i1 < max_menu ; ++i1) {
gotoxy(col_depart,ligne_depart + i1 );
cprintf( "%1s", strlen(bye[i1])+ bye[i1] -i2);
}
ralentir(); // ralentir l'effet
}
ralentir(); // temps d'attente
// deplacer le bye vers la gauche
for (i2 = 0; col_depart-i2 >= col_fin ; ++i2) {
for (i1 = 0; i1 < max_menu ; ++i1) {
gotoxy(col_depart-i2,ligne_depart + i1 );
cprintf( "%1s ", bye[i1] );
}
ralentir(); // ralentir l'effet
}
ralentir(); // temps d'attente
// faire repartir le bye
for (i2 = 0; i2 <= strlen(bye[0]) ; ++i2) {
for (i1 = 0; i1 < max_menu ; ++i1) {
gotoxy(col_fin ,ligne_depart + i1 );
cprintf("%s ",bye[i1] + i2);
}
ralentir(); // ralentir l'effet
}
return ;
}
//----------Animation
char *DES[] = {
".......................................",
".ÛÛÛÛÛÛÛ........ÛÛÛÛÛÛÛÛÛ.....ÛÛÛÛÛÛÛÛ.",
".Û......Û.......Û.............Û........",
".Û.......Û......Û.............Û........",
".Û.......Û......Û.............Û........",
".Û........Û.....ÛÛÛÛÛÛÛ.......ÛÛÛÛÛÛÛÛ.",
".Û.......Û......Û....................Û.",
".Û.......Û......Û....................Û.",
".Û......Û.......Û....................Û.",
".ÛÛÛÛÛÛÛ........ÛÛÛÛÛÛÛÛÛ.....ÛÛÛÛÛÛÛÛ.",
"......................................."
};
//----------Animation
void effet2_haut_bas(int col, int ligne_depart,int ligne_fin) {
int i1, i2;
textbackground(0);
// nbre d'element dans le des
int max_menu = sizeof(DES) / sizeof(DES[0]);
for (i1 = 0; i1 < max_menu ; ++i1) {
for (i2 = 0; i2 < ligne_fin - i1 ; ++i2) {
gotoxy(col,ligne_depart + i2);
cprintf("%s",DES[ (max_menu -1) -i1]);
ralentir(); // ralentir l'effet
gotoxy(col,ligne_depart-1 + i2);
cprintf("%48c",'\0'); // ligne vide
}
}
return ;
}
void main()
{
//DEBUT DU PROGRAMME.
int chargement;
char sel, *cle_hex,*def_cle,*txt_hex,*def_txt,*aff_hex;
int i,rech,rech1, *p,*q,etat1=0,mode1=1,round =16,*b, *t,*tt,*b1,*a , *gauche, *droite,*cles,*tcry;
int *ronde,*etat,*mode,entrer ;
b=(int*)malloc(8*8*sizeof(int));//cle binaire
cle_hex=(char*)malloc(16*sizeof(char));//cle hexadecimal
def_cle=(char*)malloc(16*sizeof(char));//cle hexadecimal par defaut
txt_hex=(char*)malloc(16*sizeof(char));//Texte hexadecimal
def_txt=(char*)malloc(16*sizeof(char));//Texte hexadecimal par defaut
aff_hex=(char*)malloc(16*sizeof(char));//resultat de convertion hexadecimal
b1=(int*)malloc(8*8*sizeof(int));//texte
tcry=(int*)malloc(8*8*sizeof(int));
mode=(int*)malloc(1*sizeof(int));
etat=(int*)malloc(1*sizeof(int));
ronde =(int*)malloc(1*sizeof(int));
def_cle ="133457799BBCDFF1";
def_txt ="0123456789ABCDEF";
*ronde =16;
*etat=1;
*mode=1;
///////////////////////////////////////////Menu/////////////////////
char nom [200]={'R','e','a','l','i','s','e',' ','p','a','r',' ',':','\n','\t','\t','\t','\t','\t','-','A','b','b','a','s','s','i',' ','I','s','s','a','m','\n','\n','\t','\t','\t','\t','\t','-','M','a','b','r','o','u','k',' ','K','h','a','l','e','d','\n','\n','\t','\t','\t','\t','\t','-','O','m','r','a','n','i',' ','S','a','d','e','k','\n'};
int g;
//BARRE DE CHARGEMENT.
printf ("\n");
textcolor(15);
cprintf("Chargement en cours :\n\n\r");
textbackground(11);
for(chargement = 0; chargement < 80; chargement++)
{
cprintf(" "); Sleep(50);
}
entrer=0;
do{
// colonne = 15 ligne_depart = 1 ligne_fin = 24
effet2_haut_bas(18,8, 15); // decouper_haut_bas
if (entrer==0)
{entrer=1;
printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
for(g= 0;g < 80;g++)
{
printf ("%c",nom[g]);Sleep(50);
}
printf ("\n\n\n\n");
textcolor(11);
textbackground(0);
cprintf("SVP Taper une touche pour passer........\r");
}}
while(!kbhit());
getch();
system("cls");
menu();
rech =transforme (def_cle,b);
rech1 =transforme (def_txt,b1);
do
{
sel = getch ();
switch(sel)
{
//AIDE.
case 'h':
system("cls");
textbackground(0);
system("cls");
printf ("l'objectif de ce programme est la realisation d'une implementation du \n\n cryptosysteme a cles secrtet DES en C\n\n");
printf("Ce projet est realiser par :Abbassi Issam, Mabrouk Khaled,Omrani Sadek \n\n 1er annee cycle de formation d'ingenieurs ");
printf("dans le cadre de travaux pratiques de \ncryptographie \n\n");
printf("Date de creation 09/12/2006 ");
printf("\n\n\n Plusieurs fonctions disponibles dans ce programme:");
cprintf("\n\n\n\r h : Aide ");
printf ("\n");
cprintf("\r k : Cles ");
printf ("\n");
cprintf("\r t : Texte ");
printf ("\n");
cprintf("\r r : Nombre de rondes ");
printf ("\n");
cprintf("\r m : Mode de chiffrement (DES = 1, DEA = 0)");
printf ("\n");
cprintf("\r a : Affiche detaille ");
printf ("\n");
cprintf("\r v : Information Supplementaire ");
printf ("\n");
cprintf("\r b : Retour au Menu Principale ");
cprintf("\r q : Quitter \n\n\n");
textcolor(4);
textbackground(0);
cprintf("\rREMARQUES \n\n\n\rSi l'utilisateur utilse la fonction de chiffrement sans modifier \n\n \rles parametres de cryptage (cles, texte, nb de ronde.... )\n\n");
cprintf("\rle systeme chiffre avec les valeurs par defaut: \n\n");
cprintf("\rcles = 13345779 9BBCDFF1 \n\n");
cprintf("\rtexte = 0123456789ABCDEF\n\n");
cprintf("\rNombre de ronde = 16 ");
break;
//CLES.
case 'k': system("cls");
textbackground(0);
system("cls");
printf("\n Donner votre cles en Hexadicimal : \n\n");
scanf("%s",cle_hex);
rech=transforme (cle_hex,b);
if (rech ==0)
{
printf ("\n Desole, Votre cles est non valide SVP verifier votre cles... \n\n Le systeme va choisir le cles par defaut... \n");
rech =transforme (def_cle,b);
getch ();
system("cls");
textbackground(0);
system("cls");
menu ();
}
else
{
printf ("\n Cles valide.... \n");
getch ();
system("cls");
textbackground(0);
system("cls");
menu ();
}
break;
//TEXTE.
case 't':
system("cls");
textbackground(0);
system("cls");
printf("\n Donner votre Texte en Hexadicimal : \n\n");
scanf("%s",txt_hex);
rech1=transforme (txt_hex,b1);
if (rech1 ==0)
{
printf ("\n Desole, Votre Texte est non valide SVP verifier votre Texte... \n\n Le systeme va choisir le Texte par defaut... \n");
rech =transforme (def_txt,b1);
getch ();
system("cls");
textbackground(0);
system("cls");
menu ();
}
else
{
printf ("\n Texte valide.... \n");
getch ();
system("cls");
textbackground(0);
system("cls");
menu ();
}
break;
//RONDE.
case 'r': do
{
textbackground(0);
system("cls");
printf("\nDonner le nombre de rondes (compris entre 1 et 16:) \n\n");
scanf("%d",ronde);
}
while ((*ronde <1) || (*ronde >16));
system("cls");
menu();
break;
//MODE DE CHIFFREMENT.
case 'm':
do
{
textbackground(0);
system("cls");
printf ("\n\n Donner SVP le mode du cryptage ( DES = 1 ; DEA = 0 ):\n");
printf("\t");
scanf (" %d",mode);
}
while ((*mode !=1) && (*mode !=0));
if ( *mode == 1)
printf("\n Vous avez choisi le mode DES :\n\n\n");
else
printf("\n Vous avez choisi le mode DEA :\n\n\n");
round =*ronde;
etat1 =*etat;
mode1 =*mode;
printf("\n Votre texte en claire est :\n\n");
printf("\n EN BINAIRE :\n");
affiche_tab(b1,1,64);
printf("\n EN HEXADECIMALE :\n");
convBinHex64(b1,aff_hex);
puts (aff_hex);
getch ();
cryptage(b1,b,tcry,mode1,round,etat1);
printf("\n");
printf("\n EN BINAIRE :\n");
affiche_tab(tcry,1,64);
printf("\n EN HEXADECIMALE :\n");
convBinHex64(tcry,aff_hex);
puts (aff_hex);
break;
//INFORMATION SUPPLEMENTAIRE.
case 'v':
system("cls");
textbackground(0);
system("cls");
printf("\n\n\t\tPresentation exhaustive du systeme DES\n\n\n\n");
printf("Ce systeme de chiffrement a cles privee est le plus connu. Un cryptosysteme\n\npermet a deux protagonistes");
printf("de communiquer ensemble sur un canal peu sur lorsqu'\n\nun opposant souhaite espionner cette conversation. Evidemment");
printf("cet opposant ne\n\ndoit pas comprendre les informations qui sont echangees. \n\n\n");
printf("Pour un cryptosysteme on définie les expressions suivantes: \n\n\n");
textcolor(13);
textbackground(0);
cprintf(" \r- Texte clair :");
printf(" Information que l'emetteur souhaite transmettre au recepteur\n\n\t\t(Ex : texte en francais, donnee numerique etc...).\n\n\n");
cprintf(" \r- Chiffrement :");
printf(" Processus de transformation d’un message M de telle maniere\n\n\t\ta le rendre incomprehensible. Ce processus est base sur une\n\n\t\tfonction de chiffrement E et permet de ");
printf("generer ainsi un message\n\n\t\tchiffre C = E(M).\n\n\n");
cprintf(" \r- Dechiffrement: ");
printf("Processus de reconstruction du message clair a partir du\n\n\t\tmessage chiffre, base sur une fonction de dechiffrement D.\n");
break;
//RETOUR AU MENU PRINCIPALE.
case 'b':
system("cls");
textbackground(0);
system("cls");
menu();
break;
//AFFICHE DETAILLES.
case 'a':
do
{
textbackground(0);
system("cls");
printf ("\n\n vous voulez vraiment afficher les detaille du cryptage ( OUI = 1 ; NON = 0 ):\n\n");
printf("\t");
scanf (" %d",etat);
}
while ((*etat !=1) && (*etat !=0));
system("cls");
menu ();
break;
//QUITTER.
case 'q':
textbackground(0);
system("cls");
system("cls");
_setcursortype(_NOCURSOR);
textcolor(LIGHTGREEN);
gotoxy(30, 3);
cprintf("TAPER ESC pour sortir ");
do {
textcolor(LIGHTCYAN);
// colonne depart = 37 colonne fin = 15 ligne depart = 4
effet_aller_retour(37,15, 10);
} while (!kbhit());
exit(0);
break;
}
//0 = QUITTER.
}
while (sel != 'q');
free(tcry);
getch();
}
Historique
- 09 février 2007 12:57:19 :
- ajout de la source
- 21 mars 2007 13:33:57 :
- le compilateur utilisé
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
cryptage [ par skysee ]
bonjour,je dois crypter une trame avec un ou exclusif. La trame est une CString. Voici ma fonction:CString Ccrypto::crypter(CString trameAcrypter){ CS
Probléme de variable externe [ par mateo40 ]
J'ai un problème !! (pas tres original comme intro...)Je travaile sous Builder C++.J'ai 2 fichiers DES.h et DES.cpp qui contiennent une classe dédiée
CRYPTAGE PAR XOR [ par gloom ]
gloomygrimune question c'est koi un cryptage par XOR d'un octet et est ce que il y a une fonction qui permet un affichage d'une image sous la console
Algo de Cryptage [ par LordBob ]
Salut a tous, je voudrai simplement avoir kelke info pour créé un algorithme de cryptage, savoir comment ca ce passe, ce kil fo faire un peu tout ko
cryptage RSA [ par moicmoi ]
Bon je me doute que je vais passer pour un boulet mais j'aurai besoin avant jeudi d'un code source du cryptage RSA en LANGAGE C. Mais un code tout si
Cryptage RSA [ par ritchie00 ]
Salut,Qqun saurait où je peux trouver une API C++ de chiffrement/dechiffrement RSA, qui marcherait avec des certificats et des tailles de clés paramét
CRYPTAGE DE DONNEES [ par Smokhasch ]
Salut à tous,J'ai un devoir de langage C à rendre pour vendredi et je ne comprends strictement rien à ce sujet (à cause de problème de santé j'ai raté
Cryptage par l'algorithme MD5 [ par LSRS ]
[red]Salut tout le monde!!!J'ai un problème avec l'algorithme MD5 de RSA... je voudrais bien comprendre le mécanisme avec lequel il travaille...En plu
Le cryptage par MD5 de RSA [ par LSRS ]
Salut tout le monde...J'ai un très grand problème avec l'algorithme de hachage MD5 qui réprésente le squelette de mon stage d'été... Je n'arrive pas à
cryptage md5 [ par laflef ]
salut je cherche le code source de l'algorithme de cryptage md5 base sur le hachage inversible
|
Derniers Blogs
[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril CERTIFICATIONS BETA .NET 4CERTIFICATIONS BETA .NET 4 par KooKiz
Les inscriptions pour les certifications beta .NET 4 ont commencé. L'inscription est offerte pour les examens suivants : - 71-511, TS: Windows Applications Development with Microsoft .NET Framework 4 - 71-515, TS: Web Applications Development with...
Cliquez pour lire la suite de l'article par KooKiz [MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2[MIX 2010] - MICROSOFT TRANSLATOR TECHNOLOGY PREVIEW V2 par redo
J'imagine que la plupart d'entre vous connaissent bien et utilisent le service de traduction de Google, mais connaissez-vous celui de Microsoft . Microsoft Translator ? Effectivement, Microsoft nous annoncé le lancement version 2 de la Technologie Preview...
Cliquez pour lire la suite de l'article par redo LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010!LANCEMENT EN PREVIEW DE CYCLONE LORS DES TECHDAYS 2010! par MPOWARE
Toutes les vidéos de ce lancement sont en ligne!
Partie I - Intro
http://www.youtube.com/watch?v=LkQzTQ8T6CA
Partie II - Démo 1
http://www.youtube.com/watch?v=drAhYQ7lqvo
Partie III - Démo 2
http://www.youtube.com/watch?v=c8KM_1Gqybc...
Cliquez pour lire la suite de l'article par MPOWARE
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|