⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.java

📁 DES算法JAVA实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:


import java.awt.*;
import java.awt.event.*;
public class des extends Frame implements WindowListener,ActionListener {

		/**
	 * 
	 */
	private static final long serialVersionUID = 4066593361177192092L;
		/**
		 * @param args
		 */
		public Frame f;
		public Label inform1,inform2,inform3,inform4;
		public TextField iv,m,key,s; 
		public TextArea cbcjat,cbcjet,ebcjat,ebcjet;
		public Button cbcjab,cbcjeb,ebcjab,ebcjeb;
		
		public static short [] bittest={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,-32768};

		public static 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},

			 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},

		 Extend={	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},

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


		public static int [][][] S={
			{
				{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}
			},	//S1
			{
				{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}
			},	//S2
			{
				{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}
			},	//S3
			{
				{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}
			},	//S4
			{
				{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}
			},	//S5
			{
				{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}
			},	//S6
			{
				{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}
			},	//S7
			{
				{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}
			}	//S8
		};

		public static 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},

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

		public static int [] Keymove={1,2,4,6,	8,10,12,14,	15,17,19,21,	23,25,27,28};
		

		
		public des()
		{
			f=new Frame("DES密码");
			f.addWindowListener(this);
			f.setLayout(new GridLayout(0,2));
			f.setBounds(400, 400, 600, 400);
			iv=new TextField();
			m=new TextField();
			key=new TextField();
			cbcjat=new TextArea();
			cbcjet=new TextArea();
			ebcjat=new TextArea();
			ebcjet=new TextArea();
			s=new TextField();
			ebcjab=new Button("EBC加密");
			ebcjeb=new Button("EBC解密");
			cbcjab=new Button("CBC加密");
			cbcjeb=new Button("CBC解密");
			inform1=new Label("请输入明文");
			inform2=new Label("请输入密钥");
			inform3=new Label("请输入密文");
			inform4=new Label("请输入IV向量");
			
			cbcjab.addActionListener(this);
			cbcjeb.addActionListener(this);
			ebcjab.addActionListener(this);
			ebcjeb.addActionListener(this);
			
			f.add(inform1);
			f.add(m);
			f.add(inform2);
			f.add(key);
			f.add(inform3);
			f.add(s);
			f.add(inform4);
			f.add(iv);
			
			f.add(cbcjab);
			f.add(cbcjat);			
			f.add(cbcjeb);
			f.add(cbcjet);			
			f.add(ebcjab);
			f.add(ebcjat);
			f.add(ebcjeb);
			f.add(ebcjet);
			f.setVisible(true);
		}	
		public static void main(String[] args) {
			des test=new des();

		}

		
		public void windowActivated(WindowEvent e) {}

		public void windowClosed(WindowEvent e) {}

		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}

		public void windowDeactivated(WindowEvent e) {}

		public void windowDeiconified(WindowEvent e) {}

		public void windowIconified(WindowEvent e) {}

		public void windowOpened(WindowEvent e) {}
		

		public static short [] keyword,ivword,screat;
		public static String mingword;
		public void actionPerformed(ActionEvent e) {
			String k,ivw,set;
			int i=0;
			mingword=m.getText();
			k=key.getText();
			ivw=iv.getText();
			set=s.getText();
			

			 
			 //Char转换为short
			 if(set.length()%4==0)
			 {
			 screat=new short [set.length()];
			 for(i=0;i<set.length();i++) screat[i]=(short)set.charAt(i);
			 }
			 else 
			 {
				 screat=new short [4];
				 cbcjet.setText("密文输入出错");
				 ebcjet.setText("密文输入出错");
			 }
				 
			 keyword=new short [4];
			 if(k.length()>4)
			 {
				 for(i=0;i<4;i++) keyword[i]=(short)k.charAt(i);
			 }
			 else 
			 {
				 for(i=0;i<k.length();i++) keyword[i]=(short)k.charAt(i);
			 }

			 ivword=new short [4];
			 if(ivw.length()>4)
			 {
				 for(i=0;i<4;i++) ivword[i]=(short)ivw.charAt(i);
			 }
			 else
			 {
				 for(i=0;i<ivw.length();i++) ivword[i]=(short)ivw.charAt(i);
			 }
			 
			 key();//初始化KEY
			 
			 Object source=e.getSource();
			/* switch(source)
			 {
			 case cbcjab:cbcja();break;
			 case cbcjeb:cbcje();break;
			 case ebcjab:ecbcja();break;
			 case ebcjeb:ebcje();break;
			 }*/
			 if(source==cbcjab) cbcja();
			 else if(source==cbcjeb) cbcje();
			 else if(source==ebcjab) ebcja();
			 else if(source==ebcjeb) ebcje();
			 
			 
		}

		private void cbcje() {
			short [] temp_s=new short [4];
			 int i;                           
			  String screat_string="";
			  short [] iv=ivword;//用于保存上一次l输入的64位密文,初始为IV向量
			  short []af_16=new short[4];
			  
			for(i=0;i< screat.length;)
			{
				temp_s[0]=screat[i];//选取64bit
				temp_s[1]=screat[i+1];
				temp_s[2]=screat[i+2];
				temp_s[3]=screat[i+3];
				
				int x;
				ming(temp_s);//每64bit初始化一次
				for(x=15;x>=0;x--)
				{
					ming_make(x);
					
				}
				af_16=after_16();
				
				for(x=0;x<4;x++)
				{
					af_16[x]=(short)(iv[x]^af_16[x]);
				
				}
				iv[0]=screat[i];//保存前一轮输入的64bit
				iv[1]=screat[i+1];
				iv[2]=screat[i+2];
				iv[3]=screat[i+3];
				i=i+4;
				screat_string=screat_string+(char)af_16[0]+(char)af_16[1]+(char)af_16[2]+(char)af_16[3];
			}
			cbcjet.setText(screat_string);
			System.out.println(screat_string);
			
		}
		
		
		private void cbcja() {
			short [] temp_ming=new short [4];//每次输入64BIT的明文
			String ming_string="";//最后作为输出的密文字符
			short [] ming_short;//保存明文的数组
			int leng;//SHORT数组长度
			int t=0;
			short [] af_16=ivword;//用于保存上一次64位加密后密文,初始为IV向量
			
			
			int i=mingword.length()/4;
			if((mingword.length()%4)!=0)
			{
				leng=i*4+4;
			ming_short=new short[leng];
			for(t=0;t<mingword.length();t++)
				ming_short[t]=(short)mingword.charAt(t);
			}
			else 
				{
				leng=i*4;
				ming_short=new short [leng];
				for(t=0;t<mingword.length();t++)
					ming_short[t]=(short)mingword.charAt(t);
				}
			                            
			   
			                              
			for(i=0;i<leng;)
			{
				temp_ming[0]=ming_short[i];//选取64bit
				temp_ming[1]=ming_short[i+1];
				temp_ming[2]=ming_short[i+2];
				temp_ming[3]=ming_short[i+3];
				i=i+4;
				int x;
				for(x=0;x<4;x++)
				{
					temp_ming[x]=(short)(temp_ming[x]^af_16[x]);
				
				}
				ming(temp_ming);//每64bit初始化一次

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -