📄 rijndaeltest.java
字号:
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 + -