📄 des1.cpp
字号:
/* KS Function Begin */ /* 轮密钥移位算法,用于生成进入PC-2的中间密钥 */
if (flg)
{
nbrofshift = shift[iter-1];
for (i = 0; i < (int) nbrofshift; i++)
{
temp1 = kwork[0];
temp2 = kwork[28];
for (j = 0; j < 27; j++)
{
kwork[j] = kwork[j+1];
kwork[j+28] = kwork[j+29];
}
kwork[27] = temp1;
kwork[55] = temp2;
}
}
else if (iter > 1)
{
nbrofshift = shift[17-iter];
for (i = 0; i < (int) nbrofshift; i++)
{
temp1 = kwork[27];
temp2 = kwork[55];
for (j = 27; j > 0; j--)
{
kwork[j] = kwork[j-1];
kwork[j+28] = kwork[j+27];
}
kwork[0] = temp1;
kwork[28] = temp2;
}
}
/* Permute kwork - PC2 */ /* 经过PC-2 生成轮密钥 k[i] */
for(i=0;i<48;i++)
kn[i] = kwork[PC2[i]];
/* KS Function End */
/* worka XOR kn */ /* 异或运算生成Bi,准备通过s盒变换 */
for(i = 0; i < 48; i++)
worka[i] = worka[i] ^ kn[i];
/* 8 s-functions */ /* 8个s盒函数运算 */
for(i=0;i<32;i++)
{
if(i>=0&&i<=3)
valindex = s1[2*worka[ 0]+worka[ 5]][2*(2*(2*worka[ 1]+worka[ 2])+worka[ 3])+worka[ 4]];
if(i>=4&&i<=7)
valindex = s2[2*worka[ 6]+worka[11]][2*(2*(2*worka[ 7]+worka[ 8])+worka[ 9])+worka[10]];
if(i>=8&&i<=11)
valindex = s3[2*worka[12]+worka[17]][2*(2*(2*worka[13]+worka[14])+worka[15])+worka[16]];
if(i>=12&&i<=15)
valindex = s4[2*worka[18]+worka[23]][2*(2*(2*worka[19]+worka[20])+worka[21])+worka[22]];
if(i>=16&&i<=19)
valindex = s5[2*worka[24]+worka[29]][2*(2*(2*worka[25]+worka[26])+worka[27])+worka[28]];
if(i>=20&&i<=23)
valindex = s6[2*worka[30]+worka[35]][2*(2*(2*worka[31]+worka[32])+worka[33])+worka[34]];
if(i>=24&&i<=27)
valindex = s7[2*worka[36]+worka[41]][2*(2*(2*worka[37]+worka[38])+worka[39])+worka[40]];
if(i>=28&&i<=31)
valindex = s8[2*worka[42]+worka[47]][2*(2*(2*worka[43]+worka[44])+worka[45])+worka[46]];
valindex = valindex * 4;
kn[i]=binary[(i%4)+valindex];
} /* binary[i]将si[][]中元素转化为2进制*/
/* Permute - P */ /* f函数中的P置换 */
for(i=0;i<32;i++)
worka[i] = kn[P[i]]; /* worka中储存f函数的值 */
/* bufout XOR worka */
for (i = 0; i < 32; i++)
{
bufout[i+32] = bufout[i] ^ worka[i];
bufout[i] = buffer[i];
}
} /* End of Iter 16轮迭代结束 */
/* Prepare Output */
for (i = 0; i < 32; i++) // 最后L和R交换
{
j = bufout[i];
bufout[i] = bufout[32+i];
bufout[32+i] = j;
}
/* Inverse Initial Permutation */
for(i=0;i<64;i++)
buffer[i] = bufout[IP1[i]];
// buffer[IP[i]]=bufout[i]; //此式与上式是等价的,用哪个都一样
printf("cipher text:\n");
for(i=0;i<64;i++)
{
printf("%d ",buffer[i]);
if((i+1)%8==0)
printf("\n");
}
j = 0;
for (i = 0; i < 8; i++)
{
*(dest + i) = 0x00;
for (k = 0; k < 7; k++)
*(dest + i) = ((*(dest + i)) + buffer[j+k]) * 2;
*(dest + i) = *(dest + i) + buffer[j+7];
j += 8;
}
}
void main()
{
unsigned char source[(N/8+1)*8]={0x74,0x85,0x02,0xcd,0x38,0x45,0x10,0x97,
0x48,0x69,0x11,0x02,0x6a,0xcd,0xff,0x31,
0x38,0x74,0x75,0x64,0x38,0x45,0x10,0x97},
dest[(N/8+1)*8],
source1[(N/8+1)*8],
inkey[8]={0x1a,0x62,0x4c,0x89,0x52,0x0d,0xec,0x46};
int flg=1; // flg=1 说明是加密 ,flg取1,0控制加、解密 ,source[]中存放的是明文,可自己修改,也可用输入语句输入
int i;
if(N%8==0)
{
for(i=0;i<N/8;i++)
des(&source[i*8],&dest[i*8],inkey,flg);
printf("\nbuffer:\n");
for(i=0;i<N;i++)
{
printf("%x ",*(dest+i));
if((i+1)%8==0)
printf("\n");
}
}
else
{
for(i=N+1;i<((N/8)+1)*8;i++)
source[i]=0x00;
for(i=0;i<N/8+1;i++)
des(&source[i*8],&dest[i*8],inkey,flg);
printf("\nbuffer:\n");
for(i=0;i<(N/8+1)*8;i++)
printf("%x ",*(dest+i));
}
flg=0; //解密过程
if(N%8==0)
{
for(i=0;i<N/8;i++)
des(&dest[i*8],&source1[i*8],inkey,flg);
printf("\nbuffer:\n");
for(i=0;i<N;i++)
{
printf("%x ",*(source1+i));
if((i+1)%8==0)
printf("\n");
}
}
else
{
for(i=N+1;i<((N/8)+1)*8;i++)
dest[i]=0x00;
for(i=0;i<N/8+1;i++)
des(&dest[i*8],&source1[i*8],inkey,flg);
printf("\nbuffer:\n");
for(i=0;i<(N/8+1)*8;i++)
printf("%x ",*(source1+i));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -