📄 des.cpp
字号:
S7[0][10] = 9;
S7[0][11] = 7;
S7[0][12] = 5;
S7[0][13] = 10;
S7[0][14] = 6;
S7[0][15] = 1;
S7[1][0] = 13;
S7[1][1] = 0;
S7[1][2] = 11;
S7[1][3] = 7;
S7[1][4] = 4;
S7[1][5] = 9;
S7[1][6] = 1;
S7[1][7] = 10;
S7[1][8] = 14;
S7[1][9] = 3;
S7[1][10] = 5;
S7[1][11] = 12;
S7[1][12] = 2;
S7[1][13] = 15;
S7[1][14] = 8;
S7[1][15] = 6;
S7[2][0] = 1;
S7[2][1] = 4;
S7[2][2] = 11;
S7[2][3] = 13;
S7[2][4] = 12;
S7[2][5] = 3;
S7[2][6] = 7;
S7[2][7] = 14;
S7[2][8] = 10;
S7[2][9] = 15;
S7[2][10] = 6;
S7[2][11] = 8;
S7[2][12] = 0;
S7[2][13] = 5;
S7[2][14] = 9;
S7[2][15] = 2;
S7[3][0] = 6;
S7[3][1] = 11;
S7[3][2] = 13;
S7[3][3] = 8;
S7[3][4] = 1;
S7[3][5] = 4;
S7[3][6] = 10;
S7[3][7] = 7;
S7[3][8] = 9;
S7[3][9] = 5;
S7[3][10] = 0;
S7[3][11] = 15;
S7[3][12] = 14;
S7[3][13] = 2;
S7[3][14] = 3;
S7[3][15] = 12;
S8[0][0] = 13;
S8[0][1] = 2;
S8[0][2] = 8;
S8[0][3] = 4;
S8[0][4] = 6;
S8[0][5] = 15;
S8[0][6] = 11;
S8[0][7] = 1;
S8[0][8] = 10;
S8[0][9] = 9;
S8[0][10] = 3;
S8[0][11] = 14;
S8[0][12] = 5;
S8[0][13] = 0;
S8[0][14] = 12;
S8[0][15] = 7;
S8[1][0] = 1;
S8[1][1] = 15;
S8[1][2] = 13;
S8[1][3] = 8;
S8[1][4] = 10;
S8[1][5] = 3;
S8[1][6] = 7;
S8[1][7] = 4;
S8[1][8] = 12;
S8[1][9] = 5;
S8[1][10] = 6;
S8[1][11] = 11;
S8[1][12] = 0;
S8[1][13] = 14;
S8[1][14] = 9;
S8[1][15] = 2;
S8[2][0] = 7;
S8[2][1] = 11;
S8[2][2] = 4;
S8[2][3] = 1;
S8[2][4] = 9;
S8[2][5] = 12;
S8[2][6] = 14;
S8[2][7] = 2;
S8[2][8] = 0;
S8[2][9] = 6;
S8[2][10] = 10;
S8[2][11] = 13;
S8[2][12] = 15;
S8[2][13] = 3;
S8[2][14] = 5;
S8[2][15] = 8;
S8[3][0] = 2;
S8[3][1] = 1;
S8[3][2] = 14;
S8[3][3] = 7;
S8[3][4] = 4;
S8[3][5] = 10;
S8[3][6] = 8;
S8[3][7] = 13;
S8[3][8] = 15;
S8[3][9] = 12;
S8[3][10] = 9;
S8[3][11] = 0;
S8[3][12] = 3;
S8[3][13] = 5;
S8[3][14] = 6;
S8[3][15] = 11;
//从明文的输入获得经过S盒的值
j = Mi[0] * 2 + Mi[5];
k = Mi[1] * 8 + Mi[2] * 4 + Mi[3] * 2 + Mi[4];
output[0] = S1[j][k];
output[1] = S2[j][k];
output[2] = S3[j][k];
output[3] = S4[j][k];
output[4] = S5[j][k];
output[5] = S6[j][k];
output[6] = S7[j][k];
output[7] = S8[j][k];
return output[i - 1];
}
//输入16个密钥和明文计算DES
void DES::DES_jiami(int r[64], int out[64])
{
//2进制明文分组Li bufyi
int buf0[32]; int bufy0[32];
int buf1[32]; int bufy1[32];
int buf2[32]; int bufy2[32];
int buf3[32]; int bufy3[32];
int buf4[32]; int bufy4[32];
int buf5[32]; int bufy5[32];
int buf6[32]; int bufy6[32];
int buf7[32]; int bufy7[32];
int buf8[32]; int bufy8[32];
int buf9[32]; int bufy9[32];
int buf10[32]; int bufy10[32];
int buf11[32]; int bufy11[32];
int buf12[32]; int bufy12[32];
int buf13[32]; int bufy13[32];
int buf14[32]; int bufy14[32];
int buf15[32]; int bufy15[32];
int buf16[32]; int bufy16[32];
int *L0 = buf0; int *R0 = bufy0;
int *L1 = buf1; int *R1 = bufy1;
int *L2 = buf2; int *R2 = bufy2;
int *L3 = buf3; int *R3 = bufy3;
int *L4 = buf4; int *R4 = bufy4;
int *L5 = buf5; int *R5 = bufy5;
int *L6 = buf6; int *R6 = bufy6;
int *L7 = buf7; int *R7 = bufy7;
int *L8 = buf8; int *R8 = bufy8;
int *L9 = buf9; int *R9 = bufy9;
int *L10 = buf10; int *R10 = bufy10;
int *L11 = buf11; int *R11 = bufy11;
int *L12 = buf12; int *R12 = bufy12;
int *L13 = buf13; int *R13 = bufy13;
int *L14 = buf14; int *R14 = bufy14;
int *L15 = buf15; int *R15 = bufy15;
int *L16 = buf16; int *R16 = bufy16;
int afterG[32];
//获得2进制明文经过IP置换后结果
int afterIP[64];
IP(r, afterIP);
int temp[64];
//获得L0 R0
for (int i = 0; i < 32; i++)
{
L0[i] = afterIP[i];
R0[i] = afterIP[i + 32];
}
//用R0和第一个密钥进行f函数
f(R0, keyreturn[0], afterG);
for (i=0;i<32;i++)
{
if (L0[i]!=afterG[i]) R1[i]=1;//L0与R1异或
}
L1 = R0;
//第一重
f(R1, keyreturn[1], afterG);
for (i = 0; i < 32; i++)
{
if (L1[i] != afterG[i]) R2[i] = 1;
}
L2 = R1;
//第二重
f(R2, keyreturn[2], afterG);
for (i = 0; i < 32; i++)
{
if (L2[i] != afterG[i]) R3[i] = 1;
}
L3 = R2;
//第3重
f(R3, keyreturn[3], afterG);
for (i = 0; i < 32; i++)
{
if (L3[i] != afterG[i]) R4[i] = 1;
}
L4 = R3;
//第4重
f(R4, keyreturn[4], afterG);
for (i = 0; i < 32; i++)
{
if (L4[i] != afterG[i]) R5[i] = 1;
}
L5 = R4;
//第5重
f(R5, keyreturn[5], afterG);
for (i = 0; i < 32; i++)
{
if (L5[i] != afterG[i]) R6[i] = 1;
}
L6 = R5;
//第6重
f(R6, keyreturn[6], afterG);
for (i = 0; i < 32; i++)
{
if (L6[i] != afterG[i]) R7[i] = 1;
}
L7 = R6;
//第7重
f(R7, keyreturn[7], afterG);
for (i = 0; i < 32; i++)
{
if (L7[i] != afterG[i]) R8[i] = 1;
}
L8 = R7;
//第8重
f(R8, keyreturn[8], afterG);
for (i = 0; i < 32; i++)
{
if (L8[i] != afterG[i]) R9[i] = 1;
}
L9 = R8;
//第9重
f(R9, keyreturn[9], afterG);
for (i = 0; i < 32; i++)
{
if (L9[i] != afterG[i]) R10[i] = 1;
}
L10 = R9;
//第10重
f(R10, keyreturn[10], afterG);
for (i = 0; i < 32; i++)
{
if (L10[i] != afterG[i]) R11[i] = 1;
}
L11 = R10;
//第11重
f(R11, keyreturn[11], afterG);
for (i = 0; i < 32; i++)
{
if (L11[i] != afterG[i]) R12[i] = 1;
}
L12 = R11;
//第12重
f(R12, keyreturn[12], afterG);
for (i = 0; i < 32; i++)
{
if (L12[i] != afterG[i]) R13[i] = 1;
}
L13 = R12;
//第13重
f(R13, keyreturn[13], afterG);
for (i = 0; i < 32; i++)
{
if (L13[i] != afterG[i]) R14[i] = 1;
}
L14 = R13;
//第14重
f(R14, keyreturn[14], afterG);
for (i = 0; i < 32; i++)
{
if (L14[i] != afterG[i]) R15[i] = 1;
}
L15 = R14;
//第15重
f(R15, keyreturn[15], afterG);
for (i = 0; i < 32; i++)
{
if (L15[i] != afterG[i]) R16[i] = 1;
}
L16 = R15;
//第16重
//合并L16和R16
for (i = 0; i < 32; i++)
{
temp[i] = R16[i];
temp[i + 32] = L16[i];
}
//明文经过IP-1置换输出
FP(temp, out);
}
//16个密钥倒向输入计算DES反函数,原理大致与DES相同
void DES::DES_jiemi(int r[64], int out[64])
{
int buf0[32]; int bufy0[32];
int buf1[32]; int bufy1[32];
int buf2[32]; int bufy2[32];
int buf3[32]; int bufy3[32];
int buf4[32]; int bufy4[32];
int buf5[32]; int bufy5[32];
int buf6[32]; int bufy6[32];
int buf7[32]; int bufy7[32];
int buf8[32]; int bufy8[32];
int buf9[32]; int bufy9[32];
int buf10[32]; int bufy10[32];
int buf11[32]; int bufy11[32];
int buf12[32]; int bufy12[32];
int buf13[32]; int bufy13[32];
int buf14[32]; int bufy14[32];
int buf15[32]; int bufy15[32];
int buf16[32]; int bufy16[32];
int *L0 = buf0; int *R0 = bufy0;
int *L1 = buf1; int *R1 = bufy1;
int *L2 = buf2; int *R2 = bufy2;
int *L3 = buf3; int *R3 = bufy3;
int *L4 = buf4; int *R4 = bufy4;
int *L5 = buf5; int *R5 = bufy5;
int *L6 = buf6; int *R6 = bufy6;
int *L7 = buf7; int *R7 = bufy7;
int *L8 = buf8; int *R8 = bufy8;
int *L9 = buf9; int *R9 = bufy9;
int *L10 = buf10; int *R10 = bufy10;
int *L11 = buf11; int *R11 = bufy11;
int *L12 = buf12; int *R12 = bufy12;
int *L13 = buf13; int *R13 = bufy13;
int *L14 = buf14; int *R14 = bufy14;
int *L15 = buf15; int *R15 = bufy15;
int *L16 = buf16; int *R16 = bufy16;
int afterG[32];
int afterIP[64];
IP(r, afterIP);
int temp[64];
for (int i = 0; i < 32; i++)
{
L0[i] = afterIP[i];
R0[i] = afterIP[i + 32];
}
f(R0, keyreturn[15], afterG);
for (i=0;i<32;i++)
{
if (L0[i]!=afterG[i]) R1[i]=1;
}
L1 = R0;
//第一重
f(R1, keyreturn[14], afterG);
for (i = 0; i < 32; i++)
{
if (L1[i] != afterG[i]) R2[i] = 1;
}
L2 = R1;
//第二重
f(R2, keyreturn[13], afterG);
for (i = 0; i < 32; i++)
{
if (L2[i] != afterG[i]) R3[i] = 1;
}
L3 = R2;
//第3重
f(R3, keyreturn[12], afterG);
for (i = 0; i < 32; i++)
{
if (L3[i] != afterG[i]) R4[i] = 1;
}
L4 = R3;
//第4重
f(R4, keyreturn[11], afterG);
for (i = 0; i < 32; i++)
{
if (L4[i] != afterG[i]) R5[i] = 1;
}
L5 = R4;
//第5重
f(R5, keyreturn[10], afterG);
for (i = 0; i < 32; i++)
{
if (L5[i] != afterG[i]) R6[i] = 1;
}
L6 = R5;
//第6重
f(R6, keyreturn[9], afterG);
for (i = 0; i < 32; i++)
{
if (L6[i] != afterG[i]) R7[i] = 1;
}
L7 = R6;
//第7重
f(R7, keyreturn[8], afterG);
for (i = 0; i < 32; i++)
{
if (L7[i] != afterG[i]) R8[i] = 1;
}
L8 = R7;
//第8重
f(R8, keyreturn[7], afterG);
for (i = 0; i < 32; i++)
{
if (L8[i] != afterG[i]) R9[i] = 1;
}
L9 = R8;
//第9重
f(R9, keyreturn[6], afterG);
for (i = 0; i < 32; i++)
{
if (L9[i] != afterG[i]) R10[i] = 1;
}
L10 = R9;
//第10重
f(R10, keyreturn[5], afterG);
for (i = 0; i < 32; i++)
{
if (L10[i] != afterG[i]) R11[i] = 1;
}
L11 = R10;
//第11重
f(R11, keyreturn[4], afterG);
for (i = 0; i < 32; i++)
{
if (L11[i] != afterG[i]) R12[i] = 1;
}
L12 = R11;
//第12重
f(R12, keyreturn[3], afterG);
for (i = 0; i < 32; i++)
{
if (L12[i] != afterG[i]) R13[i] = 1;
}
L13 = R12;
//第13重
f(R13, keyreturn[2], afterG);
for (i = 0; i < 32; i++)
{
if (L13[i] != afterG[i]) R14[i] = 1;
}
L14 = R13;
//第14重
f(R14, keyreturn[1], afterG);
for (i = 0; i < 32; i++)
{
if (L14[i] != afterG[i]) R15[i] = 1;
}
L15 = R14;
//第15重
f(R15, keyreturn[0], afterG);
for (i = 0; i < 32; i++)
{
if (L15[i] != afterG[i]) R16[i] = 1;
}
L16 = R15;
//第16重
for (i = 0; i < 32; i++)
{
temp[i] = R16[i];
temp[i + 32] = L16[i];
}
FP(temp, out);
}
// #include <stdio.h>
// main()
// {
// key[56];
// crypt[64];
// plain[64] = {1, 0, 1, 0, 1, 0, 1, 0};
// memset(key, 0, sizeof(key));
// //memset(plain, 0, sizeof(plain));
// memset(crypt, 0, sizeof(crypt));
// DES a;
// a.makekey(key);
// //a.DES_jiami(plain, crypt);
// //for (i = 0; i < 64; i++) {
// // if (i % 8 == 0) printf("\n");
// // printf("%01d ", crypt[i]);
// // }
// for (i = 0; i < 64; i++) {
// if (i % 8 == 0) printf("\n");
// printf("%01d ", plain[i]);
// }
// printf("\n");
// a.DES_jiemi(plain, plain);
// for (i = 0; i < 64; i++) {
// if (i % 8 == 0) printf("\n");
// printf("%01d ", plain[i]);
// }
// return 0;
// }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -