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

📄 desla.java

📁 功能:对称算法DES的安全性分析--线性分析 (即8个S_Box的线性分析)
💻 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 + -