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

📄 dcades.java

📁 des差分密码分析实现源代码
💻 JAVA
字号:
///////////////////////////////////////////////////////
////  author   liyimin  
///////////////////////////////////////////////////////
package dstest;
import dstest.alg.Des;
import java.util.List;
import dstest.dd.Str;
import java.util.ArrayList;
import dstest.dd.Counter;
class Dcades
{
	Des des;
	Counter ct;
	Dcades()
	{
		des=new Des();
		ct=new Counter();
	}
	
	public boolean compareintarray(int a[],int b[],int len)
	{
		for(int i=0;i<len;i++)
		{
			if(a[i]!=b[i])
				return(false);
		}
		return(true);
	}
	public List getpossibleinputlist(int inputxor[],int outputxor[],int si)   //计算可能的输入
	{
		List list=new ArrayList();
		int input1[];
		int input2[]=new int[6];
		int sout[]=new int[4];
		int sout1[],sout2[];
		for(int i=0;i<64;i++)
		{
			input1=Str.getbinarray(i,6);
			des.XorArray(input1,inputxor,input2,6);
			sout1=des.sbox(input1,si);
            //System.out.print("input2_1:");Str.println(input2,6);
			sout2=des.sbox(input2,si);
			//System.out.print("input2_2:");Str.println(input2,6);
			des.XorArray(sout1,sout2,sout,4);
			//System.out.print("sout1:");Str.println(sout1,4);
			//System.out.print("sout2:");Str.println(sout2,4);
			//System.out.print("sout:");Str.println(sout,4);
			
			//Str.println(sout,4);
			if(compareintarray(sout,outputxor,4))
			{
				//System.out.println("add");
				list.add(input1);
				//list.add(input2);
				//System.out.print("input3:");Str.println(input2,6);
				
			}
			
		}
		return(list);

	}
	public void dealpair(String pair[])  ////处理每一个明文密文对
	{
		int E[]=des.EP(Str.getbinarray(pair[2]));  ///L3
		Str.println(" E:",E,48);
		int EE[]=des.EP(Str.getbinarray(pair[6]));///L3*
		Str.println("E*:",EE,48);
		int CP[];
		int tt1[]=new int[32];
        int tt2[]=new int[32];
		int tt3[]=new int[32];
		des.XorArray(Str.getbinarray(pair[3]),Str.getbinarray(pair[7]),tt1,32);
		des.XorArray(Str.getbinarray(pair[0]),Str.getbinarray(pair[4]),tt2,32);
		
		des.XorArray(tt1,tt2,tt3,32);
		
		CP=des.P_1(tt3);
		Str.println(CP,32);
         
		 int Ei[];
		 int EEi[];
		 int CPi[];
		for(int si=0;si<8;si++)
		{
			
			Ei=Str.getsubarray(E,si*6,si*6+5);
			System.out.print("EI:");Str.println(Ei,6);
			EEi=Str.getsubarray(EE,si*6,si*6+5);
			System.out.print("E*i:");Str.println(EEi,6);
			CPi=Str.getsubarray(CP,si*4,si*4+3);
			System.out.print("CPi:");Str.println(CPi,4);
            testi(Ei,EEi,CPi,si);

		}



	}
	public void testi(int E[],int EE[],int CP[],int si)  //6bit 6bit 4bit  
	{
		List result;
		int temp[]=new int[6];
		List list=new ArrayList();
		int input1[];
		int input2[]=new int[6];
		int sout[]=new int[4];
		int sout1[],sout2[];
		int EP[]=new int[6];
		des.XorArray(E,EE,EP,6);
		for(int i=0;i<64;i++)
		{
			input1=Str.getbinarray(i,6);
			des.XorArray(input1,EP,input2,6);
			sout1=des.sbox(input1,si);
            //System.out.print("input2_1:");Str.println(input2,6);
			sout2=des.sbox(input2,si);
			//System.out.print("input2_2:");Str.println(input2,6);
			des.XorArray(sout1,sout2,sout,4);
			//System.out.print("sout1:");Str.println(sout1,4);
			//System.out.print("sout2:");Str.println(sout2,4);
			//System.out.print("sout:");Str.println(sout,4);
			
			//Str.println(sout,4);
			if(compareintarray(sout,CP,4))
			{
				//System.out.println("add");
				//list.add(input1);
				//list.add(input2);
				//System.out.print("input3:");Str.println(input2,6);
				Des.XorArray(input2,E,temp,6);
			int j=Str.parseintbinary(temp,6);
			//System.out.println(j+"++");
			ct.addone(si,j);
				
			}
		}
	}

    public int []getsubkey()
	{		
		return(ct.search(3));
	}
	public int []getkey()
	{
       return(des.GetKeyFromR3SubKey(getsubkey()));
	}
	public static void main(String[] args) 
	{
	
		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"}};


		System.out.println("--------------------------------------------------------");
		System.out.println("3-r DES Differential cryptanalysis Program");
		System.out.println("                      author liyimin(2004210998)");
		System.out.println("--------------------------------------------------------");
		System.out.println("\n\n");
		System.out.println("Source data:");
		for(int i=0;i<3;i++)
			for(int j=0;j<8;j++)
		     {
			   System.out.print(pairs[i][j]);
			   if((j+1)%4==0)
				   System.out.print("\n");
			   else  if((j+1)%2==0)
				   System.out.print("----->");
			   
			 }
		Dcades dca=new Dcades();
		//dca.dealpair(pairs[0]);
		for(int i=0;i<3;i++)
		  dca.dealpair(pairs[i]);
		dca.ct.display();

		Str.println("SubKey:",dca.getsubkey(),48);
		Str.println("Key:",dca.getkey(),64);

		
	}
}

⌨️ 快捷键说明

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