文件的循环移位加密和异或加密方法,让你的小片从此遁形
文件加密的几种方式
本部分内容主要讨论文件的两种加密方式,一种是循环移位加密,一种是异或加密。
循环移位加密
先了解一下什么是循环移位
//循环移位
//0101 0111 左移2位 0101 1101
//stp1: 0101 0111 <<2 0101 1100
//stp2: 0101 0111 >>6 1111 1101 mask 0000 0011
// 0000 0011 & 0000 0001
//0101 1100 | 0000 0001 结果:0101 1101
//右移
//0101 0101 右移2位 0101 0101
//stp1: 0101 0101 >>2 1101 0101 0101 0101>>6 0100 0000
//stp2: 0000 0011 mask <<6 1100 0000 保留最后两位
//stp3: 0101 0101 | ~1100 0000 0111 1111
//stp4: 1101 0101 & 0111 1111 0101 0101
通过真值表,我们可以知道任何数与1或置1,与0或置0
与1与可以保留原值,以上就是这样的一个原则。而异或操作则是相异则或,相同保持原值。与同一个数异或两次即可得到原值,这也为加密提供了一个途径。
下面给出代码,能够查看每一个数值的二进制
void bitDis(int n)
{
int m = 32;
while (m--)
{
if(n&(1<<m))
printf("1");
else
printf("0");
if(m%8==0)
printf(" ");
}
printf("\n");
}
通过这个函数能够查看到每个值的二进制。
下面给出循环移位的代码:
void circleMove(int*p,int n)//输入一个数的指针,n表示移位多少,向左移为正,右移为负数
{
int m;
m=n>0? n:-n;
unsigned int mask = 0;
while(m--)
{
mask|=1<<m;
}
if (n>0)
{
*p=*p<<n |(*p>>32-n)&(mask);
}
else
{
*p = ((*p>>-n)) & ~(mask<<(32-(-n))) | (*p)<<(32-(-n));
}
}
下面我们补充一下unsigned char 类型的数值在右移的过程中高位是自动补零的,而不是补1。这样为循环移位提供了便利,下面给出循环移位的加密代码:
void encode(char*p,int len)
{
for(int i= 0;i<len;i++)
{
unsigned char ch=p[i];
p[i]=((ch<<1)|(ch>>7));
}
}
解秘代码:
void decode(char*p,int len)
{
for(int i= 0;i<len;i++)
{
unsigned char ch=p[i];
p[i]=((ch>>1)|(ch<<7));
}
}
主菜单函数:
int mymenu()
{
while(1)
{
system("cls");
printf(" what do you want do? \n");
printf(" 1.encode file 2.decode file 3.quit system\n");
int a = 0;
scanf("%d",&a);
switch (a) {
case 1:
char bencod[20];
char aencod[20];
printf("please input your file name(before encode):");
scanf("%s",bencod);
printf("please input your file name(after encode):");
scanf("%s",aencod);
FILE *fpr = fopen(bencod,"rb");
FILE *fpw = fopen(aencod,"wb");
if(NULL==fpr)
return -1;
if (NULL==fpw)
return -1;
int len=0;
char buf[1024];
while((len=fread((void*)buf,1,1024,fpr))>0)
{
encode(buf,len);
fwrite(buf,len,1,fpw);
}
printf("encode sucess!!\n");
fclose(fpr);
fclose(fpw);
break;
case 2:
char bdecod[20];
char adecod[20];
printf("please input your file name(before decode):");
scanf("%s",bdecod);
printf("please input your file name(after decode):");
scanf("%s",adecod);
FILE * fpr1 = fopen(bdecod,"rb");
FILE * fpw1 = fopen(adecod,"wb");
if(NULL==fpr1)
return -1;
if (NULL==fpw1)
return -1;
int len1=0;
char buf1[1024];
while((len1=fread((void*)buf1,1,1024,fpr1))>0)
{
decode(buf1,len1);
fwrite(buf1,len1,1,fpw1);
}
printf("decode sucess!!!");
fclose(fpr1);
fclose(fpw1);
break;
case 3:
return -1;
break;
default:
break;
}
}
}
这样一来就可以对电脑中的二进制文件进行加密和解密,可以对图片,电影…进行加密。下面给出一个效果展示。可以观察到加密和解密后的大小都相同,下面分别播放1,2,3查看效果
1可以正常播放
加密后的文件无法播放
解密后的文件正常播放。
如此一来循环移位加密即完成,下面给出异或加密,原理类似,在此就不赘述,直接上代码
异或加密
void encode1(char*p,char *key)
{
int len = strlen(p);
int klen=strlen(key);
int i,j;
for(i=0,j=0;i<len;i++,j++)
{
if((j%klen)==0)
j=0;
if(p[i]!=key[j])
p[i]^=key[j];
}
}
void menu()
{
char words[] = "I love you DWR";
char *key = "19960315";
printf("%s\n",words);
printf("len = %d\n",strlen(words));
encode1(words,key);
printf("%s\n",words);
printf("len = %d\n",strlen(words));
printf("please input your birthday than you will look i want to express\n");
char key1[100];
scanf("%s",key1);
printf("%s\n",key1);
encode1(words,key1);
printf("%s\n",words);
}
结尾
如有什么不妥请大家多多指正