📄 aes.java
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class AES extends JFrame
implements ActionListener
{
/**
* @param args
*/
private int[][] S_box =
{
{ 99,124,119,123,242,107,111,197, 48, 1,103, 43,254,215,171,118},
{202,130,201,125,250, 89, 71,240,173,212,162,175,156,164,114,192},
{183,253,147, 38, 54, 63,247,204, 52,165,229,241,113,216, 49, 21},
{ 4,199, 35,195, 24,150, 5,154, 7, 18,128,226,235, 39,178,117},
{ 9,131, 44, 26, 27,110, 90,160, 82, 59,214,179, 41,227, 47,132},
{ 83,209, 0,237, 32,252,177, 91,106,203,190, 57, 74, 76, 88,207},
{208,239,170,251, 67, 77, 51,133, 69,249, 2,127, 80, 60,159,168},
{ 81,163, 64,143,146,157, 56,245,188,182,218, 33, 16,255,243,210},
{205, 12, 19,236, 95,151, 68, 23,196,167,126, 61,100, 93, 25,115},
{ 96,129, 79,220, 34, 42,144,136, 70,238,184, 20,222, 94, 11,219},
{224, 50, 58, 10, 73, 6, 36, 92,194,211,172, 98,145,149,228,121},
{231,200, 55,109,141,213, 78,169,108, 86,244,234,101,122,174, 8},
{186,120, 37, 46, 28,166,180,198,232,221,116, 31, 75,189,139,138},
{112, 62,181,102, 72, 3,246, 14, 97, 53, 87,185,134,193, 29,158},
{225,248,152, 17,105,217,142,148,155, 30,135,233,206, 85, 40,223},
{140,161,137, 13,191,230, 66,104, 65,153, 45, 15,176, 84,187, 22}
};
private int [][] S_box_1 =
{
{82, 9, 106,213, 48, 54,165, 56,191, 64,163,158,129,243,215,251},
{124,227,57, 130,155, 47,255,135,52, 142, 67, 68,196,222,233,203},
{84, 123,148,50, 166,194, 35, 61,238, 76,149, 11, 66,250,195, 78},
{8, 46, 161,102, 40,217, 36,178,118, 91,162, 73,109,139,209, 37},
{114,248,246,100,134,104,152, 22,212,164, 92,204, 93,101,182,146},
{108,112, 72, 80,253,237,185,218, 94, 21, 70, 87,167,141,157,132},
{144,216,171, 0,140,188,211, 10,247,228, 88, 5,184,179,69, 6},
{208, 44, 30,143,202, 63, 15, 2,193,175,189, 3, 1, 19,138,107},
{ 58,145, 17, 65, 79,103,220,234,151,242,207,206,240,180,230,115},
{150,172,116, 34,231,173, 53,133,226,249, 55,232, 28,117,223,110},
{ 71,241, 26,113, 29, 41,197,137,111,183, 98, 14,170, 24,190, 27},
{252, 86, 62, 75,198,210,121, 32,154,219,192,254,120,205, 90,244},
{ 31,221,168, 51,136, 7,199, 49,177, 18, 16, 89, 39,128,236, 95},
{ 96, 81,127,169, 25,181, 74, 13, 45,229,122,159,147,201,156,239},
{160,224, 59, 77,174, 42,245,176,200,235,187, 60,131, 83,153, 97},
{ 23, 43, 4,126,186,119,214, 38,225,105, 20, 99, 85, 33, 12,125}
};
private int[] key =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
private int[] Code =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
private int[] extend_key = new int[176];
private int[] Rcon =
{
0,1,2,4,8,16,32,64,128,27,54
};
public void KeyExpansion(){
int [] temp = new int[4];
for(int i = 0; i < 16; i ++){
extend_key [i] = key[i];
}
for(int i = 4; i < 44; i ++){
for(int j = 0; j < 4; j ++)
temp[j] = extend_key[(i - 1) * 4 + j];
if( i % 4 == 0){
RotWord(temp);
for(int j = 0; j < 4; j ++){
temp[j] = SubWord(temp[j]);
if( j==0 )
temp[j] = temp[j]^Rcon[i/4];
}
}
for(int j = 0; j < 4; j++){
extend_key[(i - 0) * 4 + j] = extend_key[(i - 4) * 4 + j]^temp[j];
StringBuffer buf = new StringBuffer(20);
}
}
}
/*
* Routate shift left the Array
*/
public void RotWord (int temp[]){
int a;
a = temp[0];
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[3];
temp[3] = a;
}
/*
* replace the num recording to the S box
*/
public int SubWord(int a)
{
int x = a / 16;
int y = a % 16;
return S_box[x][y];
}
/*
* replace the num recording to the S box 1
*/
public int SubWord_1(int a)
{
int x = a / 16;
int y = a % 16;
return S_box_1[x][y];
}
/*
* int type transite into Hex
*/
public String encodeHex(int integer) {
StringBuffer buf = new StringBuffer(2);
if (((int) integer & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString((int) integer & 0xff, 16));
return buf.toString();
}
/*
*function of encode
*/
public void Encode()
{
/*
* initiate the code, that is the code ^ the key
*/
/*
////////////////////////////////////////////////////
//System.out.print('\n');
System.out.print("encode=========================\n");
for(int k = 0; k < 16; k ++){
System.out.print((encodeHex(Code[k]))+",");
}
System.out.print('\n');
////////////////////////////////////////////////////
*/
for(int i = 0; i < 16; i ++){
Code[i] = extend_key[i]^Code[i];
}
for(int time = 1; time < 11; time ++)
Loop(time);
}
public void Loop(int time)
{
for(int i = 0; i < 16; i ++)
{
Code[i] = SubWord(Code[i]);
}
ShiftRow();
if(time!=10)
MixColumn();
for(int i = 0; i < 16; i ++)
{
Code[i] = Code[i]^extend_key[time*16+i];
}
/*
////////////////////////////////////////////////////
//System.out.print('\n');
for(int k = 0; k < 16; k ++){
System.out.print((encodeHex(Code[k]))+",");
}
System.out.print('\n');
////////////////////////////////////////////////////
*/
}
public void ShiftRow()
{
int temp;
temp = Code[1];
Code[1] = Code[5];
Code[5] = Code[9];
Code[9] = Code[13];
Code[13] = temp;
temp = Code[2];
Code[2] = Code[10];
Code[10] = temp;
temp = Code[6];
Code[6] = Code[14];
Code[14] = temp;
temp = Code[3];
Code[3] = Code[15];
Code[15] = Code[11];
Code[11] = Code[7];
Code[7] = temp;
}
public void MixColumn()
{
int[] temp = new int[16];
for(int i = 0 ;i < 4 ; i ++)
{
temp[i*4] = Multi(Code[i*4],2) ^ Multi(Code[i*4+1],3) ^
Multi(Code[i*4+2],1) ^ Multi(Code[i*4+3],1);
temp[i*4+1] = Multi(Code[i*4],1) ^ Multi(Code[i*4+1],2) ^
Multi(Code[i*4+2],3) ^ Multi(Code[i*4+3],1);
temp[i*4+2] = Multi(Code[i*4],1) ^ Multi(Code[i*4+1],1) ^
Multi(Code[i*4+2],2) ^ Multi(Code[i*4+3],3);
temp[i*4+3] = Multi(Code[i*4],3) ^ Multi(Code[i*4+1],1) ^
Multi(Code[i*4+2],1) ^ Multi(Code[i*4+3],2);
}
for(int i = 0; i < 16; i ++)
{
Code[i] = temp[i];
}
}
public int Multi(int a,int b)
{
int[] temp = new int[8];
int[] flag = new int[8];
int c = b;
for(int i= 0;i < 8;i++)
{
int c1,c2;
c1 = c / 2;
c2 = c % 2;
if(c2 == 1)flag[i] = 1;
else flag[i] = 0;
c = c1;
if(i==0)temp[i] = a;
else{
temp[i] = temp[i-1]*2;
if(temp[i]>255)temp[i] = (temp[i]%256)^27;
}
}
a = 0;
for(int i = 0; i < 8; i++)
a = a^(temp[i]*flag[i]);
return a;
}
/*
* function of Decode
*/
public void Decode()
{
int i,j;
/*
////////////////////////////////////////////////////
//System.out.print('\n');
System.out.print("decode============================\n");
for(int k = 0; k < 16; k ++){
System.out.print((encodeHex(Code[k]))+",");
}
System.out.print('\n');
////////////////////////////////////////////////////
*/
for(i = 0,j = 160 ; i < 16; i ++,j ++){
Code[i] = extend_key[j]^Code[i];
//System.out.print(encodeHex(Code[i]));
}
for(int time = 1; time < 11; time ++)
Loop_1(time);
}
public void Loop_1(int time)
{
ShiftRow_1();
for(int i = 0; i < 16; i ++)
{
Code[i] = SubWord_1(Code[i]);
}
for(int i = 0; i < 16; i ++)
{
Code[i] = Code[i]^extend_key[160-time*16+i];
}
if(time!=10)
MixColumn_1();
/*
////////////////////////////////////////////////////
//System.out.print('\n');
for(int k = 0; k < 16; k ++){
System.out.print((encodeHex(Code[k]))+",");
}
System.out.print('\n');
////////////////////////////////////////////////////
*/
}
public void ShiftRow_1()
{
int temp;
temp = Code[13];
Code[13] = Code[9];
Code[9] = Code[5];
Code[5] = Code[1];
Code[1] = temp;
temp = Code[2];
Code[2] = Code[10];
Code[10] = temp;
temp = Code[6];
Code[6] = Code[14];
Code[14] = temp;
temp = Code[3];
Code[3] = Code[7];
Code[7] = Code[11];
Code[11] = Code[15];
Code[15] = temp;
}
public void MixColumn_1()
{
int[] temp = new int[16];
for(int i = 0 ;i < 4 ; i ++)
{
temp[i*4] = Multi(Code[i*4],14) ^ Multi(Code[i*4+1],11) ^
Multi(Code[i*4+2],13) ^ Multi(Code[i*4+3],9);
temp[i*4+1] = Multi(Code[i*4],9) ^ Multi(Code[i*4+1],14) ^
Multi(Code[i*4+2],11) ^ Multi(Code[i*4+3],13);
temp[i*4+2] = Multi(Code[i*4],13) ^ Multi(Code[i*4+1],9) ^
Multi(Code[i*4+2],14) ^ Multi(Code[i*4+3],11);
temp[i*4+3] = Multi(Code[i*4],11) ^ Multi(Code[i*4+1],13) ^
Multi(Code[i*4+2],9) ^ Multi(Code[i*4+3],14);
}
for(int i = 0; i < 16; i ++)
{
Code[i] = temp[i];
}
}
private JTextArea original, keytext, to_code, to_original;
private JButton encode,decode;
//private JLabel label;
public void getCode(int code_num[])
{
for(int i = 0; i < 16; i ++)
{
Code[i] = code_num[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -