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

📄 des.java

📁 我自己在java环境下编写的标准加密算法( DES)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		
				//---------------------------------------------
				//计算Ln和Rn
				for(int i=1;i<=16;i++)
				{
					L[i]=new StringBuffer(32);
					R[i]=new StringBuffer(32);
			
					L[i]=R[i-1];
					R[i]=xorfunction(L[i-1],Ffunction(R[i-1],k[i-1]));
					
					//System.out.println("L"+i+":"+L[i]);
					//System.out.println("R"+i+":"+R[i]);

				}
		
		
		
				//------------------------------------
				//计算密文------------------------
				int anti_displace[]={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};
		
				StringBuffer Ciphertextno=new StringBuffer(64);
				StringBuffer Ciphertextbinary=new StringBuffer(64);
				StringBuffer Ciphertext=new StringBuffer(16);
		
				Ciphertextno.append(R[16]);
				Ciphertextno.append(L[16]);
		
				for(int i=0;i<64;i++)
				{
					Ciphertextbinary.insert(i,Ciphertextno.charAt(anti_displace[i]-1));
				}
		
				//System.out.println(Ciphertextbinary);

				//把二进制序列串转换为十六进制串
				int j=0;
				String substring=null,b=null;
				Integer a;
				int a1;
				for(int i=0;i<16;i++)
				{
					substring=null;
					b=null;
			
					substring=Ciphertextbinary.substring(j,j+4);        //四个四个取二进制串
					a=Integer.valueOf(substring,2);               //把二进制串转换为整型数
					a1=a.intValue();
					b=Integer.toHexString(a1);                    //把整型转换为十六进制的串
			
					Ciphertext.append(b);                         //得到最后的十六进制串
					j=j+4;
			
				}
		
				System.out.print("密文为:");
				System.out.println(Ciphertext);
				//----------以上为加密过程----------------------------------------
				//------------------------------------------------------------------
				return;
				
	}
	
	
	//--------------------------------------------------------
	//----------------------解密------------------------------
	public static void decodefunction()throws IOException
	{
		

 		        BufferedReader keyinCipher=new BufferedReader(new InputStreamReader(System.in));
		        System.out.println("对密文进行解密");
			    System.out.print("请输入密钥:");		
			    String Cipher;
			    Cipher=keyinCipher.readLine();    //读入密钥
			    System.out.println();
			    
			    int Cipherlength=Cipher.length();
			    if(Cipherlength!=16)
			           System.out.println("密钥位数不对");
				
		        BufferedReader keyinplain=new BufferedReader(new InputStreamReader(System.in));
				System.out.print("请输入密文:");
				String plaintext;
				plaintext=keyinplain.readLine();    //读入密文
				System.out.println();
				
		        int plaintextlength=plaintext.length();
				if(plaintextlength!=16)
					   System.out.println("密文位数不对");
				
		        
				//String Cipher=new String("123abc1111111111");
				//System.out.print("密钥为:");
				//System.out.println(Cipher);      //输出密钥
		
				StringBuffer Cipher_code=new StringBuffer(64);
				StringBuffer binarystr=new StringBuffer(4);
				int Cipher_length,w;
		
				Cipher_length=Cipher.length();
				for(int i=0;i<Cipher_length;i++)
					{
				
						String chartostr=null,binarychar=null;
						binarystr=null;
						binarystr=new StringBuffer(4);
				
						chartostr=String.valueOf(Cipher.charAt(i));
						w=Integer.parseInt(chartostr,16);     //把每一个字母转换为int
						binarychar=Integer.toBinaryString(w);
						binarystr.append(binarychar);
			    
						if(binarychar.length()<5)
							 {
								for(int j=0;j<4-binarychar.length();j++)
								   {
									  binarystr.insert(0,0);
								   }
							 }                                //把密钥中的每一位变为四位
															  //的二进制字符串
			    
						Cipher_code.append(binarystr);
			    		
					}
		
				//System.out.println(Cipher_code);              //输出密钥所对应的二进制码
		
		

		        //-----------------------------------------

				//初始置换得到cn,dn
				int displacec0[]={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};
			              
				int displaced0[]={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};
        	              
				int move[]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
        
				StringBuffer c0=new StringBuffer(28);
				StringBuffer d0=new StringBuffer(28);
				for(int i=0;i<28;i++)
				{
					c0.insert(i,Cipher_code.charAt(displacec0[i]-1));
					d0.insert(i,Cipher_code.charAt(displaced0[i]-1));
				}
        
				StringBuffer c[]=new StringBuffer[16];
				StringBuffer d[]=new StringBuffer[16];
		
		        c[0]=new StringBuffer(28);
				d[0]=new StringBuffer(28);
				c[0]=cndn(c0,move[0]);
				d[0]=cndn(d0,move[0]);
				
				for(int i=1;i<16;i++)
				{
					c[i]=new StringBuffer(28);
					d[i]=new StringBuffer(28);
					c[i]=cndn(c[i-1],move[i]);
					d[i]=cndn(d[i-1],move[i]);
					
					//System.out.println("c"+i+":"+c[i]);
					//System.out.println("d"+i+":"+d[i]);
				}
        
				/*
				for(int i=0;i<16;i++)
				{
					System.out.println(c[i]);
					System.out.println(d[i]);
				}
				*/
        
				//---------------------------------
				//置换2:由cn,dn得到kn即k[]
				int conbinition[]={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};
				StringBuffer k[]=new StringBuffer[16];
				
				
				for(int i=0;i<16;i++)
				{
					k[i]=new StringBuffer(48);
					for(int j=0;j<48;j++)
					{
						if(conbinition[j]>28)
							   k[i].insert(j,d[i].charAt((conbinition[j]-1)%28));
						else
							   k[i].insert(j,c[i].charAt(conbinition[j]-1));
					}
					//System.out.println("k"+i+k[i]);
				}
        

				//---------------------------
				//把读入的密文变为64位编码
        
				StringBuffer plaintext_code=new StringBuffer(64);
				StringBuffer binarystr_plaintext=new StringBuffer(4);
				int plaintext_length,w_plaintext;
		
				plaintext_length=plaintext.length();
				for(int i=0;i<plaintext_length;i++)
					{
				
						String chartostr_plaintext=null,binarychar_plaintext=null;
						binarystr_plaintext=null;
						binarystr_plaintext=new StringBuffer(4);
				
						chartostr_plaintext=String.valueOf(plaintext.charAt(i));
						w_plaintext=Integer.parseInt(chartostr_plaintext,16);     //把每一个字母转换为int
						binarychar_plaintext=Integer.toBinaryString(w_plaintext);
						binarystr_plaintext.append(binarychar_plaintext);
			    
						if(binarychar_plaintext.length()<5)
							 {
								for(int j=0;j<4-binarychar_plaintext.length();j++)
								   {
									  binarystr_plaintext.insert(0,0);
								   }
							 }                                //把密文中的每一位变为四位
															  //的二进制字符串
			    
						plaintext_code.append(binarystr_plaintext);
			    		
					} 
				 //System.out.println(plaintext_code);
		 
         



					
			//对密文进行处理
			 	int replaceR16[]={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};
      
				int replaceL16[]={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};
        
				StringBuffer L[]=new StringBuffer[17];
				StringBuffer R[]=new StringBuffer[17];
		
				L[16]=new StringBuffer(32);
				R[16]=new StringBuffer(32);
		
				for(int i=0;i<32;i++)
				{
					L[16].insert(i,plaintext_code.charAt(replaceL16[i]-1));
					R[16].insert(i,plaintext_code.charAt(replaceR16[i]-1));
				}
				
				//---------------------------------------------
				//计算Ln和Rn
				for(int i=15;i>=0;i--)
				{
					L[i]=new StringBuffer(32);
					R[i]=new StringBuffer(32);
			
					R[i]=L[i+1];
					L[i]=xorfunction(R[i+1],Ffunction(L[i+1],k[i]));
					
					//System.out.println("L"+i+":"+L[i]);
					//System.out.println("R"+i+":"+R[i]);
					
				}

                //-----------------------------------
		        //逆初始变换求明文
		        
		        int anti_displace[]={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};
		
				StringBuffer Ciphertextno=new StringBuffer(64);
				StringBuffer Ciphertextbinary=new StringBuffer(64);
				StringBuffer Ciphertext=new StringBuffer(16);
		
				Ciphertextno.append(L[0]);
				Ciphertextno.append(R[0]);
		
				for(int i=0;i<64;i++)
				{
					Ciphertextbinary.insert(i,Ciphertextno.charAt(anti_displace[i]-1));
				}
		
				System.out.println(Ciphertextbinary);

				//把二进制序列串转换为十六进制串
		                int j=0;
						String substring=null,b=null;
						Integer a;
						int a1;
						for(int i=0;i<16;i++)
						{
							substring=null;
							b=null;
			
							substring=Ciphertextbinary.substring(j,j+4);        //四个四个取二进制串
							a=Integer.valueOf(substring,2);               //把二进制串转换为整型数
							a1=a.intValue();
							b=Integer.toHexString(a1);                    //把整型转换为十六进制的串
			
							Ciphertext.append(b);                         //得到最后的十六进制串
							j=j+4;
			
						}
		
				System.out.print("明文为:");
				System.out.println(Ciphertext); 
				
				
	   return;
		          
		         

			 
			  
	}
	
	//-------------------主函数---------------------
	public static void main(String args[])throws IOException
	{
		
		BufferedReader keyin2=new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请选择:");
		System.out.println("\"1\":加密");
		System.out.println("\"2\":解密");
		System.out.println("\"3\":退出");
		
		String choise;
		choise=keyin2.readLine();
		
		while(choise.compareTo("")==0)
		{
		       System.out.println("不能为空,请选择!");
		       choise=keyin2.readLine();
		
		}
		        
		char choisechar;
		
		while(choise.compareTo("3")!=0)
		{
			  
			  choisechar=choise.charAt(0);             //把输入的字符串转换为字符类型
			  
			  switch(choisechar)
			  {
			  	case '1':        encodefunction();
			  	                 //System.out.println("呵呵,成功");
				                 System.out.println("请选择:");
						         System.out.println("\"1\":加密");
						         System.out.println("\"2\":解密");
						         System.out.println("\"3\":退出");
				                 choise=keyin2.readLine();
				                 break;
				                 
				case '2':        decodefunction();
				                 System.out.println("请选择:");
								 System.out.println("\"1\":加密");
								 System.out.println("\"2\":解密");
								 System.out.println("\"3\":退出");
								 choise=keyin2.readLine();
								 break;
				
				default:         System.out.println("错误输入,请重试");
				                 choise=keyin2.readLine();
				                 break;
			  }
		}
		
	} 




}

⌨️ 快捷键说明

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