📄 des.cpp
字号:
#include "stdafx.h"
#include "des.h"
#include "memory.h"
void DES::IP(int mchar[64], int mreturn[64])
{
int mint[64];
memset(mint, 0, sizeof(mint));
//将int明文转化为2进制明文
for (int i =0;i<64;i++)
{
if ((mchar[i] & 0x80)!=0) mint[i*8+0] =1;
if ((mchar[i] & 0x40)!=0) mint[i*8+1] =1;
if ((mchar[i] & 0x20)!=0) mint[i*8+2] =1;
if ((mchar[i] & 0x10)!=0) mint[i*8+3] =1;
if ((mchar[i] & 0x8)!=0) mint[i*8+4] =1;
if ((mchar[i] & 0x4)!=0) mint[i*8+5] =1;
if ((mchar[i] & 0x2)!=0) mint[i*8+6] =1;
if ((mchar[i] & 0x1)!=0) mint[i*8+7] =1;
}
//置换表
mreturn[0] = mint[57];mreturn[1] = mint[49];mreturn[2] = mint[41];
mreturn[3] = mint[33];mreturn[4] = mint[25];mreturn[5] = mint[17];
mreturn[6] = mint[9]; mreturn[7] = mint[1]; mreturn[8] = mint[59];
mreturn[9] = mint[51];mreturn[10] = mint[43];mreturn[11] = mint[35];
mreturn[12] = mint[27];mreturn[13] = mint[19];mreturn[14] = mint[11];
mreturn[15] = mint[3];mreturn[16] = mint[61];mreturn[17] = mint[53];
mreturn[18] = mint[45];mreturn[19] = mint[37];mreturn[20] = mint[29];
mreturn[21] = mint[21];mreturn[22] = mint[13];mreturn[23] = mint[5];
mreturn[24] = mint[63];mreturn[25] = mint[55];mreturn[26] = mint[47];
mreturn[27] = mint[39];mreturn[28] = mint[31];mreturn[29] = mint[23];
mreturn[30] = mint[15];mreturn[31] = mint[7];mreturn[32] = mint[56];
mreturn[33] = mint[48];mreturn[34] = mint[40];mreturn[35] = mint[32];
mreturn[36] = mint[24];mreturn[37] = mint[16];mreturn[38] = mint[8];
mreturn[39] = mint[0];mreturn[40] = mint[58];mreturn[41] = mint[50];
mreturn[42] = mint[42];mreturn[43] = mint[34];mreturn[44] = mint[26];
mreturn[45] = mint[18];mreturn[46] = mint[10];mreturn[47] = mint[2];
mreturn[48] = mint[60];mreturn[49] = mint[52];mreturn[50] = mint[44];
mreturn[51] = mint[36];mreturn[52] = mint[28];mreturn[53] = mint[20];
mreturn[54] = mint[12];mreturn[55] = mint[4];mreturn[56] = mint[62];
mreturn[57] = mint[54];mreturn[58] = mint[46];mreturn[59] = mint[38];
mreturn[60] = mint[30];mreturn[61] = mint[22];mreturn[62] = mint[14];
mreturn[63] = mint[6];
}
//FP置换
void DES::FP(int mchar[64], int fpreturn[64])
{
//置换表
fpreturn[0] = mchar[39];fpreturn[1] = mchar[7];fpreturn[2] = mchar[47];fpreturn[3] = mchar[15];
fpreturn[4] = mchar[55];fpreturn[5] = mchar[23];fpreturn[6] = mchar[63];fpreturn[7] = mchar[31];
fpreturn[8] = mchar[38];fpreturn[9] = mchar[6];fpreturn[10] = mchar[46];fpreturn[11] = mchar[14];
fpreturn[12] = mchar[54];fpreturn[13] = mchar[22];fpreturn[14] = mchar[62];fpreturn[15] = mchar[30];
fpreturn[16] = mchar[37];fpreturn[17] = mchar[5];fpreturn[18] = mchar[45];fpreturn[19] = mchar[13];
fpreturn[20] = mchar[53];fpreturn[21] = mchar[21];fpreturn[22] = mchar[61];fpreturn[23] = mchar[29];
fpreturn[24] = mchar[36];fpreturn[25] = mchar[4];fpreturn[26] = mchar[44];fpreturn[27] = mchar[12];
fpreturn[28] = mchar[52];fpreturn[29] = mchar[20];fpreturn[30] = mchar[60];fpreturn[31] = mchar[28];
fpreturn[32] = mchar[35];fpreturn[33] = mchar[3];fpreturn[34] = mchar[43];fpreturn[35] = mchar[11];
fpreturn[36] = mchar[51];fpreturn[37] = mchar[19];fpreturn[38] = mchar[59];fpreturn[39] = mchar[27];
fpreturn[40] = mchar[34];fpreturn[41] = mchar[2];fpreturn[42] = mchar[42];fpreturn[43] = mchar[10];
fpreturn[44] = mchar[50];fpreturn[45] = mchar[18];fpreturn[46] = mchar[58];fpreturn[47] = mchar[26];
fpreturn[48] = mchar[33];fpreturn[49] = mchar[1];fpreturn[50] = mchar[41];fpreturn[51] = mchar[9];
fpreturn[52] = mchar[49];fpreturn[53] = mchar[17];fpreturn[54] = mchar[57];fpreturn[55] = mchar[25];
fpreturn[56] = mchar[32];fpreturn[57] = mchar[0];fpreturn[58] = mchar[40];fpreturn[59] = mchar[8];
fpreturn[60] = mchar[48];fpreturn[61] = mchar[16];fpreturn[62] = mchar[56];fpreturn[63] = mchar[24];
}
//由64位原始密钥计算16个48位密钥
void DES::makekey(int kchar[48])
{
//16位数组存放16个输出密钥
int temp[64];
int kint[56];
int c0[28]; int d0[28];
int c16[28]; int d1[28];
int c1[28]; int d2[28];
int c2[28]; int d3[28];
int c3[28]; int d4[28];
int c4[28]; int d5[28];
int c5[28]; int d6[28];
int c6[28]; int d7[28];
int c7[28]; int d8[28];
int c8[28]; int d9[28];
int c9[28]; int d10[28];
int c10[28]; int d11[28];
int c11[28]; int d12[28];
int c12[28]; int d13[28];
int c13[28]; int d14[28];
int c14[28]; int d15[28];
int c15[28]; int d16[28];
int k1[48]; int k2[48]; int k3[48];
int k4[48]; int k5[48]; int k6[48];
int k7[48]; int k8[48]; int k9[48];
int k10[48]; int k11[48]; int k12[48];
int k13[48]; int k14[48]; int k15[48];
int k16[48];
//获得原始密钥2进制形式
for (int i=0;i<48;i++)
{
if ((kchar[i] & 0x80)!=0) temp[i*8 +0] =1;
if ((kchar[i] & 0x40)!=0) temp[i*8 +1] =1;
if ((kchar[i] & 0x20)!=0) temp[i*8 +2] =1;
if ((kchar[i] & 0x10)!=0) temp[i*8 +3] =1;
if ((kchar[i] & 0x8)!=0) temp[i*8 +4] =1;
if ((kchar[i] & 0x4)!=0) temp[i*8 +5] =1;
if ((kchar[i] & 0x2)!=0) temp[i*8 +6] =1;
if ((kchar[i] & 0x1)!=0) temp[i*8 +7] =1;
}
//去掉7。。15。。。。。63的奇校检位并打乱
kint[0] = temp[56];
kint[1] = temp[48];
kint[2] = temp[40];
kint[3] = temp[32];
kint[4] = temp[24];
kint[5] = temp[16];
kint[6] = temp[8];
kint[7] = temp[0];
kint[8] = temp[57];
kint[9] = temp[49];
kint[10] = temp[41];
kint[11] = temp[33];
kint[12] = temp[25];
kint[13] = temp[17];
kint[14] = temp[9];
kint[15] = temp[1];
kint[16] = temp[58];
kint[17] = temp[50];
kint[18] = temp[42];
kint[19] = temp[34];
kint[20] = temp[26];
kint[21] = temp[18];
kint[22] = temp[10];
kint[23] = temp[2];
kint[24] = temp[59];
kint[25] = temp[51];
kint[26] = temp[43];
kint[27] = temp[35];
kint[28] = temp[62];
kint[29] = temp[54];
kint[30] = temp[46];
kint[31] = temp[38];
kint[32] = temp[30];
kint[33] = temp[22];
kint[34] = temp[14];
kint[35] = temp[6];
kint[36] = temp[61];
kint[37] = temp[53];
kint[38] = temp[45];
kint[39] = temp[37];
kint[40] = temp[29];
kint[41] = temp[21];
kint[42] = temp[13];
kint[43] = temp[5];
kint[44] = temp[60];
kint[45] = temp[52];
kint[46] = temp[44];
kint[47] = temp[36];
kint[48] = temp[28];
kint[49] = temp[20];
kint[50] = temp[12];
kint[51] = temp[4];
kint[52] = temp[27];
kint[53] = temp[19];
kint[54] = temp[11];
kint[55] = temp[3];
//分组56位密钥为2部分
for (i=0;i<28;i++)
{
c0[i] = kint[i];
d0[i] = kint[i+28];
}
//循环左移1位
for (i = 1; i < 28; i++)
{
c1[i - 1] = c0[i];
d1[i - 1] = d0[i];
}
c1[27] = c0[0];
d1[27] = d0[0];
//循环左移1位
for (i = 1; i < 28; i++)
{
c2[i - 1] = c1[i];
d2[i - 1] = d1[i];
}
c2[27] = c1[0];
d2[27] = d1[0];
//循环左移2位
for (i = 2; i < 28; i++)
{
c3[i - 2] = c2[i];
d3[i - 2] = d2[i];
}
c3[26] = c2[0];
c3[27] = c2[1];
d3[26] = d2[0];
d3[27] = d2[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c4[i - 2] = c3[i];
}
c4[26] = c3[0];
c4[27] = c3[1];
for (i = 2; i < 28; i++)
{
d4[i - 2] = d3[i];
}
d4[26] = d3[0];
d4[27] = d3[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c5[i - 2] = c4[i];
}
c5[26] = c4[0];
c5[27] = c4[1];
for (i = 2; i < 28; i++)
{
d5[i - 2] = d4[i];
}
d5[26] = d4[0];
d5[27] = d4[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c6[i - 2] = c5[i];
}
c6[26] = c5[0];
c6[27] = c5[1];
for (i = 2; i < 28; i++)
{
d6[i - 2] = d5[i];
}
d6[26] = d5[0];
d6[27] = d5[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c7[i - 2] = c6[i];
}
c7[26] = c6[0];
c7[27] = c6[1];
for (i = 2; i < 28; i++)
{
d7[i - 2] = d6[i];
}
d7[26] = d6[0];
d7[27] = d6[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c8[i - 2] = c7[i];
}
c8[26] = c7[0];
c8[27] = c7[1];
for (i = 2; i < 28; i++)
{
d8[i - 2] = d7[i];
}
d8[26] = d7[0];
d8[27] = d7[1];
//循环左移1位
for (i = 1; i < 28; i++)
{
c9[i - 1] = c8[i];
}
c9[27] = c8[0];
for (i = 1; i < 28; i++)
{
d9[i - 1] = d8[i];
}
d9[27] = d8[0];
//循环左移2位
for (i = 2; i < 28; i++)
{
c10[i - 2] = c9[i];
}
c10[26] = c9[0];
c10[27] = c9[1];
for (i = 2; i < 28; i++)
{
d10[i - 2] = d9[i];
}
d10[26] = d9[0];
d10[27] = d9[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c11[i - 2] = c10[i];
}
c11[26] = c10[0];
c11[27] = c10[1];
for (i = 2; i < 28; i++)
{
d11[i - 2] = d10[i];
}
d11[26] = d10[0];
d11[27] = d10[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c12[i - 2] = c11[i];
}
c12[26] = c11[0];
c12[27] = c11[1];
for (i = 2; i < 28; i++)
{
d12[i - 2] = d11[i];
}
d12[26] = d11[0];
d12[27] = d11[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c13[i - 2] = c12[i];
}
c13[26] = c12[0];
c13[27] = c12[1];
for (i = 2; i < 28; i++)
{
d13[i - 2] = d12[i];
}
d13[26] = d12[0];
d13[27] = d12[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c14[i - 2] = c13[i];
}
c14[26] = c13[0];
c14[27] = c13[1];
for (i = 2; i < 28; i++)
{
d14[i - 2] = d13[i];
}
d14[26] = d13[0];
d14[27] = d13[1];
//循环左移2位
for (i = 2; i < 28; i++)
{
c15[i - 2] = c14[i];
}
c15[26] = c14[0];
c15[27] = c14[1];
for (i = 2; i < 28; i++)
{
d15[i - 2] = d14[i];
}
d15[26] = d14[0];
d15[27] = d14[1];
//循环左移1位
for (i = 1; i < 28; i++)
{
c16[i - 1] = c15[i];
}
c16[27] = c15[0];
for (i = 1; i < 28; i++)
{
d16[i - 1] = d15[i];
}
d16[27] = d15[0];
//合并Ci,Di并由PC2置换计算最终16个密钥
PC2(c1, d1, k1);
PC2(c2, d2, k2);
PC2(c3, d3, k3);
PC2(c4, d4, k4);
PC2(c5, d5, k5);
PC2(c6, d6, k6);
PC2(c7, d7, k7);
PC2(c8, d8, k8);
PC2(c9, d9, k9);
PC2(c10, d10, k10);
PC2(c11, d11, k11);
PC2(c12, d12, k12);
PC2(c13, d13, k13);
PC2(c14, d14, k14);
PC2(c15, d15, k15);
PC2(c16, d16, k16);
memcpy(keyreturn[0], k1, sizeof(k1));
memcpy(keyreturn[1], k2, sizeof(k1));
memcpy(keyreturn[2], k3, sizeof(k1));
memcpy(keyreturn[3], k4, sizeof(k1));
memcpy(keyreturn[4], k5, sizeof(k1));
memcpy(keyreturn[5], k6, sizeof(k1));
memcpy(keyreturn[6], k7, sizeof(k1));
memcpy(keyreturn[7], k8, sizeof(k1));
memcpy(keyreturn[8], k9, sizeof(k1));
memcpy(keyreturn[9], k10, sizeof(k1));
memcpy(keyreturn[10], k11, sizeof(k1));
memcpy(keyreturn[11], k12, sizeof(k1));
memcpy(keyreturn[12], k13, sizeof(k1));
memcpy(keyreturn[13], k14, sizeof(k1));
memcpy(keyreturn[14], k15, sizeof(k1));
memcpy(keyreturn[15], k16, sizeof(k1));
}
//PC2置换
void DES::PC2(int c[28], int d[28], int k[48])
{
int temp[56];
//合并Ci和Di
for (int i = 0; i < 28; i++)
{
temp[i] = c[i];
temp[i + 28] = d[i];
}
//置换表
k[0] = temp[13];
k[1] = temp[16];
k[2] = temp[10];
k[3] = temp[23];
k[4] = temp[0];
k[5] = temp[4];
k[6] = temp[2];
k[7] = temp[27];
k[8] = temp[14];
k[9] = temp[5];
k[10] = temp[20];
k[11] = temp[9];
k[12] = temp[22];
k[13] = temp[18];
k[14] = temp[11];
k[15] = temp[3];
k[16] = temp[25];
k[17] = temp[7];
k[18] = temp[15];
k[19] = temp[6];
k[20] = temp[26];
k[21] = temp[19];
k[22] = temp[12];
k[23] = temp[1];
k[24] = temp[40];
k[25] = temp[51];
k[26] = temp[30];
k[27] = temp[36];
k[28] = temp[46];
k[29] = temp[54];
k[30] = temp[29];
k[31] = temp[39];
k[32] = temp[50];
k[33] = temp[44];
k[34] = temp[32];
k[35] = temp[47];
k[36] = temp[43];
k[37] = temp[48];
k[38] = temp[38];
k[39] = temp[55];
k[40] = temp[33];
k[41] = temp[52];
k[42] = temp[45];
k[43] = temp[41];
k[44] = temp[49];
k[45] = temp[35];
k[46] = temp[28];
k[47] = temp[31];
}
void DES::E(int r[], int AfterE[48])
{
int i;
AfterE[0] = r[31];
for (i = 1; i <= 5; i++)
{
AfterE[i] = r[i - 1];
}
for (i = 6; i <= 11; i++)
{
AfterE[i] = r[i - 3];
}
for (i = 12; i <= 17; i++)
{
AfterE[i] = r[i - 5];
}
for (i = 18; i <= 23; i++)
{
AfterE[i] = r[i - 7];
}
for (i = 24; i <= 29; i++)
{
AfterE[i] = r[i - 9];
}
for (i = 30; i <= 35; i++)
{
AfterE[i] = r[i - 11];
}
for (i = 36; i <= 41; i++)
{
AfterE[i] = r[i - 13];
}
for (i = 42; i <= 46; i++)
{
AfterE[i] = r[i - 15];
}
AfterE[47] = r[0];
}
//f函数
void DES::f(int r[], int k[], int greturn[32])
{
int afterE[48];
E(r, afterE);//将明文进行E拓展
//E拓展后明文分6组的初始化
int m1[6]; int m4[6]; int m7[6];
int m2[6]; int m5[6]; int m8[6];
int m3[6]; int m6[6];
//明文经过S盒后存放数组初始化
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -