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

📄 des.java

📁 java 字符加密系统, 可以对64位的任意字符进行加密解密
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

public class DES {
	 //DES的中的S-BOX
	private byte[][] sbox1= 
	{ 
		{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 char[][] sbox2= 
	{ 
	    {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 char[][] sbox3= 
	{ 
	    {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 char [][] sbox4= 
	{ 
	     {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 char[][] sbox5= 
	{ 
	     {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 char [][]sbox6= 
	{ 
	     { 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 char [][]sbox7= 
	{ 
	     { 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 char [][]sbox8= 
	{ 
	     { 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} 
	}; 
	byte[][] Lpart=new byte[4][8];
	byte[][] Rpart=new byte[4][8];
	//声明一个三维数组用来存储加密过程产生的16个密码
	byte[][][] saveK=new byte[16][8][6];
	
	
	public void encrypt(Text text){
    
		byte[] byteArray=new byte[8];
		
        byte[][]C=new byte[4][7];
	    byte[][]D=new byte[4][7];
    	byte[] byteArray2=new byte[8];
		
		
//这里byte[0]保存char[0]的高位字节,byte[1]保存了char[0]的低位字节
	   
          char [] charArray=text.getPlainText();
          for(int i=0;i<8;i++){
        byteArray[i]=Change.charToByte(charArray[i/2])[i%2];	  
          }
				
//将byteArray中的位取出并扩展成字节放在bitArray中		
	byte[][] bitArray={Change.bitToByteArray(byteArray[0]),
			 
			  Change.bitToByteArray(byteArray[1]),
		      Change.bitToByteArray(byteArray[2]),
			  Change.bitToByteArray(byteArray[3]),
			  Change.bitToByteArray(byteArray[4]),
			  Change.bitToByteArray(byteArray[5]),
			  Change.bitToByteArray(byteArray[6]),
			  Change.bitToByteArray(byteArray[7])};
	  //完成初始置换IP
	           bitArray=IP(bitArray);
	  //将bitArray分配给2个数组Lpart和Rpart
	     for(int i=0;i<8;i++)
	    	 for(int j=0;j<8;j++){
	    		 if(i<4)
	         Lpart[i][j]=bitArray[i][j];
	    		 else
	    	 Rpart[i-4][j]=bitArray[i][j];
	       }
	      //**********对文本1中输入的处理结束************	 
	     
//	***************对文本2输入的处理******************

	       //获得从文本2中输入的字符串,并将其存储在字符数组中
	 //和以上同理		    	
	     char [] charArray2=text.getKey();
         for(int i=0;i<8;i++){
       byteArray2[i]=Change.charToByte(charArray2[i/2])[i%2];	  
         }
	    	
		    byte[][] bitArray2={Change.bitToByteArray(byteArray2[0]),
					            Change.bitToByteArray(byteArray2[1]),
				                Change.bitToByteArray(byteArray2[2]),
					            Change.bitToByteArray(byteArray2[3]),
					            Change.bitToByteArray(byteArray2[4]),
					            Change.bitToByteArray(byteArray2[5]),
					            Change.bitToByteArray(byteArray2[6]),
					            Change.bitToByteArray(byteArray2[7])};
		//bitArray2经过PC1
			          bitArray2=PC1(bitArray2);
		// 将bitArray2经过PC1后的数组拆分成2组
			 for(int i=0;i<8;i++)
	            	   for(int j=0;j<7;j++){
	            		   if(i<4)
	            	 C[i][j]=bitArray2[i][j];
	            		   else
	            	 D[i-4][j]=bitArray2[i][j];		   
	                }
//	*****************文本2的处理结束***************** 
	    
			 
   byte[][]temp;
	  for(int i=0;i<16;i++){
//	用临时数组temp保存明文右半部分   
	    temp=(byte[][])Rpart.clone(); 
//	向左移1位的情况 
	     if(i==0||i==1||i==8||i==15){
		     LS(C);  
		     LS(D);
		     }
//	向左移动2位的情况
		else{
	      LS(C);
	      LS(C);
	      LS(D);
	      LS(D);
	    }
	  //明文右半部分Rpart扩展成48位
	     Rpart=expandByte(Rpart);
	  //异或1	     
	    XOR(Rpart,PC2(C,D));
	   //在一个数组中存储K1-K16以便解密使用
	      saveK[i]=(PC2(C,D));
	    //经过SBOX
	    Rpart=SBOX(Rpart);
	    //经过置换   
	    Rpart=Perm(Rpart);
	    //经过异或2
	     XOR2(Lpart,Rpart);
	     //新的左边是原来的右边   
	         Lpart=temp; 
	}//for结束           
//	左右两部分合并然后最终置换,由于最后一次循环之后左边和右边进行了一次交换,所以这里参数的顺序是Rpart在前Lpart在后
	byte[][]  result=IP2(Rpart,Lpart);
//	 转化为字节,然后转化为字符                                                                                                                                  
	   char[] array=new char[4];
	   byte[]b=new byte[2];                  
	     for(int i=0;i<8;i++){
		 b[i%2]=Change.byteToBitArray(result[i]);
	     array[(int)(i/2)]= Change.byteToChar(b);
	     }
	   text.setCipherText(new String(array));	      
	     
	}

	public void decrypt(Text text){
//		********************解密过程*****************
		
		   	   byte[][] temp2;
		   	   for(int i=15;i>-1;i--){
		   	  temp2=(byte[][])Lpart.clone();
		          //扩展Lpart
		   	   Lpart=expandByte(Lpart);
		          //经过异或1    
		   		XOR(Lpart,saveK[i]);
		   	   //经过SBOX
		   	    Lpart=SBOX(Lpart);
		   	   //经过置换Perm
		   	    Lpart=Perm(Lpart);
		   	    //经过异或2和交换 
		   	    XOR2(Rpart,Lpart);
		   	     Rpart=temp2;
		}//for结束	
		     //左右两部分合并然后最终置换
		     byte[][] result3=IP2(Lpart,Rpart);
		     
		     char[] array=new char[4];
		     byte[]b=new byte[2];                  
		      for(int i=0;i<8;i++){
		        b[i%2]=Change.byteToBitArray(result3[i]);
		        array[(int)(i/2)]= Change.byteToChar(b);
		     }
		       	      
			      
}//解密结束	
//		***************plaintext处理部分***************
//初始置换IP
			public byte[][] IP(byte[][] b){
				byte[][]temp=new byte[8][8];
				 for(int i=0;i<8;i++)
				    for(int j=0;j<8;j++){
				   if(i<4)
			        temp[i][j]=b[7-j][i*2+1];
				   else  
				     temp[i][j]=b[7-j][(i-4)*2];
		} //for结束
				     return temp;
		}//ip结束
			
			
//扩展ExpandByte
			public byte[][] expandByte(byte[][] temp){
			    byte[][] bbb=new byte[8][6];
				//扩展数组exRpt的第0列
				bbb[0][0]=temp[3][7];
				bbb[1][0]=temp[0][3];
				bbb[2][0]=temp[0][7];
				bbb[3][0]=temp[1][3];
				bbb[4][0]=temp[1][7];
				bbb[5][0]=temp[2][3];
				bbb[6][0]=temp[2][7];
				bbb[7][0]=temp[3][3];
		       //扩展数组b的第1~4列
				for(int i=0;i<8;i++)
					for(int j=1;j<5;j++){
					if(i==0)	
						bbb[i][j]=temp[i][j-1];
				else if(i==1)
					bbb[i][j]=temp[i-1][j+3];
				else if(i==2)
					bbb[i][j]=temp[i-1][j-1];
				else if(i==3)
					bbb[i][j]=temp[i-2][j+3];
				else if(i==4)
					bbb[i][j]=temp[i-2][j-1];
				else if(i==5)
					bbb[i][j]=temp[i-3][j+3];
				else if(i==6)
					bbb[i][j]=temp[i-3][j-1];
				else if(i==7)
					bbb[i][j]=temp[i-4][j+3];
		    }
					//扩展数组b的第5列
					bbb[0][5]=temp[0][4];
					bbb[1][5]=temp[1][0];
					bbb[2][5]=temp[1][4];
					bbb[3][5]=temp[2][0];
					bbb[4][5]=temp[2][4];
					bbb[5][5]=temp[3][0];
					bbb[6][5]=temp[3][4];
					bbb[7][5]=temp[0][0];
			       return bbb;	
		}//扩展结束
		  //Rpart和K的异或
			public void XOR(byte[][]c,byte[][]d){
				for(int i=0;i<8;i++)
					for(int j=0;j<6;j++)
		             c[i][j]^=d[i][j];
		}
//		SBOX
			public byte[][] SBOX(byte[][]temp){
				  byte[][]xxx=new byte[4][8];
				  int m;
				  int n;
				  byte[][] yyy=new byte[4][2];
				            for (int i=0;i<8;i++){
				                m=temp[i][0]*2+temp[i][5];
				                n=temp[i][1]*8+temp[i][2]*4+temp[i][3]*2+temp[i][4];
				           if(i==0) 
				         yyy[0][0]=(byte)sbox1[m][n];
				           else if(i==1)
				         yyy[0][1]=(byte)sbox2[m][n];
				           else if(i==2)  
				         yyy[1][0]=(byte)sbox3[m][n];
				           else if(i==3)
				         yyy[1][1]=(byte)sbox4[m][n];
				           else if(i==4)
				         yyy[2][0]=(byte)sbox5[m][n];
				           else if(i==5)
				         yyy[2][1]=(byte)sbox6[m][n];

⌨️ 快捷键说明

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