-4

i been trying out an simple encryption algorithm, which is actually been used to encrypt 2 words, i tried with abcabc in the image.jpg file, and then the encrypted data should be coming out as aboabo for the key AB (please note its capital).

#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();
}

till now i tried with finding many fwrite based issues on stack overflow and other pages online, but didn't got a relevant solution, am still in confusion that why does fwrite is writing aboabg in image1.jpg instead of aboabo for the key AB

4

1 に答える 1

1

これ:

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

は間違っていて壊れており、sprintf()作成中の文字列を終了させるため、バッファ オーバーフローを引き起こしています。

fwrite()キャラクターを直接呼び出してください:

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

また、もちろん の戻り値をチェックする必要があります。I fwrite()/O は失敗する可能性があります。

気分を害することはありませんが、暗号化コードでこの種の間違いを見つけると、あなたは経験豊富なプログラマーではないか、経験豊富な C プログラマーではないのだと思います。どちらも、暗号化コードを書くという考えに真剣に疑問を呈するのに十分な理由です。

于 2012-06-21T13:50:55.430 に答える