2012-06-21 2 views
-4

J'ai essayé un algorithme de cryptage simple, qui est effectivement utilisé pour crypter 2 mots, j'ai essayé avec abcabc dans le fichier image.jpg, puis crypté les données devraient sortir comme aboabo pour la clé AB (s'il vous plaît noter son capital).fwrite été écrit un mauvais caractère dans le fichier en C

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
#include<math.h> 
struct array 
{ 
    unsigned char str[4]; 
}; 
int n1,n2,b,sum=0,trans[6]; 
struct array leftarr[16],rightarr[16],temparr[16],temparr1[16],matrixleft[4][4],matrixright[4][4]; 
void copier(int arrspec) 
{ 
    int i,j; 
    if(arrspec==0) 
    { 
     for(i=0;i<16;i++) 
     temparr[i]=leftarr[i]; 
     //strcpy(temparr[i].str,leftarr[i].str); 
    } 
    else if(arrspec==1) 
    { 
     for(i=0;i<16;i++) 
     temparr1[i]=rightarr[i]; 
     //strcpy(temparr[i].str,rightarr[i].str); 
    } 
} 
void calculator(char key[16]) 
{ 
    int keylength,i,num1=0,num2=0,sumtemp; 
    char temp[20]; 
    keylength=strlen(key); 
    printf("%s is the key and its length is %d",key,keylength); 
    b=18-keylength; 
    printf("\n%d is the base value",b); 
    for(i=0;i<keylength;i++) 
    { 
     sum+=((int)key[i])*(pow(b,i+1)); 
    } 
    printf("\n%d is the sum",sum); 
    itoa(sum,temp,10); 
    sumtemp=sum; 
    for(i=strlen(temp);i>=0;i--) 
    { 
     num1+=(sumtemp%10)*i; 
     sumtemp=sumtemp/10; 
    } 
    printf("\n%d is the num1",num1); 
    n1=sum%num1; 
    while(n1>64) 
    n1-=64; 
    if(n1==0) 
    n1=num1; 
    printf("\n%d is the n1",n1); 

    sumtemp=sum; 
    for(i=1;i<=strlen(temp);i++) 
    { 
     num2+=(sumtemp%10)*i; 
     sumtemp=sumtemp/10; 
    } 
    printf("\n%d is the num2",num2); 
    n2=sum%num2; 
    while(n2>64) 
    n2-=64; 
    if(n2==0) 
    n2=num2; 
    printf("\n%d is the n2",n2); 

} 
void leftshift(int arrspec) 
{ 
    if(arrspec==0) 
    { 
     copier(0); 
     leftarr[0]=temparr[2]; 
     leftarr[1]=temparr[11]; 
     leftarr[2]=temparr[3]; 
     leftarr[3]=temparr[12]; 
     leftarr[4]=temparr[0]; 
     leftarr[5]=temparr[9]; 
     leftarr[6]=temparr[1]; 
     leftarr[7]=temparr[10]; 
     leftarr[8]=temparr[6]; 
     leftarr[9]=temparr[15]; 
     leftarr[10]=temparr[7]; 
     leftarr[11]=temparr[8]; 
     leftarr[12]=temparr[4]; 
     leftarr[13]=temparr[13]; 
     leftarr[14]=temparr[5]; 
     leftarr[15]=temparr[14]; 
    } 
    else if(arrspec==1) 
    { 
     copier(1); 
     rightarr[0]=temparr1[2]; 
     rightarr[1]=temparr1[11]; 
     rightarr[2]=temparr1[3]; 
     rightarr[3]=temparr1[12]; 
     rightarr[4]=temparr1[0]; 
     rightarr[5]=temparr1[9]; 
     rightarr[6]=temparr1[1]; 
     rightarr[7]=temparr1[10]; 
     rightarr[8]=temparr1[6]; 
     rightarr[9]=temparr1[15]; 
     rightarr[10]=temparr1[7]; 
     rightarr[11]=temparr1[8]; 
     rightarr[12]=temparr1[4]; 
     rightarr[13]=temparr1[13]; 
     rightarr[14]=temparr1[5]; 
     rightarr[15]=temparr1[14]; 
    } 
} 
void downshift(int arrspec) 
{ 
    if(arrspec==0) 
    { 
     copier(0); 
     leftarr[0]=temparr[15]; 
     leftarr[1]=temparr[6]; 
     leftarr[2]=temparr[14]; 
     leftarr[3]=temparr[7]; 
     leftarr[4]=temparr[0]; 
     leftarr[5]=temparr[8]; 
     leftarr[6]=temparr[1]; 
     leftarr[7]=temparr[9]; 
     leftarr[8]=temparr[2]; 
     leftarr[9]=temparr[10]; 
     leftarr[10]=temparr[3]; 
     leftarr[11]=temparr[11]; 
     leftarr[12]=temparr[4]; 
     leftarr[13]=temparr[12]; 
     leftarr[14]=temparr[5]; 
     leftarr[15]=temparr[13]; 
    } 
    else if(arrspec==1) 
    { 
     copier(1); 
     rightarr[0]=temparr1[15]; 
     rightarr[1]=temparr1[6]; 
     rightarr[2]=temparr1[14]; 
     rightarr[3]=temparr1[7]; 
     rightarr[4]=temparr1[0]; 
     rightarr[5]=temparr1[8]; 
     rightarr[6]=temparr1[1]; 
     rightarr[7]=temparr1[9]; 
     rightarr[8]=temparr1[2]; 
     rightarr[9]=temparr1[10]; 
     rightarr[10]=temparr1[3]; 
     rightarr[11]=temparr1[11]; 
     rightarr[12]=temparr1[4]; 
     rightarr[13]=temparr1[12]; 
     rightarr[14]=temparr1[5]; 
     rightarr[15]=temparr1[13]; 
    } 
} 
void rightshift(int arrspec) 
{ 
    if(arrspec==0) 
    { 
     copier(0); 
     leftarr[0]=temparr[15]; 
     leftarr[1]=temparr[0]; 
     leftarr[2]=temparr[8]; 
     leftarr[3]=temparr[1]; 
     leftarr[4]=temparr[9]; 
     leftarr[5]=temparr[2]; 
     leftarr[6]=temparr[10]; 
     leftarr[7]=temparr[3]; 
     leftarr[8]=temparr[11]; 
     leftarr[9]=temparr[4]; 
     leftarr[10]=temparr[12]; 
     leftarr[11]=temparr[5]; 
     leftarr[12]=temparr[13]; 
     leftarr[13]=temparr[6]; 
     leftarr[14]=temparr[14]; 
     leftarr[15]=temparr[7]; 
    } 
    else if(arrspec==1) 
    { 
     copier(1); 
     rightarr[0]=temparr1[15]; 
     rightarr[1]=temparr1[0]; 
     rightarr[2]=temparr1[8]; 
     rightarr[3]=temparr1[1]; 
     rightarr[4]=temparr1[9]; 
     rightarr[5]=temparr1[2]; 
     rightarr[6]=temparr1[10]; 
     rightarr[7]=temparr1[3]; 
     rightarr[8]=temparr1[11]; 
     rightarr[9]=temparr1[4]; 
     rightarr[10]=temparr1[12]; 
     rightarr[11]=temparr1[5]; 
     rightarr[12]=temparr1[13]; 
     rightarr[13]=temparr1[6]; 
     rightarr[14]=temparr1[14]; 
     rightarr[15]=temparr1[7]; 
    } 
} 
void upshift(int arrspec) 
{ 
    if(arrspec==0) 
    { 
     copier(0); 
     leftarr[0]=temparr[8]; 
     leftarr[1]=temparr[0]; 
     leftarr[2]=temparr[9]; 
     leftarr[3]=temparr[1]; 
     leftarr[4]=temparr[14]; 
     leftarr[5]=temparr[6]; 
     leftarr[6]=temparr[15]; 
     leftarr[7]=temparr[7]; 
     leftarr[8]=temparr[12]; 
     leftarr[9]=temparr[4]; 
     leftarr[10]=temparr[13]; 
     leftarr[11]=temparr[5]; 
     leftarr[12]=temparr[3]; 
     leftarr[13]=temparr[10]; 
     leftarr[14]=temparr[2]; 
     leftarr[15]=temparr[11]; 
    } 
    else if(arrspec==1) 
    { 
     copier(1); 
     rightarr[0]=temparr1[8]; 
     rightarr[1]=temparr1[0]; 
     rightarr[2]=temparr1[9]; 
     rightarr[3]=temparr1[1]; 
     rightarr[4]=temparr1[14]; 
     rightarr[5]=temparr1[6]; 
     rightarr[6]=temparr1[15]; 
     rightarr[7]=temparr1[7]; 
     rightarr[8]=temparr1[12]; 
     rightarr[9]=temparr1[4]; 
     rightarr[10]=temparr1[13]; 
     rightarr[11]=temparr1[5]; 
     rightarr[12]=temparr1[3]; 
     rightarr[13]=temparr1[10]; 
     rightarr[14]=temparr1[2]; 
     rightarr[15]=temparr1[11]; 
    } 
} 
void cycle(int arrspec) 
{ 
    int i,j; 
    if(arrspec==0) 
    { 
     copier(0); 
     leftarr[0]=temparr[4]; 
     leftarr[1]=temparr[0]; 
     leftarr[2]=temparr[1]; 
     leftarr[3]=temparr[2]; 
     leftarr[4]=temparr[8]; 
     leftarr[5]=temparr[6]; 
     leftarr[6]=temparr[10]; 
     leftarr[7]=temparr[3]; 
     leftarr[8]=temparr[12]; 
     leftarr[9]=temparr[5]; 
     leftarr[10]=temparr[9]; 
     leftarr[11]=temparr[7]; 
     leftarr[12]=temparr[13]; 
     leftarr[13]=temparr[14]; 
     leftarr[14]=temparr[15]; 
     leftarr[15]=temparr[11]; 
    } 
    else if(arrspec==1) 
    { 
     copier(1); 
     rightarr[0]=temparr1[4]; 
     rightarr[1]=temparr1[0]; 
     rightarr[2]=temparr1[1]; 
     rightarr[3]=temparr1[2]; 
     rightarr[4]=temparr1[8]; 
     rightarr[5]=temparr1[6]; 
     rightarr[6]=temparr1[10]; 
     rightarr[7]=temparr1[3]; 
     rightarr[8]=temparr1[12]; 
     rightarr[9]=temparr1[5]; 
     rightarr[10]=temparr1[9]; 
     rightarr[11]=temparr1[7]; 
     rightarr[12]=temparr1[13]; 
     rightarr[13]=temparr1[14]; 
     rightarr[14]=temparr1[15]; 
     rightarr[15]=temparr1[11]; 
    } 
} 



void generate(int l1,int l2,int l3,int posinarr,int arrspec) 
{ 
    int i,j; 
    l3=l3-posinarr; 
    if(arrspec==0) 
    { 
    for(i=0;i<16;i++) 
    { 
     leftarr[i].str[0]=(unsigned char)l1; 
     leftarr[i].str[1]=(unsigned char)l2; 
     leftarr[i].str[2]=(unsigned char)(l3+i); 
     leftarr[i].str[3]='\0'; 
     //sprintf(leftarr[i],"%c%c%c",l1,l2,l3+i); 
    } 
    } 
    else if(arrspec==1) 
    { 
    for(i=0;i<16;i++) 
    { 
     rightarr[i].str[0]=(unsigned char)l1; 
     rightarr[i].str[1]=(unsigned char)l2; 
     rightarr[i].str[2]=(unsigned char)(l3+i); 
     rightarr[i].str[3]='\0'; 
    } 
    } 
/*printf("start of print\n"); 
for(i=0;i<16;i++) 
{ 
for(j=0;j<3;j++) 
printf("%c",leftarr[i].str[j]); 
printf("\n"); 
} 
printf("end of print\n"); 

getch();*/ 
} 
void randomize() 
{ 
    int i,c,j; 
    for(i=0;i<n1;i++) 
    { 
     c=i%5; 
     switch(c) 
     { 
      case 0:cycle(0);cycle(1);break; 
      case 1:upshift(0);upshift(1);break; 
      case 2:rightshift(0);rightshift(1);break; 
      case 3:downshift(0);downshift(1);break; 
      case 4:leftshift(0);leftshift(1);break; 
      default:printf("this should not be running"); 
     } 
    } 
} 
void matrix() 
{ 
    int i,j,k=0; 
    for(i=0;i<4;i++) 
    for(j=0;j<4;j++) 
    { 
     strcpy(matrixleft[i][j].str,leftarr[k].str); 
     strcpy(matrixright[i][j].str,rightarr[k].str); 
     k++; 
    } 
} 
void encrypt(int data[6],FILE *fptemp) 
{ 
    unsigned long int leftindex,rightindex,leftarray,leftpos,rightarray,rightpos; 
    int leftarrx,leftarry,rightarrx,rightarry; 
    int i,dump,j,templeftpos,temprightpos; 
    unsigned char zzz,yyy[4],yyy1[4]; 
    printf("\ndata set is %d %d %d %d %d %d\n",data[0],data[1],data[2],data[3],data[4],data[5]); 
    leftindex=(pow(256,2)*(int)data[0])+(pow(256,1)*(int)data[1])+(pow(256,0)*(int)data[2]); 
    printf("leftindex is %lu",leftindex); 
    rightindex=(pow(256,2)*(int)data[3])+(pow(256,1)*(int)data[4])+(pow(256,0)*(int)data[5]); 
    printf("rightindex is %lu",rightindex); 
    leftarray=leftindex/16; 
    leftpos=leftindex%16; 
    printf("\n%lu is in array(%lu) at position %lu",leftindex,leftarray,leftpos); 
    rightarray=rightindex/16; 
    rightpos=rightindex%16; 
    printf("\n%lu is in array(%lu) at position %lu",rightindex,rightarray,rightpos); 
    generate((int)data[0],(int)data[1],(int)data[2],leftpos,0); 
    generate((int)data[3],(int)data[4],(int)data[5],rightpos,1); 
    randomize(); 
    matrix(); 
    /*code to find the substitute*/ 
    /* 
    leftarrx=leftpos/4; 
    leftarry=leftpos%4; 
    rightarrx=rightpos/4; 
    rightarry=rightpos%4; 
    if(leftarrx==rightarrx&&leftarry==rightarry) 
    { 
     printf("this is an impossible situation, program terminated\n"); 
     exit(0); 
     getch(); 
    } 
    else if(leftarrx==rightarrx&&leftarry!=rightarry) 
    { 
     if(leftarry!=0&&leftarry 
    } 
    */ 
    leftpos--; 
    rightpos--; 
    if(leftpos==-1) 
    leftpos=15; 
    if(rightpos==-1) 
    rightpos=15; 
    templeftpos=(int)leftpos; 
    temprightpos=(int)rightpos; 
    printf("%lu %lu %d %d",leftpos,rightpos,templeftpos,temprightpos); 
    printf("%s %s",leftarr[templeftpos].str,rightarr[temprightpos].str); 
    strcpy(yyy,leftarr[templeftpos].str); 
    for(i=0;i<3;i++) 
    { 
    sprintf(&zzz,"%c",yyy[i]); 
    fwrite(&zzz,sizeof(zzz),1,fptemp); 
    } 
    strcpy(yyy1,rightarr[temprightpos].str); 
    for(i=0;i<3;i++) 
    { 
    sprintf(&zzz,"%c",yyy1[i]); 
    fwrite(&zzz,sizeof(zzz),1,fptemp); 
    } 
/* for(i=0;i<3;i++) 
    { 
     dump=(int)leftarr[leftpos].str[i]; 
     fwrite(&(char)dump,sizeof(char),1,fptemp); 
    } 
    for(i=0;i<3;i++) 
    { 
     dump=(int)rightarr[rightpos].str[i]; 
     fwrite(&(char)dump,sizeof(char),1,fptemp); 
    }*/ 
// fwrite(&leftarr[leftpos],sizeof(char[3]),1,fptemp); 
    // fwrite(&rightarr[rightpos],sizeof(char[3]),1,fptemp); 
    /*end of substitute finding*/ 
     //fwrite(&temp,sizeof(temp),readcount,fptemp); 

// getch(); 
} 
void main() 
{ 
    FILE *fp,*fp1; 
    int i,j=0,flag; 
    unsigned char temp; 
    char keytext[16],zzz; 
    short int a; 
    size_t readcount; 
    clrscr(); 
    printf("input the key text(max 16 characters):"); 
    scanf("%s",&keytext); 
    calculator(keytext); 
    fp=fopen("image.jpg","rb"); 
    fp1=fopen("image1.jpg","wb"); 
    //trans[0]=256;trans[1]=256;trans[2]=256;trans[3]=256;trans[4]=256;trans[5]=256; 
    while(!feof(fp)) 
    { 
     readcount=fread(&temp,sizeof(temp),1,fp); 
     flag=1; 
     if(!readcount)break; 
     trans[j]=(int)temp; 
     j++; 
     if(j==6) 
     { 
     encrypt(trans,fp1); 
     j=0; 
     flag=0; 
     trans[0]=256;trans[1]=256;trans[2]=256;trans[3]=256;trans[4]=256;trans[5]=256; 
     } 
/*  a=temp; 
     a+=n2; 
     temp=a;*/ 
//  fwrite(&temp,sizeof(temp),readcount,fp1); 
//  printf("%c-%d-%c-%d\n",a,a,temp,temp); 
    } 
    if(flag==1) 
    { 
     for(i=0;i<6;i++) 
     { 
      if((int)trans[i]<256) 
      { 
       sprintf(&zzz,"%c",trans[i]); 
       fwrite(&zzz,sizeof(zzz),1,fp1); 
      } 
     } 
    } 
    fclose(fp); 
    fclose(fp1); 
    getch(); 
} 

jusqu'à maintenant j'essayé de trouver de nombreux fwrite problèmes en fonction de débordement de pile et d'autres pages en ligne, mais n'a pas obtenu une solution pertinente, suis encore dans la confusion que pourquoi ne fwrite écrit aboabg dans image1. jpg au lieu de aboabo pour la clé AB

+5

Wow .. c'est beaucoup de code (* 479 lignes *), toute chance que vous pouvez nous donner [Short, Self Contained, Correct (Compilable), Exemple] (http://sscce.org/) du problème? – Levon

+0

hmmm, les choses cryptographiques ont vraiment beaucoup de codes. – user1026137

+0

-1 pour supprimer le corps de votre question lorsque vous avez terminé. si je pouvais -1 plusieurs fois, je –

Répondre

1

Ce:

sprintf(&zzz,"%c",trans[i]); 
fwrite(&zzz,sizeof(zzz),1,fp1); 

est faux et cassé, un nd provoque un débordement de tampon car sprintf() mettra fin à la chaîne qu'il est en train de créer.

Vous devez simplement appeler fwrite() avec le caractère directement:

fwrite(trans + i, 1, 1, fp1); 

En outre, vous devez évidemment vérifier la valeur de retour de fwrite(), E/S peut échouer!

Sans vouloir offenser, mais trouver ce genre d'erreur dans le code cryptographique me fait croire que vous n'êtes pas un programmeur très expérimenté, ou pas un programmeur C très expérimenté. Les deux sont une raison suffisante pour remettre sérieusement en question l'idée d'écrire du code cryptographique.

+0

je suppose que cette partie est correcte, que nous obtenons erreur générée à partir du code ci-dessous \t for (i = 0; i <3; i ++) \t { \t sprintf (& zzz, "% c", yyy [i]); \t fwrite (& zzz, sizeof (zzz), 1, fptemp); \t} \t strcpy (yyy1, rightarr [temprightpos] .str); \t pour (i = 0; i <3; i ++) \t { \t sprintf (& zzz, "% c", yyy1 [i]); \t fwrite (& zzz, sizeof (zzz), 1, fptemp); \t} – user1026137

Questions connexes