-4

我一直在尝试一种简单的加密算法,它实际上是用来加密 2 个单词的,我尝试在 image.jpg 文件中使用abcabc,然后加密的数据应该作为密钥AB的aboabo出来(请注意它的大写)。

#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在 image1.jpg中写aboabg而不是aboabo作为密钥AB

4

1 回答 1

1

这个:

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

错误且损坏,并导致缓冲区溢出,因为sprintf()将终止它正在创建的字符串。

您应该fwrite()直接使用角色调用:

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

此外,您当然应该检查 的返回值fwrite()I/O 可能会失败!

无意冒犯,但是在密码代码中发现这种错误让我相信你要么不是一个非常有经验的程序员,要么不是一个非常有经验的 C 程序员。两者都有足够的理由认真质疑编写密码学代码的想法。

于 2012-06-21T13:50:55.430 回答