分享
 
 
 

DES加密算法在C#下的实现

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

此程序分两部分,第一部分为主程序,另一部分为函数库

本程序中用int[]表示char的2进制形式,如'a'=int[8]{0,1,1,0,0,0,0,1}

下面副程序 本程序在C# 2005下通过。。

#region Using directives

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Windows.Forms;

using System.IO;

#endregion

namespace DES_2nd

{

partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

Func.Func F = new Func.Func(); // 初始化函数库

private void button1_Click(object sender, EventArgs e)

{

char[] tempmchar = mbox.Text.ToCharArray(); //原始明文

int mod = tempmchar.Length % 8; //扩展明文为8的倍数

char[] mchar = new char[tempmchar.Length + (8 - mod)];

for (int i = 0; i < tempmchar.Length; i++)

{

mchar[i] = tempmchar[i];

}

for (int i = tempmchar.Length; i < mchar.Length; i++)

{

mchar[i] = ' ';

}

char[] kchar = kbox.Text.ToCharArray();//获得64位密钥

char[] cchar = new char[mchar.Length];//初始化密文数组

int[][] keys = F.makekey(kchar);//由makekey函数通过64位密钥计算16个48位密钥

int div = mchar.Length / 8;//每8个为一组对明文分组

if ((mchar.Length % 8) != 0) div += 1;

char[][] divmchar = new char[div][];//存放分组明文

for (int i = 0; i < div; i++)

{

divmchar[i] = new char[8];

divmchar[i][0] = mchar[i * 8 + 0];

divmchar[i][1] = mchar[i * 8 + 1];

divmchar[i][2] = mchar[i * 8 + 2];

divmchar[i][3] = mchar[i * 8 + 3];

divmchar[i][4] = mchar[i * 8 + 4];

divmchar[i][5] = mchar[i * 8 + 5];

divmchar[i][6] = mchar[i * 8 + 6];

divmchar[i][7] = mchar[i * 8 + 7];

}

int[][] divcint = new int[div][];//获得分组加密后的分组密文2进制形式

for (int i = 0; i < div; i++)

{

divcint[i] = new int[64];

divcint[i] = F.DES(keys, divmchar[i]);

}

int[] cint = new int[div*64];//合并密文2进制形式

for (int i = 0; i < div; i++)

{

for (int j = 0; j < 64; j++)

{

cint[i * 64 + j] = divcint[i][j];

}

}

//初始序列化

FileStream fs = new FileStream(target.Text, FileMode.OpenOrCreate, FileAccess.Write);

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter br = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

//将2进制密文转化为char密文

for (int i = 0; i < cchar.Length; i++)

{

cchar[i] = (char)(cchar[i] & 0x0000);

}

for (int i = 0; i < cchar.Length; i++)

{

if (cint[i * 8 + 0] == 1) cchar[i] = (char)(cchar[i] | 0x80);

if (cint[i * 8 + 1] == 1) cchar[i] = (char)(cchar[i] | 0x40);

if (cint[i * 8 + 2] == 1) cchar[i] = (char)(cchar[i] | 0x20);

if (cint[i * 8 + 3] == 1) cchar[i] = (char)(cchar[i] | 0x10);

if (cint[i * 8 + 4] == 1) cchar[i] = (char)(cchar[i] | 0x8);

if (cint[i * 8 + 5] == 1) cchar[i] = (char)(cchar[i] | 0x4);

if (cint[i * 8 + 6] == 1) cchar[i] = (char)(cchar[i] | 0x2);

if (cint[i * 8 + 7] == 1) cchar[i] = (char)(cchar[i] | 0x1);

}

//显示密文

cbox.Text = System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(cchar));

//序列化密文到文件

br.Serialize(fs, cchar);

fs.Close();

}

private void button2_Click(object sender, EventArgs e)

{

//初始化

int[] cint = new int[64];

char[] kchar = kbox.Text.ToCharArray();

int[] kint = new int[56];

//或得16个密钥

int[][] keys = F.makekey(kchar);

//从文件反序列化或得密文char形式

FileStream fs = new FileStream(sourse.Text, FileMode.OpenOrCreate, FileAccess.Read);

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

char[] cchar = (char[])bf.Deserialize(fs);

char[] mchar = new char[cchar.Length];

//每8位一组分组密文

int div = cchar.Length / 8;

if ((cchar.Length % 8) != 0) div += 1;

char[][] divcchar = new char[div][];

for (int i = 0; i < div; i++)

{

divcchar[i] = new char[8];

divcchar[i][0] = cchar[i * 8 + 0];

divcchar[i][1] = cchar[i * 8 + 1];

divcchar[i][2] = cchar[i * 8 + 2];

divcchar[i][3] = cchar[i * 8 + 3];

divcchar[i][4] = cchar[i * 8 + 4];

divcchar[i][5] = cchar[i * 8 + 5];

divcchar[i][6] = cchar[i * 8 + 6];

divcchar[i][7] = cchar[i * 8 + 7];

}

//获得分组后明文2进制形式

int[][] divmint = new int[div][];

for (int i = 0; i < div; i++)

{

divmint[i] = new int[64];

divmint[i] = F.DES_1(keys, divcchar[i]);

}

//合并明文2进制形式

int[] mint = new int[div * 64];

for (int i = 0; i < div; i++)

{

for (int j = 0; j < 64; j++)

{

mint[i * 64 + j] = divmint[i][j];

}

}

//由明文2进制形式转化为char形式

for (int i = 0; i < mchar.Length; i++)

{

mchar[i] = (char)(mchar[i] & 0x0000);

}

for (int i = 0; i < mchar.Length; i++)

{

if (mint[i * 8 + 0] == 1) mchar[i] = (char)(mchar[i] | 0x80);

if (mint[i * 8 + 1] == 1) mchar[i] = (char)(mchar[i] | 0x40);

if (mint[i * 8 + 2] == 1) mchar[i] = (char)(mchar[i] | 0x20);

if (mint[i * 8 + 3] == 1) mchar[i] = (char)(mchar[i] | 0x10);

if (mint[i * 8 + 4] == 1) mchar[i] = (char)(mchar[i] | 0x8);

if (mint[i * 8 + 5] == 1) mchar[i] = (char)(mchar[i] | 0x4);

if (mint[i * 8 + 6] == 1) mchar[i] = (char)(mchar[i] | 0x2);

if (mint[i * 8 + 7] == 1) mchar[i] = (char)(mchar[i] | 0x1);

}

//显示明文

mbox.Text = System.Text.Encoding.Default.GetString(System.Text.Encoding.Default.GetBytes(mchar));

fs.Close();

}

}

}

以下为函数库

#region Using directives

using System;

using System.Collections.Generic;

using System.Text;

#endregion

namespace Func //函数库

{

public class Func

{

//IP置换

public int[] IP(char[] mchar)

{

int[] mint = new int[64];

int[] mreturn = new int[64];

for (int i=0;i<mint.Length;i++)

{

mint[i] = 0;

}

//将char明文转化为2进制明文

for (int i =0;i<mchar.Length;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];

return mreturn;

}

//IP-1置换

public int[] IP_1(int[] mchar)

{

//置换表

int[] IPreturn = new int[64];

IPreturn[0] = mchar[39];

IPreturn[1] = mchar[7];

IPreturn[2] = mchar[47];

IPreturn[3] = mchar[15];

IPreturn[4] = mchar[55];

IPreturn[5] = mchar[23];

IPreturn[6] = mchar[63];

IPreturn[7] = mchar[31];

IPreturn[8] = mchar[38];

IPreturn[9] = mchar[6];

IPreturn[10] = mchar[46];

IPreturn[11] = mchar[14];

IPreturn[12] = mchar[54];

IPreturn[13] = mchar[22];

IPreturn[14] = mchar[62];

IPreturn[15] = mchar[30];

IPreturn[16] = mchar[37];

IPreturn[17] = mchar[5];

IPreturn[18] = mchar[45];

IPreturn[19] = mchar[13];

IPreturn[20] = mchar[53];

IPreturn[21] = mchar[21];

IPreturn[22] = mchar[61];

IPreturn[23] = mchar[29];

IPreturn[24] = mchar[36];

IPreturn[25] = mchar[4];

IPreturn[26] = mchar[44];

IPreturn[27] = mchar[12];

IPreturn[28] = mchar[52];

IPreturn[29] = mchar[20];

IPreturn[30] = mchar[60];

IPreturn[31] = mchar[28];

IPreturn[32] = mchar[35];

IPreturn[33] = mchar[3];

IPreturn[34] = mchar[43];

IPreturn[35] = mchar[11];

IPreturn[36] = mchar[51];

IPreturn[37] = mchar[19];

IPreturn[38] = mchar[59];

IPreturn[39] = mchar[27];

IPreturn[40] = mchar[34];

IPreturn[41] = mchar[2];

IPreturn[42] = mchar[42];

IPreturn[43] = mchar[10];

IPreturn[44] = mchar[50];

IPreturn[45] = mchar[18];

IPreturn[46] = mchar[58];

IPreturn[47] = mchar[26];

IPreturn[48] = mchar[33];

IPreturn[49] = mchar[1];

IPreturn[50] = mchar[41];

IPreturn[51] = mchar[9];

IPreturn[52] = mchar[49];

IPreturn[53] = mchar[17];

IPreturn[54] = mchar[57];

IPreturn[55] = mchar[25];

IPreturn[56] = mchar[32];

IPreturn[57] = mchar[0];

IPreturn[58] = mchar[40];

IPreturn[59] = mchar[8];

IPreturn[60] = mchar[48];

IPreturn[61] = mchar[16];

IPreturn[62] = mchar[56];

IPreturn[63] = mchar[24];

return IPreturn;

}

//由64位原始密钥计算16个48位密钥

public int[][] makekey(char[] kchar)

{

//16位数组存放16个输出密钥

int[][] keyreturn = new int[16][];

int[] temp = new int[64];

int[] kint = new int[56];

int[] c0 = new int[28]; int[] d0 = new int[28];

int[] c16 = new int[28]; int[] d1 = new int[28];

int[] c1 = new int[28]; int[] d2 = new int[28];

int[] c2 = new int[28]; int[] d3 = new int[28];

int[] c3 = new int[28]; int[] d4 = new int[28];

int[] c4 = new int[28]; int[] d5 = new int[28];

int[] c5 = new int[28]; int[] d6 = new int[28];

int[] c6 = new int[28]; int[] d7 = new int[28];

int[] c7 = new int[28]; int[] d8 = new int[28];

int[] c8 = new int[28]; int[] d9 = new int[28];

int[] c9 = new int[28]; int[] d10 = new int[28];

int[] c10 = new int[28]; int[] d11 = new int[28];

int[] c11 = new int[28]; int[] d12 = new int[28];

int[] c12 = new int[28]; int[] d13 = new int[28];

int[] c13 = new int[28]; int[] d14 = new int[28];

int[] c14 = new int[28]; int[] d15 = new int[28];

int[] c15 = new int[28]; int[] d16 = new int[28];

int[] k1 = new int[48]; int[] k2 = new int[48]; int[] k3 = new int[48];

int[] k4 = new int[48]; int[] k5 = new int[48]; int[] k6 = new int[48];

int[] k7 = new int[48]; int[] k8 = new int[48]; int[] k9 = new int[48];

int[] k10 = new int[48]; int[] k11 = new int[48]; int[] k12 = new int[48];

int[] k13 = new int[48]; int[] k14 = new int[48]; int[] k15 = new int[48];

int[] k16 = new int[48];

//获得原始密钥2进制形式

for (int i=0;i<kchar.Length;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 (int i=0;i<28;i++)

{

c0[i] = kint[i];

d0[i] = kint[i+28];

}

//循环左移1位

for (int 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 (int 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 (int 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 (int i = 2; i < 28; i++)

{

c4[i - 2] = c3[i];

}

c4[26] = c3[0];

c4[27] = c3[1];

for (int i = 2; i < 28; i++)

{

d4[i - 2] = d3[i];

}

d4[26] = d3[0];

d4[27] = d3[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c5[i - 2] = c4[i];

}

c5[26] = c4[0];

c5[27] = c4[1];

for (int i = 2; i < 28; i++)

{

d5[i - 2] = d4[i];

}

d5[26] = d4[0];

d5[27] = d4[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c6[i - 2] = c5[i];

}

c6[26] = c5[0];

c6[27] = c5[1];

for (int i = 2; i < 28; i++)

{

d6[i - 2] = d5[i];

}

d6[26] = d5[0];

d6[27] = d5[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c7[i - 2] = c6[i];

}

c7[26] = c6[0];

c7[27] = c6[1];

for (int i = 2; i < 28; i++)

{

d7[i - 2] = d6[i];

}

d7[26] = d6[0];

d7[27] = d6[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c8[i - 2] = c7[i];

}

c8[26] = c7[0];

c8[27] = c7[1];

for (int i = 2; i < 28; i++)

{

d8[i - 2] = d7[i];

}

d8[26] = d7[0];

d8[27] = d7[1];

//循环左移1位

for (int i = 1; i < 28; i++)

{

c9[i - 1] = c8[i];

}

c9[27] = c8[0];

for (int i = 1; i < 28; i++)

{

d9[i - 1] = d8[i];

}

d9[27] = d8[0];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c10[i - 2] = c9[i];

}

c10[26] = c9[0];

c10[27] = c9[1];

for (int i = 2; i < 28; i++)

{

d10[i - 2] = d9[i];

}

d10[26] = d9[0];

d10[27] = d9[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c11[i - 2] = c10[i];

}

c11[26] = c10[0];

c11[27] = c10[1];

for (int i = 2; i < 28; i++)

{

d11[i - 2] = d10[i];

}

d11[26] = d10[0];

d11[27] = d10[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c12[i - 2] = c11[i];

}

c12[26] = c11[0];

c12[27] = c11[1];

for (int i = 2; i < 28; i++)

{

d12[i - 2] = d11[i];

}

d12[26] = d11[0];

d12[27] = d11[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c13[i - 2] = c12[i];

}

c13[26] = c12[0];

c13[27] = c12[1];

for (int i = 2; i < 28; i++)

{

d13[i - 2] = d12[i];

}

d13[26] = d12[0];

d13[27] = d12[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c14[i - 2] = c13[i];

}

c14[26] = c13[0];

c14[27] = c13[1];

for (int i = 2; i < 28; i++)

{

d14[i - 2] = d13[i];

}

d14[26] = d13[0];

d14[27] = d13[1];

//循环左移2位

for (int i = 2; i < 28; i++)

{

c15[i - 2] = c14[i];

}

c15[26] = c14[0];

c15[27] = c14[1];

for (int i = 2; i < 28; i++)

{

d15[i - 2] = d14[i];

}

d15[26] = d14[0];

d15[27] = d14[1];

//循环左移1位

for (int i = 1; i < 28; i++)

{

c16[i - 1] = c15[i];

}

c16[27] = c15[0];

for (int i = 1; i < 28; i++)

{

d16[i - 1] = d15[i];

}

d16[27] = d15[0];

//合并Ci,Di并由PC2置换计算最终16个密钥

k1 = PC2(c1, d1);

k2 = PC2(c2, d2);

k3 = PC2(c3, d3);

k4 = PC2(c4, d4);

k5 = PC2(c5, d5);

k6 = PC2(c6, d6);

k7 = PC2(c7, d7);

k8 = PC2(c8, d8);

k9 = PC2(c9, d9);

k10 = PC2(c10, d10);

k11 = PC2(c11, d11);

k12 = PC2(c12, d12);

k13 = PC2(c13, d13);

k14 = PC2(c14, d14);

k15 = PC2(c15, d15);

k16 = PC2(c16, d16);

keyreturn[0] = (int[])k1.Clone();

keyreturn[1] = (int[])k2.Clone();

keyreturn[2] = (int[])k3.Clone();

keyreturn[3] = (int[])k4.Clone();

keyreturn[4] = (int[])k5.Clone();

keyreturn[5] = (int[])k6.Clone();

keyreturn[6] = (int[])k7.Clone();

keyreturn[7] = (int[])k8.Clone();

keyreturn[8] = (int[])k9.Clone();

keyreturn[9] = (int[])k10.Clone();

keyreturn[10] = (int[])k11.Clone();

keyreturn[11] = (int[])k12.Clone();

keyreturn[12] = (int[])k13.Clone();

keyreturn[13] = (int[])k14.Clone();

keyreturn[14] = (int[])k15.Clone();

keyreturn[15] = (int[])k16.Clone();

return keyreturn;

}

//PC2置换

public int[] PC2(int[] c, int[] d)

{

int[] temp = new int[56];

int[] k = new int[48];

//合并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];

return k;

}

//E拓展 将32位明文2进制形式拓展为48位

public int[] E(int[] r)

{

int i;

int[] AfterE = new int[48];

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];

return AfterE;

}

//g函数

public int[] g(int[] r, int[] k)

{

int[] afterE = E(r);//将明文进行E拓展

//E拓展后明文分6组的初始化

int[] m1 = new int[6]; int[] m4 = new int[6]; int[] m7 = new int[6];

int[] m2 = new int[6]; int[] m5 = new int[6]; int[] m8 = new int[6];

int[] m3 = new int[6]; int[] m6 = new int[6];

//明文经过S盒后存放数组初始化

int[] afterS1 = new int[4]; int[] afterS5 = new int[4];

int[] afterS2 = new int[4]; int[] afterS6 = new int[4];

int[] afterS3 = new int[4]; int[] afterS7 = new int[4];

int[] afterS4 = new int[4]; int[] afterS8 = new int[4];

int[] afterS = new int[32];

int[] greturn = new int[32];

int temp;

//E拓展后明文与密钥异或

for (int i = 0; i < 48; i++)

{

if (afterE[i] != k[i]) afterE[i] = 1; else afterE[i] = 0;

}

//将明文分组

for (int i = 0; i < 6; i++)

{

m1[i] = afterE[i];

m2[i] = afterE[i + 6];

m3[i] = afterE[i + 12];

m4[i] = afterE[i + 18];

m5[i] = afterE[i + 24];

m6[i] = afterE[i + 30];

m7[i] = afterE[i + 36];

m8[i] = afterE[i + 42];

}

//6组明文分别经过S盒后各自输出为afterS1...afterS8

temp = getS(m1, 1);

if ((temp & 0x8) != 0) afterS1[0] = 1;

if ((temp & 0x4) != 0) afterS1[1] = 1;

if ((temp & 0x2) != 0) afterS1[2] = 1;

if ((temp & 0x1) != 0) afterS1[3] = 1;

temp = getS(m2, 2);

if ((temp & 0x8) != 0) afterS2[0] = 1;

if ((temp & 0x4) != 0) afterS2[1] = 1;

if ((temp & 0x2) != 0) afterS2[2] = 1;

if ((temp & 0x1) != 0) afterS2[3] = 1;

temp = getS(m3, 3);

if ((temp & 0x8) != 0) afterS3[0] = 1;

if ((temp & 0x4) != 0) afterS3[1] = 1;

if ((temp & 0x2) != 0) afterS3[2] = 1;

if ((temp & 0x1) != 0) afterS3[3] = 1;

temp = getS(m4, 4);

if ((temp & 0x8) != 0) afterS4[0] = 1;

if ((temp & 0x4) != 0) afterS4[1] = 1;

if ((temp & 0x2) != 0) afterS4[2] = 1;

if ((temp & 0x1) != 0) afterS4[3] = 1;

temp = getS(m5, 5);

if ((temp & 0x8) != 0) afterS5[0] = 1;

if ((temp & 0x4) != 0) afterS5[1] = 1;

if ((temp & 0x2) != 0) afterS5[2] = 1;

if ((temp & 0x1) != 0) afterS5[3] = 1;

temp = getS(m6, 6);

if ((temp & 0x8) != 0) afterS6[0] = 1;

if ((temp & 0x4) != 0) afterS6[1] = 1;

if ((temp & 0x2) != 0) afterS6[2] = 1;

if ((temp & 0x1) != 0) afterS6[3] = 1;

temp = getS(m7, 7);

if ((temp & 0x8) != 0) afterS7[0] = 1;

if ((temp & 0x4) != 0) afterS7[1] = 1;

if ((temp & 0x2) != 0) afterS7[2] = 1;

if ((temp & 0x1) != 0) afterS7[3] = 1;

temp = getS(m8, 8);

if ((temp & 0x8) != 0) afterS8[0] = 1;

if ((temp & 0x4) != 0) afterS8[1] = 1;

if ((temp & 0x2) != 0) afterS8[2] = 1;

if ((temp & 0x1) != 0) afterS8[3] = 1;

//合并经过S盒后的明文

for (int i = 0; i < 4; i++)

{

afterS[i] = afterS1[i];

afterS[i + 4] = afterS2[i];

afterS[i + 8] = afterS3[i];

afterS[i + 12] = afterS4[i];

afterS[i + 16] = afterS5[i];

afterS[i + 20] = afterS6[i];

afterS[i + 24] = afterS7[i];

afterS[i + 28] = afterS8[i];

}

//P置换

greturn[0] = afterS[15];

greturn[1] = afterS[6];

greturn[2] = afterS[19];

greturn[3] = afterS[20];

greturn[4] = afterS[28];

greturn[5] = afterS[11];

greturn[6] = afterS[27];

greturn[7] = afterS[16];

greturn[8] = afterS[0];

greturn[9] = afterS[14];

greturn[10] = afterS[22];

greturn[11] = afterS[25];

greturn[12] = afterS[4];

greturn[13] = afterS[17];

greturn[14] = afterS[30];

greturn[15] = afterS[9];

greturn[16] = afterS[1];

greturn[17] = afterS[7];

greturn[18] = afterS[23];

greturn[19] = afterS[13];

greturn[20] = afterS[31];

greturn[21] = afterS[26];

greturn[22] = afterS[2];

greturn[23] = afterS[8];

greturn[24] = afterS[18];

greturn[25] = afterS[12];

greturn[26] = afterS[29];

greturn[27] = afterS[5];

greturn[28] = afterS[21];

greturn[29] = afterS[10];

greturn[30] = afterS[3];

greturn[31] = afterS[24];

return greturn;

}

//获得S盒的值

public int getS(int[] Mi, int i)

{

//初始化8个S盒

int[,] S1 = new int[4, 16]; int[,] S2 = new int[4, 16];

int[,] S3 = new int[4, 16]; int[,] S4 = new int[4, 16];

int[,] S5 = new int[4, 16]; int[,] S6 = new int[4, 16];

int[,] S7 = new int[4, 16]; int[,] S8 = new int[4, 16];

int[] output = new int[8];

int j, k;

//8个S盒

S1[0, 0] = 14;

S1[0, 1] = 4;

S1[0, 2] = 13;

S1[0, 3] = 1;

S1[0, 4] = 2;

S1[0, 5] = 15;

S1[0, 6] = 11;

S1[0, 7] = 8;

S1[0, 8] = 3;

S1[0, 9] = 10;

S1[0, 10] = 6;

S1[0, 11] = 12;

S1[0, 12] = 5;

S1[0, 13] = 9;

S1[0, 14] = 0;

S1[0, 15] = 7;

S1[1, 0] = 0;

S1[1, 1] = 15;

S1[1, 2] = 7;

S1[1, 3] = 4;

S1[1, 4] = 14;

S1[1, 5] = 2;

S1[1, 6] = 13;

S1[1, 7] = 1;

S1[1, 8] = 10;

S1[1, 9] = 6;

S1[1, 10] = 12;

S1[1, 11] = 11;

S1[1, 12] = 9;

S1[1, 13] = 5;

S1[1, 14] = 3;

S1[1, 15] = 8;

S1[2, 0] = 4;

S1[2, 1] = 1;

S1[2, 2] = 14;

S1[2, 3] = 8;

S1[2, 4] = 13;

S1[2, 5] = 6;

S1[2, 6] = 2;

S1[2, 7] = 11;

S1[2, 8] = 15;

S1[2, 9] = 12;

S1[2, 10] = 9;

S1[2, 11] = 7;

S1[2, 12] = 3;

S1[2, 13] = 10;

S1[2, 14] = 5;

S1[2, 15] = 0;

S1[3, 0] = 15;

S1[3, 1] = 12;

S1[3, 2] = 8;

S1[3, 3] = 2;

S1[3, 4] = 4;

S1[3, 5] = 9;

S1[3, 6] = 1;

S1[3, 7] = 7;

S1[3, 8] = 5;

S1[3, 9] = 11;

S1[3, 10] = 3;

S1[3, 11] = 14;

S1[3, 12] = 10;

S1[3, 13] = 0;

S1[3, 14] = 6;

S1[3, 15] = 13;

S2[0, 0] = 15;

S2[0, 1] = 1;

S2[0, 2] = 8;

S2[0, 3] = 14;

S2[0, 4] = 6;

S2[0, 5] = 11;

S2[0, 6] = 3;

S2[0, 7] = 4;

S2[0, 8] = 9;

S2[0, 9] = 7;

S2[0, 10] = 2;

S2[0, 11] = 13;

S2[0, 12] = 12;

S2[0, 13] = 0;

S2[0, 14] = 5;

S2[0, 15] = 10;

S2[1, 0] = 3;

S2[1, 1] = 13;

S2[1, 2] = 4;

S2[1, 3] = 7;

S2[1, 4] = 15;

S2[1, 5] = 2;

S2[1, 6] = 8;

S2[1, 7] = 14;

S2[1, 8] = 12;

S2[1, 9] = 0;

S2[1, 10] = 1;

S2[1, 11] = 10;

S2[1, 12] = 6;

S2[1, 13] = 9;

S2[1, 14] = 11;

S2[1, 15] = 5;

S2[2, 0] = 0;

S2[2, 1] = 14;

S2[2, 2] = 7;

S2[2, 3] = 11;

S2[2, 4] = 10;

S2[2, 5] = 4;

S2[2, 6] = 13;

S2[2, 7] = 1;

S2[2, 8] = 5;

S2[2, 9] = 8;

S2[2, 10] = 12;

S2[2, 11] = 6;

S2[2, 12] = 9;

S2[2, 13] = 3;

S2[2, 14] = 2;

S2[2, 15] = 15;

S2[3, 0] = 13;

S2[3, 1] = 8;

S2[3, 2] = 10;

S2[3, 3] = 1;

S2[3, 4] = 3;

S2[3, 5] = 15;

S2[3, 6] = 4;

S2[3, 7] = 2;

S2[3, 8] = 11;

S2[3, 9] = 6;

S2[3, 10] = 7;

S2[3, 11] = 12;

S2[3, 12] = 0;

S2[3, 13] = 5;

S2[3, 14] = 14;

S2[3, 15] = 9;

S3[0, 0] = 10;

S3[0, 1] = 0;

S3[0, 2] = 9;

S3[0, 3] = 14;

S3[0, 4] = 6;

S3[0, 5] = 3;

S3[0, 6] = 15;

S3[0, 7] = 5;

S3[0, 8] = 1;

S3[0, 9] = 13;

S3[0, 10] = 12;

S3[0, 11] = 7;

S3[0, 12] = 11;

S3[0, 13] = 4;

S3[0, 14] = 2;

S3[0, 15] = 8;

S3[1, 0] = 13;

S3[1, 1] = 7;

S3[1, 2] = 0;

S3[1, 3] = 9;

S3[1, 4] = 3;

S3[1, 5] = 4;

S3[1, 6] = 6;

S3[1, 7] = 10;

S3[1, 8] = 2;

S3[1, 9] = 8;

S3[1, 10] = 5;

S3[1, 11] = 14;

S3[1, 12] = 12;

S3[1, 13] = 11;

S3[1, 14] = 15;

S3[1, 15] = 1;

S3[2, 0] = 13;

S3[2, 1] = 6;

S3[2, 2] = 4;

S3[2, 3] = 9;

S3[2, 4] = 8;

S3[2, 5] = 15;

S3[2, 6] = 3;

S3[2, 7] = 0;

S3[2, 8] = 11;

S3[2, 9] = 1;

S3[2, 10] = 2;

S3[2, 11] = 12;

S3[2, 12] = 5;

S3[2, 13] = 10;

S3[2, 14] = 14;

S3[2, 15] = 7;

S3[3, 0] = 1;

S3[3, 1] = 10;

S3[3, 2] = 13;

S3[3, 3] = 0;

S3[3, 4] = 6;

S3[3, 5] = 9;

S3[3, 6] = 8;

S3[3, 7] = 7;

S3[3, 8] = 4;

S3[3, 9] = 15;

S3[3, 10] = 14;

S3[3, 11] = 3;

S3[3, 12] = 11;

S3[3, 13] = 5;

S3[3, 14] = 2;

S3[3, 15] = 12;

S4[0, 0] = 7;

S4[0, 1] = 13;

S4[0, 2] = 14;

S4[0, 3] = 3;

S4[0, 4] = 0;

S4[0, 5] = 6;

S4[0, 6] = 9;

S4[0, 7] = 10;

S4[0, 8] = 1;

S4[0, 9] = 2;

S4[0, 10] = 8;

S4[0, 11] = 5;

S4[0, 12] = 11;

S4[0, 13] = 12;

S4[0, 14] = 4;

S4[0, 15] = 15;

S4[1, 0] = 13;

S4[1, 1] = 8;

S4[1, 2] = 11;

S4[1, 3] = 5;

S4[1, 4] = 6;

S4[1, 5] = 15;

S4[1, 6] = 0;

S4[1, 7] = 3;

S4[1, 8] = 4;

S4[1, 9] = 7;

S4[1, 10] = 2;

S4[1, 11] = 12;

S4[1, 12] = 1;

S4[1, 13] = 10;

S4[1, 14] = 14;

S4[1, 15] = 9;

S4[2, 0] = 10;

S4[2, 1] = 6;

S4[2, 2] = 9;

S4[2, 3] = 0;

S4[2, 4] = 12;

S4[2, 5] = 11;

S4[2, 6] = 7;

S4[2, 7] = 13;

S4[2, 8] = 15;

S4[2, 9] = 1;

S4[2, 10] = 3;

S4[2, 11] = 14;

S4[2, 12] = 5;

S4[2, 13] = 2;

S4[2, 14] = 8;

S4[2, 15] = 4;

S4[3, 0] = 3;

S4[3, 1] = 15;

S4[3, 2] = 0;

S4[3, 3] = 6;

S4[3, 4] = 10;

S4[3, 5] = 1;

S4[3, 6] = 13;

S4[3, 7] = 8;

S4[3, 8] = 9;

S4[3, 9] = 4;

S4[3, 10] = 5;

S4[3, 11] = 11;

S4[3, 12] = 12;

S4[3, 13] = 7;

S4[3, 14] = 2;

S4[3, 15] = 14;

S5[0, 0] = 2;

S5[0, 1] = 12;

S5[0, 2] = 4;

S5[0, 3] = 1;

S5[0, 4] = 7;

S5[0, 5] = 10;

S5[0, 6] = 11;

S5[0, 7] = 6;

S5[0, 8] = 8;

S5[0, 9] = 5;

S5[0, 10] = 3;

S5[0, 11] = 15;

S5[0, 12] = 13;

S5[0, 13] = 0;

S5[0, 14] = 14;

S5[0, 15] = 9;

S5[1, 0] = 14;

S5[1, 1] = 11;

S5[1, 2] = 2;

S5[1, 3] = 12;

S5[1, 4] = 4;

S5[1, 5] = 7;

S5[1, 6] = 13;

S5[1, 7] = 1;

S5[1, 8] = 5;

S5[1, 9] = 0;

S5[1, 10] = 15;

S5[1, 11] = 10;

S5[1, 12] = 3;

S5[1, 13] = 9;

S5[1, 14] = 8;

S5[1, 15] = 6;

S5[2, 0] = 4;

S5[2, 1] = 2;

S5[2, 2] = 1;

S5[2, 3] = 11;

S5[2, 4] = 10;

S5[2, 5] = 13;

S5[2, 6] = 7;

S5[2, 7] = 8;

S5[2, 8] = 15;

S5[2, 9] = 9;

S5[2, 10] = 12;

S5[2, 11] = 5;

S5[2, 12] = 6;

S5[2, 13] = 3;

S5[2, 14] = 0;

S5[2, 15] = 14;

S5[3, 0] = 11;

S5[3, 1] = 8;

S5[3, 2] = 12;

S5[3, 3] = 7;

S5[3, 4] = 1;

S5[3, 5] = 14;

S5[3, 6] = 2;

S5[3, 7] = 13;

S5[3, 8] = 6;

S5[3, 9] = 15;

S5[3, 10] = 0;

S5[3, 11] = 9;

S5[3, 12] = 10;

S5[3, 13] = 4;

S5[3, 14] = 5;

S5[3, 15] = 3;

S6[0, 0] = 12;

S6[0, 1] = 1;

S6[0, 2] = 10;

S6[0, 3] = 15;

S6[0, 4] = 9;

S6[0, 5] = 2;

S6[0, 6] = 6;

S6[0, 7] = 8;

S6[0, 8] = 0;

S6[0, 9] = 13;

S6[0, 10] = 3;

S6[0, 11] = 4;

S6[0, 12] = 14;

S6[0, 13] = 7;

S6[0, 14] = 5;

S6[0, 15] = 11;

S6[1, 0] = 10;

S6[1, 1] = 15;

S6[1, 2] = 4;

S6[1, 3] = 2;

S6[1, 4] = 7;

S6[1, 5] = 12;

S6[1, 6] = 9;

S6[1, 7] = 5;

S6[1, 8] = 6;

S6[1, 9] = 1;

S6[1, 10] = 13;

S6[1, 11] = 14;

S6[1, 12] = 0;

S6[1, 13] = 11;

S6[1, 14] = 3;

S6[1, 15] = 8;

S6[2, 0] = 9;

S6[2, 1] = 14;

S6[2, 2] = 15;

S6[2, 3] = 5;

S6[2, 4] = 2;

S6[2, 5] = 8;

S6[2, 6] = 12;

S6[2, 7] = 3;

S6[2, 8] = 7;

S6[2, 9] = 0;

S6[2, 10] = 4;

S6[2, 11] = 10;

S6[2, 12] = 1;

S6[2, 13] = 13;

S6[2, 14] = 11;

S6[2, 15] = 6;

S6[3, 0] = 4;

S6[3, 1] = 3;

S6[3, 2] = 2;

S6[3, 3] = 12;

S6[3, 4] = 9;

S6[3, 5] = 5;

S6[3, 6] = 15;

S6[3, 7] = 10;

S6[3, 8] = 11;

S6[3, 9] = 14;

S6[3, 10] = 1;

S6[3, 11] = 7;

S6[3, 12] = 6;

S6[3, 13] = 0;

S6[3, 14] = 8;

S6[3, 15] = 13;

S7[0, 0] = 4;

S7[0, 1] = 11;

S7[0, 2] = 2;

S7[0, 3] = 14;

S7[0, 4] = 15;

S7[0, 5] = 0;

S7[0, 6] = 8;

S7[0, 7] = 13;

S7[0, 8] = 3;

S7[0, 9] = 12;

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

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[i] = afterIP[i];

R0[i] = afterIP[i + 32];

}

//用R0和第一个密钥进行g函数

afterG = g(R0, keys[0]);

for (int i=0;i<32;i++)

{

if (L0[i]!=afterG[i]) R1[i]=1;//L0与R1异或

}

L1 = R0;

//第一重

afterG = g(R1, keys[1]);

for (int i = 0; i < 32; i++)

{

if (L1[i] != afterG[i]) R2[i] = 1;

}

L2 = R1;

//第二重

afterG = g(R2, keys[2]);

for (int i = 0; i < 32; i++)

{

if (L2[i] != afterG[i]) R3[i] = 1;

}

L3 = R2;

//第3重

afterG = g(R3, keys[3]);

for (int i = 0; i < 32; i++)

{

if (L3[i] != afterG[i]) R4[i] = 1;

}

L4 = R3;

//第4重

afterG = g(R4, keys[4]);

for (int i = 0; i < 32; i++)

{

if (L4[i] != afterG[i]) R5[i] = 1;

}

L5 = R4;

//第5重

afterG = g(R5, keys[5]);

for (int i = 0; i < 32; i++)

{

if (L5[i] != afterG[i]) R6[i] = 1;

}

L6 = R5;

//第6重

afterG = g(R6, keys[6]);

for (int i = 0; i < 32; i++)

{

if (L6[i] != afterG[i]) R7[i] = 1;

}

L7 = R6;

//第7重

afterG = g(R7, keys[7]);

for (int i = 0; i < 32; i++)

{

if (L7[i] != afterG[i]) R8[i] = 1;

}

L8 = R7;

//第8重

afterG = g(R8, keys[8]);

for (int i = 0; i < 32; i++)

{

if (L8[i] != afterG[i]) R9[i] = 1;

}

L9 = R8;

//第9重

afterG = g(R9, keys[9]);

for (int i = 0; i < 32; i++)

{

if (L9[i] != afterG[i]) R10[i] = 1;

}

L10 = R9;

//第10重

afterG = g(R10, keys[10]);

for (int i = 0; i < 32; i++)

{

if (L10[i] != afterG[i]) R11[i] = 1;

}

L11 = R10;

//第11重

afterG = g(R11, keys[11]);

for (int i = 0; i < 32; i++)

{

if (L11[i] != afterG[i]) R12[i] = 1;

}

L12 = R11;

//第12重

afterG = g(R12, keys[12]);

for (int i = 0; i < 32; i++)

{

if (L12[i] != afterG[i]) R13[i] = 1;

}

L13 = R12;

//第13重

afterG = g(R13, keys[13]);

for (int i = 0; i < 32; i++)

{

if (L13[i] != afterG[i]) R14[i] = 1;

}

L14 = R13;

//第14重

afterG = g(R14, keys[14]);

for (int i = 0; i < 32; i++)

{

if (L14[i] != afterG[i]) R15[i] = 1;

}

L15 = R14;

//第15重

afterG = g(R15, keys[15]);

for (int i = 0; i < 32; i++)

{

if (L15[i] != afterG[i]) R16[i] = 1;

}

L16 = R15;

//第16重

//合并L16和R16

for (int i = 0; i < 32; i++)

{

temp[i] = R16[i];

temp[i + 32] = L16[i];

}

//明文经过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[i] = afterIP[i];

R0[i] = afterIP[i + 32];

}

afterG = g(R0, keys[15]);

for (int i=0;i<32;i++)

{

if (L0[i]!=afterG[i]) R1[i]=1;

}

L1 = R0;

//第一重

afterG = g(R1, keys[14]);

for (int i = 0; i < 32; i++)

{

if (L1[i] != afterG[i]) R2[i] = 1;

}

L2 = R1;

//第二重

afterG = g(R2, keys[13]);

for (int i = 0; i < 32; i++)

{

if (L2[i] != afterG[i]) R3[i] = 1;

}

L3 = R2;

//第3重

afterG = g(R3, keys[12]);

for (int i = 0; i < 32; i++)

{

if (L3[i] != afterG[i]) R4[i] = 1;

}

L4 = R3;

//第4重

afterG = g(R4, keys[11]);

for (int i = 0; i < 32; i++)

{

if (L4[i] != afterG[i]) R5[i] = 1;

}

L5 = R4;

//第5重

afterG = g(R5, keys[10]);

for (int i = 0; i < 32; i++)

{

if (L5[i] != afterG[i]) R6[i] = 1;

}

L6 = R5;

//第6重

afterG = g(R6, keys[9]);

for (int i = 0; i < 32; i++)

{

if (L6[i] != afterG[i]) R7[i] = 1;

}

L7 = R6;

//第7重

afterG = g(R7, keys[8]);

for (int i = 0; i < 32; i++)

{

if (L7[i] != afterG[i]) R8[i] = 1;

}

L8 = R7;

//第8重

afterG = g(R8, keys[7]);

for (int i = 0; i < 32; i++)

{

if (L8[i] != afterG[i]) R9[i] = 1;

}

L9 = R8;

//第9重

afterG = g(R9, keys[6]);

for (int i = 0; i < 32; i++)

{

if (L9[i] != afterG[i]) R10[i] = 1;

}

L10 = R9;

//第10重

afterG = g(R10, keys[5]);

for (int i = 0; i < 32; i++)

{

if (L10[i] != afterG[i]) R11[i] = 1;

}

L11 = R10;

//第11重

afterG = g(R11, keys[4]);

for (int i = 0; i < 32; i++)

{

if (L11[i] != afterG[i]) R12[i] = 1;

}

L12 = R11;

//第12重

afterG = g(R12, keys[3]);

for (int i = 0; i < 32; i++)

{

if (L12[i] != afterG[i]) R13[i] = 1;

}

L13 = R12;

//第13重

afterG = g(R13, keys[2]);

for (int i = 0; i < 32; i++)

{

if (L13[i] != afterG[i]) R14[i] = 1;

}

L14 = R13;

//第14重

afterG = g(R14, keys[1]);

for (int i = 0; i < 32; i++)

{

if (L14[i] != afterG[i]) R15[i] = 1;

}

L15 = R14;

//第15重

afterG = g(R15, keys[0]);

for (int i = 0; i < 32; i++)

{

if (L15[i] != afterG[i]) R16[i] = 1;

}

L16 = R15;

//第16重

for (int i = 0; i < 32; i++)

{

temp[i] = R16[i];

temp[i + 32] = L16[i];

}

Final = IP_1(temp);

return Final;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有