直接上源代码
要求是输入是密钥是十六位数,字母要大写
#include<stdio.h>
int main()
{
int i,t,j=0;
char key[16]; //初始输入
int key1[64];
int key2[56];
int key3[48];
int c[28],c1[28]; //左右28位密钥
int d[28],d1[28];
int change1[28] = {57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36}; //置换数组
int change2[28] = {63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};
int change11[48] = {14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
int yiwei[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
for(i = 0; i < 16; i++) //输入密钥
{
scanf("%c",&key[i]);
}
for(i = 0; i < 16;i ++)//十六进制转换为01字符串
{
if(key[i] == '0')
{
key1[j] = 0;
key1[j+1] = 0;
key1[j+2] = 0;
key1[j+3] = 0;
}
if(key[i] == '1')
{
key1[j] = 0;
key1[j+1] = 0;
key1[j+2] = 0;
key1[j+3] = 1;
}
if(key[i] == '2')
{
key1[j] = 0;
key1[j+1] = 0;
key1[j+2] = 1;
key1[j+3] = 0;
}
if(key[i] == '3')
{
key1[j] = 0;
key1[j+1] = 0;
key1[j+2] = 1;
key1[j+3] = 1;
}
if(key[i] == '4')
{
key1[j] = 0;
key1[j+1] = 1;
key1[j+2] = 0;
key1[j+3] = 0;
}
if(key[i] == '5')
{
key1[j] = 0;
key1[j+1] = 1;
key1[j+2] = 0;
key1[j+3] = 1;
}
if(key[i] == '6')
{
key1[j] = 0;
key1[j+1] = 1;
key1[j+2] = 1;
key1[j+3] = 0;
}
if(key[i] == '7')
{
key1[j] = 0;
key1[j+1] = 1;
key1[j+2] = 1;
key1[j+3] = 1;
}
if(key[i] == '8')
{
key1[j] = 1;
key1[j+1] = 0;
key1[j+2] = 0;
key1[j+3] = 0;
}
if(key[i] == '9')
{
key1[j] = 1;
key1[j+1] = 0;
key1[j+2] = 0;
key1[j+3] = 1;
}
if(key[i] == 'A')
{
key1[j] = 1;
key1[j+1] = 0;
key1[j+2] = 1;
key1[j+3] = 0;
}
if(key[i] == 'B')
{
key1[j] = 1;
key1[j+1] = 0;
key1[j+2] = 1;
key1[j+3] = 1;
}
if(key[i] == 'C')
{
key1[j] = 1;
key1[j+1] = 1;
key1[j+2] = 0;
key1[j+3] = 0;
}
if(key[i] == 'D')
{
key1[j] = 1;
key1[j+1] = 1;
key1[j+2] = 0;
key1[j+3] = 1;
}
if(key[i] == 'E')
{
key1[j] = 1;
key1[j+1] = 1;
key1[j+2] = 1;
key1[j+3] = 0;
}
if(key[i] == 'F')
{
key1[j] = 1;
key1[j+1] = 1;
key1[j+2] = 1;
key1[j+3] = 1;
}
j = j + 4;
}
printf("\n");
for(i = 0; i < 28; i++) //密钥置换选择1,
{
j = change1[i];
c[i] = key1[j - 1];
}
for(i = 0; i < 28; i++)
{
j = change2[i];
d[i] = key1[j - 1];
}
for(t = 0 ; t < 16;t++) //16次循环
{
j = yiwei[t];
for(i = 0; i < 28 ;i++) //循环移位
{
if(j==1)
{
c1[i] = c[i+1];
c1[27] = c[0];
d1[i] = d[i+1];
d1[27] = d[0];
}
else
{
c1[i] = c[i+2];
c1[26] = c[0];
c1[27] = c[1];
d1[i] = d[i+2];
d1[26] = d[0];
d1[27] = d[1];
}
}
for(i = 0; i < 48; i++) //置换选择2
{
j = change11[i];
if(j <= 28)
key3[i] = c1[j - 1];
else
key3[i] = d1[j - 29];
}
for(i = 0; i < 28; i++) //循环复原
{
c[i] = c1[i];
d[i] = d1[i];
}
printf("第%d个子密钥为:\n",t+1);
for(i = 0; i < 48; i++)
{
printf("%d",key3[i]);
}
printf("\n");
}
return 0;
}
实验结果: