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
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
hmmm, les choses cryptographiques ont vraiment beaucoup de codes. – user1026137
-1 pour supprimer le corps de votre question lorsque vous avez terminé. si je pouvais -1 plusieurs fois, je –