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

📄 rijndaeltest.java

📁 这个RIJNDAEL的算法是用来产生密文序列JAVA算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		int len=0,k=0;
			for(int i=0;i<ch.length;i++)
			{
				//System.out.println((int)ch[i]);
				if(ch[i]==' ')
				len++;
			}
			int[] input=new int[len+1];
			
			for(int i=0;i<ch.length;i++)
			{
				int a=0,b=0;
				if((int)ch[i]>=97&&(int)ch[i]<=102)
				ch[i]=(char)((int)ch[i]-87);
				if((int)ch[i]>=48&&(int)ch[i]<=57)
				ch[i]=(char)((int)ch[i]-48);
				if(ch[i]==' ')
				{
					if(1==i)
						input[k]=ch[0];
					else
					{
					b=(int)ch[i-1];
					a=(int)ch[i-2];
					if(32!=a)
					input[k]=16*a+b;
					if(32==a)
					input[k]=b;
					}
					k++;
				}
			}
			if(ch[ch.length-1]!=' ')
			{
			if(ch[ch.length-2]!=' ')
			input[k]=16*ch[ch.length-2]+ch[ch.length-1];
			if(ch[ch.length-2]==' ')
			input[k]=(int)ch[ch.length-2];
		  }
		  return input;
	}
	
	int[] encipher(int[] input,int[][] w)
	{
		int Nr=0;
		switch(w.length)
		{
		case 44:
			Nr=10;
			break;
		case 52:
			Nr=12;
			break;
		case 60:
			Nr=14;
			break;
			default:
				break;
		}
		int[][] state=new int[4][4];
		for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=input[4*j+i];
	         }
		//print(state);
		for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=w[j][i];
	         }
		//print(state);
		 for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=input[4*j+i]^w[j][i]; 
	         }
         //print(state);
         for(int k=1;k<Nr;k++)
         {
        	 state=impl.subbytes(state);
            // print(state);
        	 state=impl.shiftrows(state);
        	//print(state);
        	 state=impl.mixcolumns(state );
        	//print(state);
        	 for(int i=0;i<4;i++)
		         for(int j=0;j<4;j++)
		         {
		        	 state[i][j]= state[i][j]^w[k*4+j][i];
		         }
        	//print(state);
         }
         
        state=impl.shiftrows(impl.subbytes(state));
         for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=state[i][j]^w[j+4*Nr][i]; 
	         }
        // print(state);
         int[] out=new int[16];
         for(int i=0;i<16;i++)
        	 out[i]=state[i%4][i/4];
         return out;
	
	}
	
	int invsubword(int num)
	{
		int[][] invbox=new int[16][16];
		int a=0xf0,b=0x0f;
		for(int i=0;i<16;i++)
			for(int j=0;j<16;j++)
			{
				
				invbox[(impl.sbox[i][j]&a)>>4][impl.sbox[i][j]&b]=(i<<4)+j;
				
			}
		return invbox[(num&a)>>4][num&b];
	}
	int[][] invsubbytes(int[][] temp)
	{
		int[][] num=new int[4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				num[i][j]=invsubword(temp[i][j]);
		return num;	
	}
	int[][] invshiftrows(int[][] temp)
	{
		int a,b,c;
		a=temp[1][3];
		temp[1][3]=temp[1][2];
		temp[1][2]=temp[1][1];
		temp[1][1]=temp[1][0];
		temp[1][0]=a;
		
		b=temp[2][2];
		temp[2][2]=temp[2][0];
		temp[2][0]=b;
		b=temp[2][1];
		temp[2][1]=temp[2][3];
		temp[2][3]=b;
		
		c=temp[3][3];
		temp[3][3]=temp[3][0];
		temp[3][0]=temp[3][1];
		temp[3][1]=temp[3][2];
		temp[3][2]=c;
		
		return  temp;
	}
	int xtimes(int a,int n)
	{
		for(int i=0;i<n;i++)
			a=impl.xtime(a);
		return a;
	}
	int[][] invmixcolumns(int[][] temp)
	{
		int[][] num=new int[4][4];
		for(int i=0;i<4;i++)
		{
		  num[0][i]=(xtimes(temp[0][i],3)^xtimes(temp[0][i],2)^xtimes(temp[0][i],1))^
		            (xtimes(temp[1][i],3)^xtimes(temp[1][i],1)^xtimes(temp[1][i],0))^
		            (xtimes(temp[2][i],3)^xtimes(temp[2][i],2)^xtimes(temp[2][i],0))^
		            (xtimes(temp[3][i],3)^xtimes(temp[3][i],0));
		  num[1][i]=(xtimes(temp[1][i],3)^xtimes(temp[1][i],2)^xtimes(temp[1][i],1))^
                    (xtimes(temp[2][i],3)^xtimes(temp[2][i],1)^xtimes(temp[2][i],0))^
                    (xtimes(temp[3][i],3)^xtimes(temp[3][i],2)^xtimes(temp[3][i],0))^
                    (xtimes(temp[0][i],3)^xtimes(temp[0][i],0));
		  num[2][i]=(xtimes(temp[2][i],3)^xtimes(temp[2][i],2)^xtimes(temp[2][i],1))^
                    (xtimes(temp[3][i],3)^xtimes(temp[3][i],1)^xtimes(temp[3][i],0))^
                    (xtimes(temp[0][i],3)^xtimes(temp[0][i],2)^xtimes(temp[0][i],0))^
                    (xtimes(temp[1][i],3)^xtimes(temp[1][i],0));
		  num[3][i]=(xtimes(temp[3][i],3)^xtimes(temp[3][i],2)^xtimes(temp[3][i],1))^
                    (xtimes(temp[0][i],3)^xtimes(temp[0][i],1)^xtimes(temp[0][i],0))^
                    (xtimes(temp[1][i],3)^xtimes(temp[1][i],2)^xtimes(temp[1][i],0))^
                    (xtimes(temp[2][i],3)^xtimes(temp[2][i],0));
		}
		return num;
	}
	double power(int x,int y)
	{
		double num=1.0;
		for(int i=0;i<y;i++)
			num=num*x;
		return num;
	}
	int[] decipher(int[] input,int[][] w)
	{
		int Nr=0;
		switch(w.length)
		{
		case 44:
			Nr=10;
			break;
		case 52:
			Nr=12;
			break;
		case 60:
			Nr=14;
			break;
		default:
			break;
		}
		
		int[][] state=new int[4][4];
		for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=input[4*j+i];
	         }
		//print(state);
		for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=w[j+4*Nr][i];
	         }
		//print(state);
		 for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=input[4*j+i]^w[4*Nr+j][i]; 
	         }
         //print(state);
        for(int k=Nr-1;k>0;k--)
         {
        	 state=invshiftrows(state);
             //print(state);
        	 state=invsubbytes(state);
        	//print(state);
        	 
        	//print(state);
        	 for(int i=0;i<4;i++)
		         for(int j=0;j<4;j++)
		         {
		        	 state[i][j]= state[i][j]^w[k*4+j][i];
		         }
        	//print(state);
        	 state=invmixcolumns(state);
         }
         
        state=invsubbytes(invshiftrows(state));
         for(int i=0;i<4;i++)
	         for(int j=0;j<4;j++)
	         {
	        	 state[i][j]=state[i][j]^w[j][i]; 
	         }
         //print(state);
         int[] out=new int[16];
         for(int i=0;i<16;i++)
        	 out[i]=state[i%4][i/4];
         return out;
	
	}
}
class impl
{
	static int[][] sbox=
  	 {{0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76},
  	  {0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0},
  	  {0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15},
  	  {0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75},
  	  {0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84},
  	  {0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf},
  	  {0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8},
  	  {0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2},
  	  {0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73},
  	  {0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb},
  	  {0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79},
  	  {0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08},
  	  {0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a},
  	  {0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e},
  	  {0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf},
  	  {0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16}
  	 };
	
	static int SubWord(int num)
    {
   	 int a=0xf0,b=0x0f;	 
   	 return sbox[(num&a)>>4][num&b];
    }
	
	static int[][] subbytes(int[][] temp)
	{
		int[][] num=new int[4][4];
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				num[i][j]=SubWord(temp[i][j]);
		return num;		
	}
	
	static int[][] shiftrows(int[][] temp)
	{
		//int[][] temp=new int[4][4];
		int a,b,c;
		a=temp[1][0];
		temp[1][0]=temp[1][1];
		temp[1][1]=temp[1][2];
		temp[1][2]=temp[1][3];
		temp[1][3]=a;
		b=temp[2][0];
		temp[2][0]=temp[2][2];
		temp[2][2]=b;
		b=temp[2][1];
		temp[2][1]=temp[2][3];
		temp[2][3]=b;
		
		c=temp[3][0];
		temp[3][0]=temp[3][3];
		temp[3][3]=temp[3][2];
		temp[3][2]=temp[3][1];
		temp[3][1]=c;
		
		return  temp;
	}
	static int[] rotword(int[] array)
	 {
		 int temp;
		 temp=array[0];
		 array[0]=array[1];
		 array[1]=array[2];
		 array[2]=array[3];
		 array[3]=temp;
		 return array;
	 }
	static int[][] mixcolumns(int[][] temp)
	{
		int[][] num=new int[4][4];
		for(int i=0;i<4;i++)
		{
		  num[0][i]=xtime(temp[0][i])^(temp[1][i]^xtime(temp[1][i])^temp[2][i]^temp[3][i]);
		  num[1][i]=xtime(temp[1][i])^(temp[2][i]^xtime(temp[2][i])^temp[0][i]^temp[3][i]);
		  num[2][i]=xtime(temp[2][i])^(temp[3][i]^xtime(temp[3][i])^temp[0][i]^temp[1][i]);
		  num[3][i]=xtime(temp[3][i])^(temp[0][i]^xtime(temp[0][i])^temp[2][i]^temp[1][i]);
		}
		return num;
	}
	static int xtime(int num)
	{
		if(num<128)
			return num*2;
		else
			return (num*2-256)^27;
	}
	
}
class keyexp
{
     static int[][] rcon={{0x01,0x00,0x00,0x00},
                   {0x02,0x00,0x00,0x00},
                   {0x04,0x00,0x00,0x00},
                   {0x08,0x00,0x00,0x00},
                   {0x10,0x00,0x00,0x00},
                   {0x20,0x00,0x00,0x00},
                   {0x40,0x00,0x00,0x00},
                   {0x80,0x00,0x00,0x00},
                   {0x1b,0x00,0x00,0x00},
                   {0x36,0x00,0x00,0x00}};
   static int[][] keysched(int[] key,int Nk)  
     {
	   int Nr=0;
	   switch(Nk)
	   {
	   case 4:Nr=10;
	   break;
	   case 6:Nr=12;
	   break;
	   case 8:Nr=14;
	   break;
	   default:
		   break;
	   }
	   int[][] w=new  int[4*(Nr+1)][4];
	   for(int i=0;i<Nk;i++)
        for(int j=0;j<4;j++)
 	   w[i][j]=key[4*i+j];

       for(int i=Nk;i<4*(Nr+1);i++)
    	{
    	     int[] temp=new int[4];
    	     for(int k=0;k<4;k++)
    	     {
    	       temp[k]=w[i-1][k];
    	     }
    	       if(0==i%Nk)
    			 {
    			    temp=impl.rotword(temp);
    			    for(int k=0;k<4;k++)
    			    {
    			    	temp[k]=impl.SubWord(temp[k]);
    			    	temp[k]=temp[k]^rcon[i/Nk-1][k];
    			    }   
    			 }
    	       else if(Nk>6&&4==i%Nk)
    	    	   for(int k=0;k<4;k++)
   			    {
   			    	temp[k]=impl.SubWord(temp[k]);
   			    }
    		 for(int k=0;k<4;k++)
    		 {
    			 w[i][k]=w[i-Nk][k]^temp[k];	
    		 }
    			
    	 }
     return w;
     }
}

⌨️ 快捷键说明

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