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

📄 des.java.bak

📁 des差分密码分析实现源代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	 	 for(int j=0;j<28;j++)
	 	 	D[j]=key[PC_1[j+28]-1];
	 	 
	 	 for(int r=0;r<16;r++)
	 	 {
	 	    LS(C,28,shiftbit[r]);
	 	    LS(D,28,shiftbit[r]);
	 	    for(int k=0;k<48;k++)
	 	    {
	 	        int index=PC_2[k]-1;
	 	        if(index<28)
	 	        	subkey[r][k]=C[index];
	 	        else
	 	        	subkey[r][k]=D[index-28];
	 	    }
			
	 	 }
	 	 
		 return(1);
	}
	public void SetKey(int key[])
	{
		GenSubKey(key);
	}
	public static void XorArray(int aray1[],int aray2[],int arayout[],int length)///数组模2加
	{
		for(int k=0;k<length;k++)
		{
			arayout[k]=(aray1[k]+aray2[k])%2;
		}
	}

    public static  int[] sbox(int input[],int si)
	{
		 int out[]=new int[4];
		
		 int row,col;

		 row=input[0]*2+input[5];
	     col=input[1]*8+input[2]*4+input[3]*2+input[4];
	     int sdata=S[si][row][col];
	     for(int k=3;k>=0;k--)
	     {   
	        out[k]=sdata&0x1;
	        sdata>>=1;
	     }
		
		 return(out);
		    
	}
	public void Fun_f(int data_in[],int data_out[],int r)   ///f(r,k)函数
	{
		int data48[]=new int[48];
		int datatemp[]=new int[48];
	    for(int i=0;i<48;i++)            //E膨胀
	    {
	    	data48[i]=data_in[E[i]-1];
	    }
	    XorArray(data48,subkey[r],data48,48);
	    int row,col;
	    //////////////////////////////////////////////////
	    for(int si=0;si<8;si++)
	    {
	         row=data48[si*6]*2+data48[si*6+5];
	         col=data48[si*6+1]*8+data48[si*6+2]*4+data48[si*6+3]*2+data48[si*6+4];
	         int sdata=S[si][row][col];
	         for(int k=3;k>=0;k--)
	         {   
	    	     datatemp[si*4+k]=sdata&0x1;
	    	     sdata>>=1;
	         }
	         for(int j=0;j<32;j++)          //P置换
	         	data_out[j]=datatemp[P[j]-1];
	    }
	    
	    
	}
	public void encrypt_simply3role(int L[],int R[])
	{
		int out[]=new int[32];
    	
    	for(int r=0;r<3;r++)
    	{
    		Fun_f(R,out,r);
    		XorArray(L,out,out,32);
			for(int j=0;j<32;j++)
    			L[j]=R[j];
    		for(int j=0;j<32;j++)
    			R[j]=out[j];
		}
		
	}
    public void encrypt(int plain[])     ///密文放在result[]中
    {
    	int L[]=new int[32];
    	int R[]=new int[32];
    	int out[]=new int[32];
    	
    	for(int i=0;i<32;i++)
    	{
    		L[i]=plain[IP[i]-1];
    	}
    	for(int i=0;i<32;i++)
    	{
    		R[i]=plain[IP[i+32]-1];
    	}
    	System.out.println("encrypt:");
    	for(int r=0;r<16;r++)
    	{
    		Fun_f(R,out,r);
    		XorArray(L,out,out,32);
    		for(int j=0;j<32;j++)
    			L[j]=R[j];
    		for(int j=0;j<32;j++)
    			R[j]=out[j];
    		//////////////////////
    		System.out.println("");
    		System.out.println("L"+r);
    		for(int i=0;i<32;i++)
    		{
    			if(i%8==0) System.out.print(" ");
    			System.out.print(L[i]);
    			///
    		}
    		System.out.print("\n");
    		System.out.println("R"+r);
    		for(int i=0;i<32;i++)
    		{
    			if(i%8==0) System.out.print(" ");
    			System.out.print(""+R[i]);
    			//
    		}
       	}
   
		for(int i=0;i<64;i++)
    	{
			int index=IP_1[i]-1;
			if(index<32)
				result[i]=R[index];
			else
				result[i]=L[index-32];
    		
    	}
    	
    }
    public void decrypt(int descode[])    ///明文放在result[]中
    {
    	int L[]=new int[32];
    	int R[]=new int[32];
    	int out[]=new int[32];
    	
    	for(int i=0;i<32;i++)
    	{
    		L[i]=descode[IP[i]-1]; //先通过IP盒
    	}
    	for(int i=0;i<32;i++)
    	{
    		R[i]=descode[IP[i+32]-1];
    	}
    	System.out.println("decrypt:");
    	for(int r=0;r<16;r++)
    	{
    		Fun_f(R,out,15-r);     ///子密钥使用与加密相反的顺序
    		XorArray(L,out,out,32);
    		for(int j=0;j<32;j++)
    			L[j]=R[j];
    		for(int j=0;j<32;j++)
    			R[j]=out[j];
    		//////////////////////
    		System.out.println("");
    		System.out.println("L"+r);
    		for(int i=0;i<32;i++)
    		{
    			if(i%8==0) System.out.print(" ");
    			System.out.print(L[i]);
    			///
    		}
    		System.out.print("\n");
    		System.out.println("R"+r);
    		for(int i=0;i<32;i++)
    		{
    			if(i%8==0) System.out.print(" ");
    			System.out.print(""+R[i]);
    			//
    		}
       	}
   
		for(int i=0;i<64;i++)
    	{
			int index=IP_1[i]-1;
			if(index<32)
				result[i]=R[index];
			else
				result[i]=L[index-32];
    		
    	}
    	
    }
	public static void main(String[] args) 
	{
		int key[]={0,1,1,1,0,0,0,0,
				   0,0,1,1,1,0,0,0,
				   1,0,0,1,1,0,1,0,
				   1,1,1,0,1,1,0,0,
				   0,1,1,1,0,1,1,0,
				   1,0,0,1,0,0,1,0,
				   1,0,0,0,0,1,0,0,
				   1,1,0,1,1,0,1,0};
		
		int min[]={0,1,1,0,0,0,1,1,
		           0,1,1,0,1,1,1,1,
				   0,1,1,0,1,1,0,1,
				   0,1,1,1,0,0,0,0,
				   0,1,1,1,0,1,0,1,
				   0,1,1,1,0,1,0,0,
				   0,1,1,0,0,1,0,1,
				   0,1,1,1,0,0,1,0};
		/*
		Des d=new Des();
		d.GenSubKey(key);
		d.encrypt(min);
		
		System.out.println("");
		System.out.println("encrypt result");
		for(int i=0;i<64;i++)
		{
			if(i%8==0) System.out.print(" ");
			System.out.print(d.result[i]);
			
		}
		System.out.println("");
		d.decrypt(d.result);
		System.out.println("");
		System.out.println("decrypt result");
		for(int i=0;i<64;i++)
		{
			if(i%8==0) System.out.print(" ");
			System.out.print(d.result[i]);
			
		}
		
		*/
		int mykey[];
		mykey=Str.getbinarray("1A624C89520DEC46");
		int L[],R[];
		//L=Str.getbinarray("748502CD");
		//R=Str.getbinarray("38451097");

String pairs[][] = {{"748502CD","38451097","03C70306","D8A09F10",
			                        "38747564","38451097","78560A09","60E6D4CB"},
		                          {"48691102","6ACDFF31","45FA285B","E5ADC730",
			                        "375BD31F","6ACDFF31","134F7915","AC253457"},
		                          {"357418DA","013FEC86","D8A31B2F","28BBC5CF",
			                        "12549847","013FEC86","0F317AC2","B23CB944"}};
for(int i=0;i<3;i++)
		{
        L=Str.getbinarray(pairs[i][0]);
		R=Str.getbinarray(pairs[i][1]);
        Str.println("KEY:",mykey,64);
		Str.println("L0:",L,32);
		Str.println("R0:",R,32);

		Des d=new Des();
		d.GenSubKey(mykey);
		d.encrypt_simply3role(L,R);
		Str.println("L3:",L,32);
		Str.println("R3:",R,32);

		System.out.println(Str.gethexstringfrombinarray(L,32));
		System.out.println(Str.gethexstringfrombinarray(R,32));
		

		L=Str.getbinarray(pairs[i][4]);
		R=Str.getbinarray(pairs[i][5]);
        Str.println("KEY:",mykey,64);
		Str.println("L0:",L,32);
		Str.println("R0:",R,32);

		//Des d=new Des();
		d.GenSubKey(mykey);
		d.encrypt_simply3role(L,R);
		Str.println("L3:",L,32);
		Str.println("R3:",R,32);

		System.out.println(Str.gethexstringfrombinarray(L,32));
		System.out.println(Str.gethexstringfrombinarray(R,32));

		System.out.println("now subkey");
		String k="1A624C89520DEC46";
		int keykey[]=Str.getbinarray(k);
		d.GenSubKey3(keykey);
		d.ShowSubKey(2);

		

		}
	}
}

⌨️ 快捷键说明

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