C语言实现简单的feisel算法:
本人大二学生学艺不精水平仅供实验报告作为参考
本次实验主要对feistel加密进行了测试,完成代码编写花费了很大力气。
首先我想完成对数字和字母的无差别编写,我想不借助互联网以我自己掌握的知识来编写,发现对字母进行加密时我用轮密钥的方法进行模26运算(F),加密时没有什么问题。但是
再处理解密时我遇到了很大的问题,就是在已知密文的情况下不可能知道该密文使用密钥加密时是直接余下来的还是过26余的,也就是说密钥加密会出现两种情况,而且每一轮都是如此,如果有6轮就会有2^6种不同的解密方式,这显然是在编程实现时非常痛苦的事。
后来我选择对数字进行加密,我试着解决我之前在轮密钥这出现的问题,我想过所有方法,加减,乘,整除,模,都会产生多种情况,只有一种最适宜:比大小!!!
如果轮密钥比该位上的数大直接赋值就行。
后续的问题便迎刃而解了。
刚开始尝试对字母加密
设置了10位
//feistel算法字母加密
#include<stdio.h>
int main()
{
char code[6][10],key[10]={'b','g','t','h','e','a','l','z','y','m'};
printf("输入10位明文;\n");
int i=0,j=0;
for(i=0;i<10;i++)
scanf("%c",&code[0][i]);
int a,b,c,d,e;
for(i=0;i<6;i++)
{
for(j=0;j<5;j++)
{
code[i+1][j]=code[i][5+j];
a=key[i+j]-'a';
b=code[i][5+j]-'a';
c=(a+b)%26;
d=code[i][j]-'a';
e=c^d;
e=e%26;
code[i+1][5+j]=e+'a';
}
}
for(i=0;i<10;i++)
printf("%c",code[5][i]);
return 0;
}
对数字进行加密:
//feistel数字串加密
#include<stdio.h>
int main()
{
int ss[4][6];
int key[5]={8,7,5,2,4};
int ckey[5]={8,7,5,2,4};
int i,k,m;
printf("输入六位明文每位以空格间隔开:\n");
for(i=0;i<6;i++)
scanf("%d",&ss[0][i]);
for(i=0;i<3;i++)
{
for(k=0;k<3;k++)
{
ss[i+1][k]=ss[i][k+3];
if(key[k+i]>ss[i][k+3])
{
ss[i][k+3]=key[k+i];
}
ss[i+1][k+3]=ss[i][k]^ss[i][k+3];
}
}
for(i=0;i<6;i++)
{ if(ss[3][i]>9)
{ switch(ss[3][i])
{
case 10:printf("a ");break;
case 11:printf("b ");break;
case 12:printf("c ");break;
case 13:printf("d ");break;
case 14:printf("e ");break;
case 15:printf("f ");break;}
}
else printf("%d ",ss[3][i]);
}
int tt[4][6];
printf("\n");
printf("输入密文 abcdef 以两位数字进行输入 谢谢!:\n");
for(i=0;i<6;i++)
scanf("%d",&tt[0][i]);
for(i=0;i<3;i++)
{
for(k=0;k<3;k++)
{
tt[i+1][k+3]=tt[i][k];
if(ckey[2+k-i]>tt[i][k])
{
tt[i][k]=ckey[2+k-i];
}
tt[i+1][k]=tt[i][k]^tt[i][k+3];
}
}
for(i=0;i<6;i++)
{ if(tt[3][i]>9)
{ switch(tt[3][i])
{
case 10:printf("a ");break;
case 11:printf("b ");break;
case 12:printf("c ");break;
case 13:printf("d ");break;
case 14:printf("e ");break;
case 15:printf("f ");break;}
}
else printf("%d ",tt[3][i]);
}
return 0;
}