📄 dcades.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 + -