DES加密算法的java实现

最近老师留的作业是DES加密算法的实现,作业要求是:输入自己的学号(纯数字),输入4位二进制密钥(重复16次形成64位密钥)。自己用javaGUI写了一个,如下:


工程结构如上图所示:

Hex_to_Binary.java 数据进制转换

IP_Change.java 进行置换运算

LS.java 对数据进行LS移位运算

ModAdd.java 对数据进行模二加法处理

S_box.java 对数据进行S盒处理

DES_Biao.java 主程序在这个函数中

_____________________________________________________________

Hex_to_Binary.java

package Data;

public class Hex_to_Binary {
	// 检测x的string输入是否符合规范,使x只能输入纯数字文本
	public boolean x_string_test(String test) {
		byte[] bt;
		int temp;// 中转变量
		int logo = -1;// 标志,如果-1,则表示string是一个数串.如果0,则表示不符合规范
		bt = test.getBytes();// 将string转化成byte数组
		if ((bt.length > 16) || (bt.length == 0)) {
			return false;
		}
		for (int i = 0; i < bt.length; i++) {
			temp = bt[i] - 48;// int范围大于byte,所以可以直接赋值,-48可以使数字类型字符变成int型
			if (temp < 0 || temp > 9)// temp不符合规范表示,string出现了非数字字符
			{
				logo = 0;
				break;// 若发现非数字出现,那么立刻中断查询
			}
		}
		if (logo == -1) {
			return true;
		} else {
			return false;
		}
	}

	// 将一个string转化成64位int数组输出
	public void hex_to_bianry_64(String test, int x_64[]) {
		byte[] bt;
		bt = test.getBytes();
		int[] it = new int[bt.length];
		int len, i, j;
		for (i = bt.length - 1, j = 64; i >= 0; i--) {
			it[i] = bt[i] - 48;
			j = j - 4;
			len = j;
			switch (it[i]) {
			case 0:
				x_64[len] = 0;
				x_64[len + 1] = 0;
				x_64[len + 2] = 0;
				x_64[len + 3] = 0;
				break;
			case 1:
				x_64[len] = 0;
				x_64[len + 1] = 0;
				x_64[len + 2] = 0;
				x_64[len + 3] = 1;
				break;
			case 2:
				x_64[len] = 0;
				x_64[len + 1] = 0;
				x_64[len + 2] = 1;
				x_64[len + 3] = 0;
				break;
			case 3:
				x_64[len] = 0;
				x_64[len + 1] = 0;
				x_64[len + 2] = 1;
				x_64[len + 3] = 1;
				break;
			case 4:
				x_64[len] = 0;
				x_64[len + 1] = 1;
				x_64[len + 2] = 0;
				x_64[len + 3] = 0;
				break;
			case 5:
				x_64[len] = 0;
				x_64[len + 1] = 1;
				x_64[len + 2] = 0;
				x_64[len + 3] = 1;
				break;
			case 6:
				x_64[len] = 0;
				x_64[len + 1] = 1;
				x_64[len + 2] = 1;
				x_64[len + 3] = 0;
				break;
			case 7:
				x_64[len] = 0;
				x_64[len + 1] = 1;
				x_64[len + 2] = 1;
				x_64[len + 3] = 1;
				break;
			case 8:
				x_64[len] = 1;
				x_64[len + 1] = 0;
				x_64[len + 2] = 0;
				x_64[len + 3] = 0;
				break;
			case 9:
				x_64[len] = 1;
				x_64[len + 1] = 0;
				x_64[len + 2] = 0;
				x_64[len + 3] = 1;
				break;
			}
		}
		for (i = 0; i < j; i++) {
			x_64[i] = 0;
		}
	}

	// 检测密钥4位是否符合输入规范,要求为0/1的四位数字
	public boolean k0_test(String test) {
		int logo = -1;// -1表示符合规范,0表示不符合规范
		int temp;// 中转变量
		byte[] bt = test.getBytes();
		if (bt.length != 4) {
			return false;
		}
		for (int i = 0; i < 4; i++) {
			temp = bt[i] - 48;
			if ((temp != 0)) {
				if (temp != 1) {
					return false;
				}
			}
		}
		if (logo == -1) {
			return true;
		} else {
			return false;
		}
	}

	// 将四位二进制密钥转化成64位k0
	public void k_4_to_64(String test, int k0[]) {
		byte[] bt;
		bt = test.getBytes();
		for (int i = 0; i < 64;) {
			k0[i] = bt[0] - 48;
			k0[i + 1] = bt[1] - 48;
			k0[i + 2] = bt[2] - 48;
			k0[i + 3] = bt[3] - 48;
			i = i + 4;
		}
	}

	public void decimal_to_binary(int a, int temp[]) {
		for (int i = 3; i >= 0; i--) {
			temp[i] = a % 2;
			a = a / 2;
		}
	}
}
IP_Change.java

package Data;

public class IP_Change {
	private int[] IP_0 = new int[] { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44,
			36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40,
			32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27,
			19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23,
			15, 7 };

	private int[] IP_1 = new int[] { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47,
			15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13,
			53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51,
			19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17,
			57, 25 };

	private int[] IP_k = new int[] { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42,
			34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
			63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61,
			53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 };

	private int[] IP_knew = new int[] { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21,
			10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47,
			55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36,
			29, 32, };

	private int[] IP_E = new int[] { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,
			10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20,
			21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1, };

	private int[] IP_Final = new int[] { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7,
			47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45,
			13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11,
			51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49,
			17, 57, 25, };

	// 对64位明文进行初始置换
	public void IP_first(int x0[], int x1[]) {
		for (int i = 0; i < 64; i++) {
			x1[i] = x0[IP_0[i] - 1];
		}
	}

	// 对经过了S盒处理的f(Ri-1,Ki)进行置换操作,从32位的FRKnew置换成32位的Rnew
	public void IP_F(int FRKnew[], int Rnew[]) {
		for (int i = 0; i < 32; i++) {
			Rnew[i] = FRKnew[IP_E[i] - 1];
		}
	}

	// 对密钥k0进行PC-1置换,将64位k0置换成56位的PC-1
	public void IP_k(int k0[], int kpc[]) {
		for (int i = 0; i < 56; i++) {
			kpc[i] = k0[IP_k[i] - 1];
		}
	}

	// 用28位的C和D,进行ip置换产生48位的新子密钥
	public void IP_newk(int C[], int D[], int kn_48[]) {
		int[] temp = new int[56];
		// 将C和D数组合成为一个数组,方便计算
		for (int i = 0; i < 28; i++) {
			temp[i] = C[i];
		}
		for (int i = 28; i < 56; i++) {
			temp[i] = D[i - 28];
		}
		for (int i = 0; i < 48; i++) {
			kn_48[i] = temp[IP_knew[i] - 1];
		}
	}

	// 位选择函数E,将32长度的R扩展成48位的Re
	public void ER(int R[], int Re[]) {
		for (int i = 0; i < 48; i++) {
			Re[i] = R[IP_E[i] - 1];
		}
	}

	// 最终置换,fx是置换前的数据,XF是置换后的数据
	public void FIP(int fx[], int XF[]) {
		for (int i = 0; i < 64; i++) {
			XF[i] = fx[IP_Final[i] - 1];
		}
	}
}


LS.java

package Data;

public class LS {
	//C和D都是28位长度的int数组
	public void LS_CD(int times,int C[],int D[]) {
		//1,2,9,16则进行一位左移
		if((times==1)||(times==2)||(times==9)||(times==16))
		{
			int temp1 = C[0];
			int temp2 = D[0];
			for(int i=0;i<27;i++)
			{
				C[i]=C[i+1];
				D[i]=D[i+1];
			}
			C[27]=temp1;
			D[27]=temp1;
		}
		//其他均为左移两位
		else
		{
			int temp1 = C[0];
			int temp2 = D[0];
			for(int i=0;i<27;i++)
			{
				C[i]=C[i+1];
				D[i]=D[i+1];
			}
			C[27]=temp1;
			D[27]=temp1;
			//执行两次左移一位运算
			temp1 = C[0];
			temp2 = D[0];
			for(int i=0;i<27;i++)
			{
				C[i]=C[i+1];
				D[i]=D[i+1];
			}
			C[27]=temp1;
			D[27]=temp1;
		}
	}
}


ModAdd.java

package Data;

public class ModAdd {
	// 将扩展后的48位R和产生的48位子密钥K进行模2加法
	public void Mod2(int Re[], int kn_48[], int F_R_K[]) {
		int temp;
		for (int i = 0; i < 48; i++) {
			temp = Re[i] + kn_48[i];
			switch (temp) {
			case 0:
				F_R_K[i] = 0;
				break;
			case 1:
				F_R_K[i] = 1;
				break;
			case 2:
				F_R_K[i] = 0;
				break;
			}
		}
	}

	// 将32位的L和32位的Rnew进行模二想加
	public void Mod2_L_F(int Rnew[], int L[], int LF[]) {
		int temp;
		for (int i = 0; i < 32; i++) {
			temp = L[i] + Rnew[i];
			switch (temp) {
			case 0:
				LF[i] = 0;
				break;
			case 1:
				LF[i] = 1;
				break;
			case 2:
				LF[i] = 0;
				break;
			}
		}
	}
}

S_box.java

package Data;

public class S_box {
	private int[] temp = new int[4];
	private int[][] S1 = new int[][] {
			{ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
			{ 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
			{ 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
			{ 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } };
	private int[][] S2 = new int[][] {
			{ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
			{ 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
			{ 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
			{ 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } };
	private int[][] S3 = new int[][] {
			{ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
			{ 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
			{ 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
			{ 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } };
	private int[][] S4 = new int[][] {
			{ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
			{ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
			{ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
			{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } };
	private int[][] S5 = new int[][] {
			{ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
			{ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
			{ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
			{ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } };
	private int[][] S6 = new int[][] {
			{ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
			{ 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
			{ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
			{ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } };
	private int[][] S7 = new int[][] {
			{ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
			{ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
			{ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
			{ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } };
	private int[][] S8 = new int[][] {
			{ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
			{ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
			{ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
			{ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } };
	private int[][][] S = new int[][][] { S1, S2, S3, S4, S5, S6, S7, S8 };

	// 将48位的FRK进行S盒变换,产生32位的FRKnew,每六位为一组进行S盒变换
	public void SortFRK(int FRK[], int FRKnew[]) {
		int a;// 记录三维数组的行列
		int b;
		for (int i = 0; i < 8; i++) {
			// 将二进制数转化成十进制
			a = FRK[6 * i + 0] * 2 + FRK[6 * i + 5] * 1;
			b = FRK[6 * i + 1] * 8 + FRK[6 * i + 2] * 4 + FRK[6 * i + 3] * 2
					+ FRK[6 * i + 4] * 1;
			// 转化S盒中的数字变成四位八进制的
			new Hex_to_Binary().decimal_to_binary(S[i][a][b], temp);
			// 赋值
			FRKnew[i * 4 + 0] = temp[0];
			FRKnew[i * 4 + 1] = temp[1];
			FRKnew[i * 4 + 2] = temp[2];
			FRKnew[i * 4 + 3] = temp[3];
		}
	}
}

DES_Biao.java

package DES_MainFrame;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import Data.Hex_to_Binary;
import Data.IP_Change;
import Data.LS;
import Data.ModAdd;
import Data.S_box;

public class DES_Biao {

	private static JFrame f;
	private static JLabel l1;
	private static JLabel l2;
	private static JLabel l3;
	private static JLabel l4;
	private static JTextField x_field;
	private static JTextField k0_field;
	private static JLabel x_64_label;
	private static JLabel k0_64_label;
	private static JButton start;
	private static JTextArea res_area;
	private static Font font = new Font("Dialog", 0, 20);
	private static Font area_font = new Font("Dialog", 0, 15);
	private static JScrollPane jres;
	private static String x0;
	private static String k0;
	private static String x0_temp = "";
	private static String k0_temp = "";
	private static String xn_temp = "";
	private static String kn_56_temp = "";
	private static String kn_48_temp = "";// 放置48位子密钥的string
	private static int[] x0_64 = new int[64];// 初始64位明文
	private static int[] k0_64 = new int[64];// 初始64位密钥
	private static int[] xn_64 = new int[64];// 经过初始置换的64位明文
	private static int[] kn_56 = new int[56];// 为了产生其他密钥而置换的56位kpc
	private static int[] kn_48 = new int[48];// 计算使用的48位子密钥
	private static int[] FRK = new int[48];// 48位的RE和48位的子密钥kn_48进行模2加法运算
	private static String FRKs = "";
	private static int[] FRKnew = new int[32];// s盒子转化后的32位f结果
	private static String FRKnews = "";
	private static int[] Rnew = new int[32];// FRKnew置换后的数据
	private static String Rnews = "";
	private static int[] fx = new int[64];// 最后逆置换前的64位存储
	private static String fxs = "";
	private static int[] XF = new int[64];
	private static String XFs = "";// 最终密文
	private static int[] LF = new int[32];// L和F进行计算
	private static String LFs = "";
	private static int[] L = new int[32];
	private static String Ls = "";
	private static int[] R = new int[32];
	private static String Rs = "";
	private static int[] Re = new int[48];
	private static String Res = "";
	private static int[] C = new int[28];
	private static String Cs = "";
	private static int[] D = new int[28];
	private static String Ds = "";

	public static void main(String[] args) {
		NewFrame();
		AddListener();
	}

	public static String TString(int b[]) {
		String a = "";
		for (int i = 0; i < b.length; i++) {
			a = a + b[i];
		}
		return a;
	}

	public static void NewFrame() {
		f = new JFrame();

		l1 = new JLabel("明文(请输入学号为例):");
		l1.setFont(font);
		l1.setBounds(10, 10, 200, 30);
		x_field = new JTextField(60);
		x_field.setBounds(220, 10, 150, 30);
		x_field.setFont(font);

		l2 = new JLabel("密钥(四位二进制密钥):");
		l2.setBounds(380, 10, 200, 30);
		l2.setFont(font);
		k0_field = new JTextField(60);
		k0_field.setBounds(590, 10, 150, 30);
		k0_field.setFont(font);

		l3 = new JLabel("64位明文:");
		l3.setFont(font);
		l3.setBounds(10, 50, 90, 30);
		x_64_label = new JLabel("");
		x_64_label.setFont(font);
		x_64_label.setText("");
		x_64_label.setBounds(100, 50, 800, 30);

		l4 = new JLabel("64位K0:");
		l4.setFont(font);
		l4.setBounds(15, 85, 90, 30);
		k0_64_label = new JLabel("");
		k0_64_label.setFont(font);
		k0_64_label.setText("");
		k0_64_label.setBounds(100, 85, 800, 30);

		start = new JButton();
		start.setText("DES");
		start.setFont(font);
		start.setBounds(750, 10, 80, 30);

		res_area = new JTextArea(35, 80);
		res_area.setLineWrap(true);
		res_area.setFont(area_font);
		res_area.setEditable(false);
		jres = new JScrollPane(res_area);
		jres.setBounds(15, 130, 800, 500);

		f.add(l1);
		f.add(l2);
		f.add(l3);
		f.add(l4);
		f.add(x_field);
		f.add(k0_field);
		f.add(x_64_label);
		f.add(k0_64_label);
		f.add(start);
		f.add(jres);
		f.getContentPane().add(jres);
		f.setBounds(30, 30, 850, 685);
		f.setLayout(null);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	public static void AddListener() {
		start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				boolean test1, test2;
				// 获取两个文本框的数据
				x0 = x_field.getText().toString();
				k0 = k0_field.getText().toString();
				// 检测输入是否符合规范
				test1 = new Hex_to_Binary().x_string_test(x0);
				test2 = new Hex_to_Binary().k0_test(k0);

				if ((test1 == false) || (test2 == false)) {
					JOptionPane.showMessageDialog(null, "输入有误!");
				} else {
					// 将x0的内容由string转化成64位数组,保存在x0_64
					// 将k0的内容由string转化成64位数组,保存在k0_64
					new Hex_to_Binary().hex_to_bianry_64(x0, x0_64);
					new Hex_to_Binary().k_4_to_64(k0, k0_64);
					// 将明文进行第一次置换即x0_64转化成xn_64
					new IP_Change().IP_first(x0_64, xn_64);
					// 制成string用来显示在界面上
					x0_temp = TString(x0_64);
					k0_temp = TString(k0_64);
					xn_temp = TString(xn_64);
					// 显示64位明文和密钥
					x_64_label.setText(x0_temp);
					k0_64_label.setText(k0_temp);
					// DES算法显示开始
					res_area.setText("START:");
					res_area.append("\n" + "初始IP置换:" + xn_temp);
					// 为L和R进行第一次赋值

					for (int i = 0; i < 32; i++) {
						L[i] = xn_64[i];
					}
					for (int i = 32; i < 64; i++) {
						R[i - 32] = xn_64[i];
					}
					Ls = TString(L);
					Rs = TString(R);
					res_area.append("\n" + "L:	" + Ls);
					res_area.append("\n" + "R:	" + Rs); // 准备C和D数组
					// 置换k0,并且准备c和d数组,显示他们
					new IP_Change().IP_k(k0_64, kn_56);
					kn_56_temp = TString(kn_56);
					res_area.append("\n" + "K-PC-1:	" + kn_56_temp);
					for (int i = 0; i < 28; i++) {
						C[i] = kn_56[i];
					}
					for (int i = 28; i < 56; i++) {

						D[i - 28] = kn_56[i];
					}
					Cs = TString(C);
					Ds = TString(D);
					res_area.append("\n" + "C:	" + Cs);
					res_area.append("\n" + "D:	" + Ds);
					// 开始进行16次循环
					for (int i = 1; i <= 16; i++) {
						res_area.append("\n" + "\n" + "*****************第" + i
								+ "次**********************************");
						// 将C和D数组进行LS左移运算
						new LS().LS_CD(i, C, D);
						Cs = TString(C);
						Ds = TString(D);
						res_area.append("\n" + "LS." + i + ".C:	" + Cs);
						res_area.append("\n" + "LS." + i + ".D:	" + Ds);
						// 生成新的子密钥k 48位的
						new IP_Change().IP_newk(C, D, kn_48);
						kn_48_temp = TString(kn_48);
						res_area.append("\n" + "K." + i + ":	" + kn_48_temp);
						// 对R进行扩展,使其从32位扩展到48位
						new IP_Change().ER(R, Re);
						Res = TString(Re);
						res_area.append("\n" + "E." + i + ".R:	" + Res);
						// Re和kn_48进行模2加法运算,产生的结果放置在FRK中
						new ModAdd().Mod2(Re, kn_48, FRK);
						FRKs = TString(FRK);
						res_area.append("\n" + " Mod2(RE." + "K" + "):	" + FRKs);
						// 进行S盒运算
						new S_box().SortFRK(FRK, FRKnew);
						FRKnews = TString(FRKnew);
						res_area.append("\n" + "S盒转化(RE." + "K): " + FRKnews);
						// 将FRKnew再进行P置换函数操作,生成f(Ri-1,Ki)
						new IP_Change().IP_F(FRKnew, Rnew);
						Rnews = TString(Rnew);
						res_area.append("\n" + "P置换函数后:	" + Rnews);
						// 将L和Rnew进行模二相加
						new ModAdd().Mod2_L_F(Rnew, L, LF);
						LFs = TString(LF);
						res_area.append("\n" + " L与R模二加:  " + LFs);
						// 让L等于前一个R
						for (int j = 0; j < 32; j++) {
							L[j] = R[j];
						}
						// 让新的R等于LF
						for (int t = 0; t < 32; t++) {
							R[t] = LF[t];
						}
					}
					// R在左侧L在右侧生成finalx,64位
					for (int u = 0; u < 32; u++) {
						fx[u] = R[u];
					}
					System.out.println("herae");
					for (int k = 32; k < 64; k++) {
						fx[k] = L[k - 32];
					}
					fxs = TString(fx);
					res_area.setForeground(Color.RED);
					res_area.append("\n"
							+ "\n"
							+ "\n"
							+ "*****************最终结果********************************");
					res_area.append("\n" + "RL数据:" + fxs);
					// 进行最终置换
					new IP_Change().FIP(fx, XF);
					XFs = TString(XF);
					res_area.append("\n" + "最终密文为:" + XFs+"\n");
				}
			}
		});
	}
}

以上就是DES算法的实现,其中少了奇偶校验位检测的功能,也少了解密的功能,但是加密功能经测试已经实现,上传给大家参考分享一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现Des加密(不用加载包),有完整S盒子。 部分代码如下: ackage desJava; import java.util.*; public class Des { byte[] bytekey; public Des(String strKey) { this.bytekey = strKey.getBytes(); }// 声明常量字节数组 private static final int[] IP = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; // 64 private static final int[] IP_1 = { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; // 64 private static final int[] PC_1 = { 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 }; // 56 private static final int[] PC_2 = { 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32 }; // 48 private static final int[] E = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 }; // 48 private static final int[] P = { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 }; // 32 private static final int[][][] S_Box = {//S-盒 {// S_Box[1] { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 }, { 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 }, { 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 }, { 15, 12, 8, 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值