📄 desla.java
字号:
/*
students: xpudding
task: 经典对称算法DES中8个S_Box的线性分析
condition:Java语言
Email:yangx_204@eyou.com
*/
//This is a class for Linear Analysis of S_Box in DES
//authored by yangxiao
//finished at 1:45 2005/11/5
public class DesLA
{
//in the method an integer will be transformed to a char[] with
//four binaries which is either '0' or '1'.
//we use 'static' in order to be used in main method directly.
//input:a number between 0 and 15
//output:a char[4] any of which is 0 or 1
static char [] stoBinary(int n)
{
char [] mybin={'0','0','0','0'};
int m=0;
if(n<16&&n>=0)
{
for(int i=0;i<4;i++)
{
m=n%2;
if(m==1)mybin[3-i]='1';
else mybin[3-i]='0';
n=(n-m)/2;
}
return mybin;
}
else
{
System.out.println("靠,'S盒'中有0--15之外的数吗?");
return mybin;
}
}
//in the method an integer will be transformed to a char[] with
//six binaries which is either '0' or '1'.
//we also use 'static'
//input:a number between 0 and 63
//output:a char[6] any of which is 0 or 1
static char [] xtoBinary(int n)
{
char [] mybin={'0','0','0','0','0','0'};
int m=0;
if(n<64&&n>=0)
{
for(int i=0;i<6;i++)
{
m=n%2;
if(m==1)mybin[5-i]='1';
else mybin[5-i]='0';
n=(n-m)/2;
}
return mybin;
}
else
{
System.out.println("靠,'S盒'自变量有0--63之外的数吗?");
return mybin;
}
}
public static void main(String args[])
{
//contents of 8 boxes is shown in s_box[][]
int[][] s_box={
{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},
{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},
{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},
{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},
{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},
{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},
{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},
{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}
};
//following variable in whole
int alpha=0;
int beta=0;
int sid=0;
int s_number=5; //s_box of which
int []s=s_box[s_number-1]; //s_box=>s
int number=0; //each number of(alpha,beta)
int number1=0;
int number2=0;
//binary []:al-be-xx-ss means binary alpha-beta-x-s
char []al=new char[6];
char []be=new char[4];
char []xx=new char[6];
char []ss=new char[4];
int [][] result=new int[64][16];
//选择S盒
s=s_box[s_number-1];
try
{
s_number=Integer.parseInt(args[0]);
if(s_number<=8&s_number>=1){s=s_box[s_number-1];System.out.println("\n--------Here is S_Box:S"+s_number+"-------");}
else {System.out.println(" S盒参数输入错误!请输入参数1--8"); return;}
}
catch(Exception e)
{
System.out.println(" S盒参数输入错误!请输入参数1--8");
return;
}
//alpha&beta in loop
for(alpha=1;alpha<64;alpha++)
{
if(alpha<10)System.out.print("\n "+alpha+"--");
else System.out.print("\n"+alpha+"--");
//alpha=>二进制al=001100
al=xtoBinary(alpha);
for(beta=1;beta<16;beta++)
{
// beta=>example be=0011
be=stoBinary(beta);
//以下30多行为核心算法,求出每个alpha beta对应的值
for(int i=0;i<64;i++)
{
xx=xtoBinary(i);
//b0b1b2b3b4b5 is on
//b0b5 is as row number; b1b2b3b4 is as length in a row
//we may take following way to save memory and CPU which is also simple.
//we take s[] as "one" array,not two.as following:
sid=0;
if(xx[0]=='1') sid+=32;
if(xx[5]=='1') sid+=16;
if(xx[1]=='1') sid+=8;
if(xx[2]=='1') sid+=4;
if(xx[3]=='1') sid+=2;
if(xx[4]=='1') sid+=1;
ss=stoBinary(s[sid]);
for(int j=0;j<6;j++)
{
if(al[j]=='1'&&xx[j]=='1')number1++;
if(j<4&&be[j]=='1'&&ss[j]=='1')number2++;//&& is break if front is false
}
number1%=2;
number2%=2;
if(number1==number2) number++;
//equaled to 0
number1=0;
number2=0;
}
result[alpha][beta]=number-32;
if(result[alpha][beta]>=0&result[alpha][beta]<9)System.out.print(" "+result[alpha][beta]);
else if(result[alpha][beta]<-9)System.out.print(" "+result[alpha][beta]);
else if(result[alpha][beta]>9)System.out.print(" "+result[alpha][beta]);
else if(result[alpha][beta]<0&result[alpha][beta]>-9)System.out.print(" "+result[alpha][beta]);
else System.out.print("--"+result[alpha][beta]);
//equaled to 0
number=0;
}
}
System.out.println("\n\n-------------------------------S_Box: S"+s_number+" is up-----^_^");
System.out.println("\nFinished by 杨晓 潘亚君 彭大");
System.out.print("well done!");
System.out.println(" cups!!!");
//A Test:
//test---xtoBinary() stoBinary() --- Are they all right?
//for any x(we may take 41 for example),it may get its binary named xx.---using xtoBianry()
//as the same,we get s[x],and its binary ss.---using stoBianry()
//xx and ss will be shown following.
//test result: 41 9 101001 1001 ---------all are right!
/*
xx=xtoBinary(41);
ss=stoBinary(s[41]);
System.out.println("原来的数");
System.out.println("41\n");
System.out.println("对应的数值");
System.out.println(s[41]);
for(int i=0;i<6;i++)
{
System.out.print(xx[i]+"--");
}
System.out.print("--\n");
for(int i=0;i<4;i++)
{
System.out.print(ss[i]+"--");
}
System.out.print("--OK!");
*/
/*
System.out.print("================\n==============\n=================\n");
for(int p=0;p<64;p++)
{
for(int q=0;q<6;q++){System.out.print(xtoBinary(p)[q]);}
System.out.print("---");
if((p%8)==7)System.out.print("\n");
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -