2012-06-21 34 views
-4

我一直在嘗試一個簡單的加密算法,這實際上是被用來加密2個字,i。在文件image.jpg的試圖與ABCABC,然後將加密的數據應該出來爲aboabo爲重點AB(請注意它的資本)。fwrite的在寫錯誤的字符到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(); 
} 

到現在我試圖與發現的堆棧溢出和其他頁面中的fwrite的基於網絡的問題,但並沒有得到相關的解決方案,我仍然困惑的是爲什麼FWRITE在寫此搜索aboabg。 JPG,而不是aboabo爲重點AB

+5

哇..這是一個很大的代碼(* 479 *行),您能不能給我們[短的,獨立的,正確的(可編譯),示例](http://sscce.org/)的任何機會問題? – Levon

+0

嗯,密碼的東西其實有很多代碼。 – user1026137

+0

-1用於在完成後刪除問題的正文。如果我能-1多次,我會 –

回答

1

此:

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

是錯誤的,壞了,一nd正在導致緩衝區溢出,因爲sprintf()將終止它正在創建的字符串。

你應該只調用fwrite()直接與性格:

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

而且,你當然應該檢查的fwrite()返回值,I/O可能會失敗!

沒有違法,但要找到這樣的加密代碼的錯誤使我相信你要麼不是一個非常有經驗的程序員,或者不是一個非常有經驗的C程序員。這兩個理由足以認真地質疑編寫加密代碼的想法。

+0

我想這部分是從下面的代碼 \t生成正確的,只是我們得到差(i = 0; I <3;我++) \t { \t的sprintf( &ZZZ, 「%C」,YYY [I]); \t的fwrite(&ZZZ,的sizeof(ZZZ),1,FPTEMP); \t} \t的strcpy(yyy1,rightarr [temprightpos]名爲.str); \t for(i = 0; i <3; i ++) \t { \t sprintf(&zzz,「%c」,yyy1 [i]); \t的fwrite(&ZZZ,的sizeof(ZZZ),1,FPTEMP); \t} – user1026137