我一直在尝试一种简单的加密算法,它实际上是用来加密 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