📄 des加密算法在c#下的实现.txt
字号:
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
public int[] DES(int[][] keys, char[] r)
{
//2进制明文分组Li Ri
int[] L0 = new int[32]; int[] R0 = new int[32];
int[] L1 = new int[32]; int[] R1 = new int[32];
int[] L2 = new int[32]; int[] R2 = new int[32];
int[] L3 = new int[32]; int[] R3 = new int[32];
int[] L4 = new int[32]; int[] R4 = new int[32];
int[] L5 = new int[32]; int[] R5 = new int[32];
int[] L6 = new int[32]; int[] R6 = new int[32];
int[] L7 = new int[32]; int[] R7 = new int[32];
int[] L8 = new int[32]; int[] R8 = new int[32];
int[] L9 = new int[32]; int[] R9 = new int[32];
int[] L10 = new int[32]; int[] R10 = new int[32];
int[] L11 = new int[32]; int[] R11 = new int[32];
int[] L12 = new int[32]; int[] R12 = new int[32];
int[] L13 = new int[32]; int[] R13 = new int[32];
int[] L14 = new int[32]; int[] R14 = new int[32];
int[] L15 = new int[32]; int[] R15 = new int[32];
int[] L16 = new int[32]; int[] R16 = new int[32];
int[] afterG = new int[32];
//获得2进制明文经过IP置换后结果
int[] afterIP = IP(r);
int[] Final = new int[64];
int[] temp = new int[64];
//获得L0 R0
for (int i = 0; i < 32; i++)
{
L0 = afterIP;
R0 = afterIP[i + 32];
}
//用R0和第一个密钥进行g函数
afterG = g(R0, keys[0]);
for (int i=0;i<32;i++)
{
if (L0!=afterG) R1=1;//L0与R1异或
}
L1 = R0;
//第一重
afterG = g(R1, keys[1]);
for (int i = 0; i < 32; i++)
{
if (L1 != afterG) R2 = 1;
}
L2 = R1;
//第二重
afterG = g(R2, keys[2]);
for (int i = 0; i < 32; i++)
{
if (L2 != afterG) R3 = 1;
}
L3 = R2;
//第3重
afterG = g(R3, keys[3]);
for (int i = 0; i < 32; i++)
{
if (L3 != afterG) R4 = 1;
}
L4 = R3;
//第4重
afterG = g(R4, keys[4]);
for (int i = 0; i < 32; i++)
{
if (L4 != afterG) R5 = 1;
}
L5 = R4;
//第5重
afterG = g(R5, keys[5]);
for (int i = 0; i < 32; i++)
{
if (L5 != afterG) R6 = 1;
}
L6 = R5;
//第6重
afterG = g(R6, keys[6]);
for (int i = 0; i < 32; i++)
{
if (L6 != afterG) R7 = 1;
}
L7 = R6;
//第7重
afterG = g(R7, keys[7]);
for (int i = 0; i < 32; i++)
{
if (L7 != afterG) R8 = 1;
}
L8 = R7;
//第8重
afterG = g(R8, keys[8]);
for (int i = 0; i < 32; i++)
{
if (L8 != afterG) R9 = 1;
}
L9 = R8;
//第9重
afterG = g(R9, keys[9]);
for (int i = 0; i < 32; i++)
{
if (L9 != afterG) R10 = 1;
}
L10 = R9;
//第10重
afterG = g(R10, keys[10]);
for (int i = 0; i < 32; i++)
{
if (L10 != afterG) R11 = 1;
}
L11 = R10;
//第11重
afterG = g(R11, keys[11]);
for (int i = 0; i < 32; i++)
{
if (L11 != afterG) R12 = 1;
}
L12 = R11;
//第12重
afterG = g(R12, keys[12]);
for (int i = 0; i < 32; i++)
{
if (L12 != afterG) R13 = 1;
}
L13 = R12;
//第13重
afterG = g(R13, keys[13]);
for (int i = 0; i < 32; i++)
{
if (L13 != afterG) R14 = 1;
}
L14 = R13;
//第14重
afterG = g(R14, keys[14]);
for (int i = 0; i < 32; i++)
{
if (L14 != afterG) R15 = 1;
}
L15 = R14;
//第15重
afterG = g(R15, keys[15]);
for (int i = 0; i < 32; i++)
{
if (L15 != afterG) R16 = 1;
}
L16 = R15;
//第16重
//合并L16和R16
for (int i = 0; i < 32; i++)
{
temp = R16;
temp[i + 32] = L16;
}
//明文经过IP-1置换输出
Final = IP_1(temp);
return Final;
}
//16个密钥倒向输入计算DES反函数,原理大致与DES相同
public int[] DES_1(int[][] keys, char[] r)
{
int[] L0 = new int[32]; int[] R0 = new int[32];
int[] L1 = new int[32]; int[] R1 = new int[32];
int[] L2 = new int[32]; int[] R2 = new int[32];
int[] L3 = new int[32]; int[] R3 = new int[32];
int[] L4 = new int[32]; int[] R4 = new int[32];
int[] L5 = new int[32]; int[] R5 = new int[32];
int[] L6 = new int[32]; int[] R6 = new int[32];
int[] L7 = new int[32]; int[] R7 = new int[32];
int[] L8 = new int[32]; int[] R8 = new int[32];
int[] L9 = new int[32]; int[] R9 = new int[32];
int[] L10 = new int[32]; int[] R10 = new int[32];
int[] L11 = new int[32]; int[] R11 = new int[32];
int[] L12 = new int[32]; int[] R12 = new int[32];
int[] L13 = new int[32]; int[] R13 = new int[32];
int[] L14 = new int[32]; int[] R14 = new int[32];
int[] L15 = new int[32]; int[] R15 = new int[32];
int[] L16 = new int[32]; int[] R16 = new int[32];
int[] afterG = new int[32];
int[] afterIP = IP(r);
int[] Final = new int[64];
int[] temp = new int[64];
for (int i = 0; i < 32; i++)
{
L0 = afterIP;
R0 = afterIP[i + 32];
}
afterG = g(R0, keys[15]);
for (int i=0;i<32;i++)
{
if (L0!=afterG) R1=1;
}
L1 = R0;
//第一重
afterG = g(R1, keys[14]);
for (int i = 0; i < 32; i++)
{
if (L1 != afterG) R2 = 1;
}
L2 = R1;
//第二重
afterG = g(R2, keys[13]);
for (int i = 0; i < 32; i++)
{
if (L2 != afterG) R3 = 1;
}
L3 = R2;
//第3重
afterG = g(R3, keys[12]);
for (int i = 0; i < 32; i++)
{
if (L3 != afterG) R4 = 1;
}
L4 = R3;
//第4重
afterG = g(R4, keys[11]);
for (int i = 0; i < 32; i++)
{
if (L4 != afterG) R5 = 1;
}
L5 = R4;
//第5重
afterG = g(R5, keys[10]);
for (int i = 0; i < 32; i++)
{
if (L5 != afterG) R6 = 1;
}
L6 = R5;
//第6重
afterG = g(R6, keys[9]);
for (int i = 0; i < 32; i++)
{
if (L6 != afterG) R7 = 1;
}
L7 = R6;
//第7重
afterG = g(R7, keys[8]);
for (int i = 0; i < 32; i++)
{
if (L7 != afterG) R8 = 1;
}
L8 = R7;
//第8重
afterG = g(R8, keys[7]);
for (int i = 0; i < 32; i++)
{
if (L8 != afterG) R9 = 1;
}
L9 = R8;
//第9重
afterG = g(R9, keys[6]);
for (int i = 0; i < 32; i++)
{
if (L9 != afterG) R10 = 1;
}
L10 = R9;
//第10重
afterG = g(R10, keys[5]);
for (int i = 0; i < 32; i++)
{
if (L10 != afterG) R11 = 1;
}
L11 = R10;
//第11重
afterG = g(R11, keys[4]);
for (int i = 0; i < 32; i++)
{
if (L11 != afterG) R12 = 1;
}
L12 = R11;
//第12重
afterG = g(R12, keys[3]);
for (int i = 0; i < 32; i++)
{
if (L12 != afterG) R13 = 1;
}
L13 = R12;
//第13重
afterG = g(R13, keys[2]);
for (int i = 0; i < 32; i++)
{
if (L13 != afterG) R14 = 1;
}
L14 = R13;
//第14重
afterG = g(R14, keys[1]);
for (int i = 0; i < 32; i++)
{
if (L14 != afterG) R15 = 1;
}
L15 = R14;
//第15重
afterG = g(R15, keys[0]);
for (int i = 0; i < 32; i++)
{
if (L15 != afterG) R16 = 1;
}
L16 = R15;
//第16重
for (int i = 0; i < 32; i++)
{
temp = R16;
temp[i + 32] = L16;
}
Final = IP_1(temp);
return Final;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -