📄 aes.java
字号:
import java.io.*;
public class AES {
//static char[][] Result ;
static char[][] lun = new char[10][];
static int Long; //用于记录明文的长度
static char[][]w = new char[44][8]; //extended keys
static int jiemi = 0; //默认为加密状态
static String ff = "";
static String [][] s ={{"63","7C","77","7B","F2","6B","6F","C5","30","01","67","2B","FE","D7","AB","76"},
{"CA","82","C9","7D","FA","59","47","F0","AD","D4","A2","AF","9C","A4","72","C0"},
{"B7","FD","93","26","36","3F","F7","CC","34","A5","E5","F1","71","D8","31","15"},
{"04","C7","23","C3","18","96","05","9A","07","12","80","E2","EB","27","B2","75"},
{"09","83","2C","1A","1B","6E","5A","A0","52","3B","D6","B3","29","E3","2F","84"},
{"53","D1","00","ED","20","FC","B1","5B","6A","CB","BE","39","4A","4C","58","CF"},
{"D0","EF","AA","FB","43","4D","33","85","45","F9","02","7F","50","3C","9F","A8"},
{"51","A3","40","8F","92","9D","38","F5","BC","B6","DA","21","10","FF","F3","D2"},
{"CD","0C","13","EC","5F","97","44","17","C4","A7","7E","3D","64","5D","19","73"},
{"60","81","4F","DC","22","2A","90","88","46","EE","B8","14","DE","5E","0B","DB"},
{"E0","32","3A","0A","49","06","24","5C","C2","D3","AC","62","91","95","E4","79"},
{"E7","C8","37","6D","8D","D5","4E","A9","6C","56","F4","EA","65","7A","AE","08"},
{"BA","78","25","2E","1C","A6","B4","C6","E8","DD","74","1F","4B","BD","8B","8A"},
{"70","3E","B5","66","48","03","F6","0E","61","35","57","B9","86","C1","1D","9E"},
{"E1","F8","98","11","69","D9","8E","94","9B","1E","87","E9","CE","55","28","DF"},
{"8C","A1","89","0D","BF","E6","42","68","41","99","2D","0F","B0","54","BB","16"}
};
static String [][] nis = {{"52","09","6A","D5","30","36","A5","38","BF","40","A3","9E","81","F3","D7","FB"},
{"7C","E3","39","82","9B","2F","FF","87","34","8E","43","44","C4","DE","E9","CB"},
{"54","7B","94","32","A6","C2","23","3D","EE","4C","95","0B","42","FA","C3","4E"},
{"08","2E","A1","66","28","D9","24","B2","76","5B","A2","49","6D","8B","D1","25"},
{"72","F8","F6","64","86","68","98","16","D4","A4","5C","CC","5D","65","B6","92"},
{"6C","70","48","50","FD","ED","B9","DA","5E","15","46","57","A7","8D","9D","84"},
{"90","D8","AB","00","8C","BC","D3","0A","F7","E4","58","05","B8","B3","45","06"},
{"D0","2C","1E","8F","CA","3F","0F","02","C1","AF","BD","03","01","13","8A","6B"},
{"3A","91","11","41","4F","67","DC","EA","97","F2","CF","CE","F0","B4","E6","73"},
{"96","AC","74","22","E7","AD","35","85","E2","F9","37","E8","1C","75","DF","6E"},
{"47","F1","1A","71","1D","29","C5","89","6F","B7","62","0E","AA","18","BE","1B"},
{"FC","56","3E","4B","C6","D2","79","20","9A","DB","C0","FE","78","CD","5A","F4"},
{"1F","DD","A8","33","88","07","C7","31","B1","12","10","59","27","80","EC","5F"},
{"60","51","7F","A9","19","B5","4A","0D","2D","E5","7A","9F","93","C9","9C","EF"},
{"A0","E0","3B","4D","AE","2A","F5","B0","C8","EB","BB","3C","83","53","99","61"},
{"17","2B","04","7E","BA","77","D6","26","E1","69","14","63","55","21","0C","7D"}
};
static char[][] Rcon = {{'0','1','0','0','0','0','0','0'},
{'0','2','0','0','0','0','0','0'},
{'0','4','0','0','0','0','0','0'},
{'0','8','0','0','0','0','0','0'},
{'1','0','0','0','0','0','0','0'},
{'2','0','0','0','0','0','0','0'},
{'4','0','0','0','0','0','0','0'},
{'8','0','0','0','0','0','0','0'},
{'1','B','0','0','0','0','0','0'},
{'3','6','0','0','0','0','0','0'}
};
static char[][] State ;
static int time = 0; //记录这是第几轮
static void run(String cfile,String kfile)
{
extendkeys(kfile);
try{
encrypt(cfile);
}catch(IOException e){
System.exit(1);
}
}
static void jiemi(String jfile,String kfile)
{
time = 0;
jiemi=1;
try{
extendkeys(kfile);
readcode(jfile);
xorkey();
for(time = 1;time<10;time++)
{
linechange();
subcode();
xorkey();
rowchange();
writeResults();
}
linechange();
subcode();
xorkey();
/*if(time==10){
for(int i=0;i<State.length;i++)
{
for(int jj=0;jj<State[i].length;jj++)
System.out.print(State[i][jj]);
}
System.out.println();
}*/
writeResults();
}catch(IOException e){
System.exit(1);
}
}
//--------------------------------------- extend keys section -------------------------------------------
static void extendkeys(String kfile)
{
String skey = new String();
String byt;
char tempkey[] = new char[32];
int i = 0;
//read key(128bits)
FileInputStream fStream = null;
try{
fStream = new FileInputStream(kfile);
}catch(FileNotFoundException fnfe){
System.exit(1);
}
try{
while(fStream.available()>0)
{
byt = (Integer.toHexString(fStream.read())).toUpperCase();
if(byt.length()==1)
byt = "0"+byt;
skey+=byt;
}
}catch(IOException ioe){}finally{
try{
if(fStream!=null)
fStream.close();
}catch(IOException ioe){};
}
tempkey = skey.toCharArray();
//extends key
for(i=0;i<4;i++) //w0,w1,w2,w3
{
for(int j=0;j<8;j++)
w[i][j]=tempkey[i*8+j];
}
char temp[] = new char[8];
for(i=4;i<44;i++) //w4...w43
{
temp = w[i-1].clone();
if(i%4==0)
{
temp = g(temp,i/4);
}
w[i] = xor(w[i-4].clone(),temp);
}
if(jiemi==1)
{
int j=40;
char[][]ww = w.clone();
for(i=0;i<44;i+=4)
{
for(int k=0;k<4;k++,j++)
w[i+k] = ww[j];
j = j-8;
}
}
}
static char[] xor(char[]cchar,char[] dchar)//两个字符数组(十六进制数)的异或
{
int [] ch = new int[cchar.length];
int [] dh = new int[dchar.length]; //十进制数组
int [] chInt = new int[ch.length*4]; //二进制数组
int [] dhInt = new int[dh.length*4];
int i;
for( i=0;i<cchar.length;i++)
{
if(cchar[i]>='0'&&cchar[i]<='9')
ch[i]=cchar[i]-'0';
else if(cchar[i]>='A'&&cchar[i]<='F')
ch[i]=cchar[i]-'A'+10;
if(dchar[i]>='0'&&dchar[i]<='9')
dh[i]=dchar[i]-'0';
else if(dchar[i]>='A'&&dchar[i]<='F')
dh[i]=dchar[i]-'A'+10;
}
int indexlast = 3; //3是第一组四位二进制最后一位的下标
int index;
for( i=0;i<ch.length;i++){
index=indexlast; //index是ch[],dh[]的下标
for(int j=0;j<4;j++){
chInt[index]=ch[i]%2;
ch[i]=ch[i]/2;
dhInt[index]=dh[i]%2;
dh[i]=dh[i]/2;
if(chInt[index]==dhInt[index])
chInt[index]=0; //把异或的结果存到chInt[]
else
chInt[index]=1;
index--;
}
indexlast+=4;
}
int temp = 0;
int j;
for( i=0,j=0;i<chInt.length;i++){
temp = temp*2+chInt[i];
if((i+1)%4==0)
{
if(temp<10)
cchar[j] = (char)(temp+'0');
else
cchar[j] = (char)('A'+temp-10);
j++;
temp = 0;
}
}
return cchar;
}
static char[] g(char[] ch,int num)
{
int i;
//左移一个字节
char a=ch[0],b=ch[1];
for(i=0;i<ch.length-2;i++)
ch[i] = ch[i+2];
ch[ch.length-2] = a;
ch[ch.length-1] = b;
//S盒字节代换
ch = subword(ch,s);
//xor Rcon[j]
ch = xor(ch,Rcon[num-1]);
return ch;
}
static char[] subword(char[] ch,String[][]yy) //字节代换函数
{
String[][] clone = yy.clone();
String temp = "";
int a = 0,b = 0; //记录行和列
for(int i=0;i<ch.length/2;i++) //每两位十六进制查一次 S BOX
{
if(ch[2*i]>='0'&&ch[2*i]<='9')
a = ch[2*i]-'0';
else a = ch[2*i]-'A'+10;
if(ch[2*i+1]>='0'&&ch[2*i+1]<='9')
b = ch[2*i+1]-'0';
else b = ch[2*i+1]-'A'+10;
temp += clone[a][b];
}
ch = temp.toCharArray();
return ch;
}
//--------------------------------------- code section --------------------------------------------------
static void encrypt(String cfile)throws IOException //加密函数
{
jiemi=0;
time = 0;
readcode(cfile);
/*if(time==0){
for(int i=0;i<State.length;i++)
{
for(int j=0;j<State[i].length;j++)
System.out.print(State[i][j]);
}
System.out.println();
}*/
xorkey();
for(time = 1;time<10;time++)
{
subcode();
linechange();
rowchange();
xorkey();
writeResults();
}
subcode();
linechange();
xorkey();
writeResults();
}
static void readcode(String cfile)throws IOException
{
//读取数据,并以128位分组
String scode = new String();
String byt;
char tempcode[];
int i = 0;
int num = 0;
//read codes
FileInputStream fStream = null;
try{
fStream = new FileInputStream(cfile);
}catch(FileNotFoundException fnfe){
System.exit(1);
}
try{
while(fStream.available()>0)
{
byt = (Integer.toHexString(fStream.read())).toUpperCase();
if(byt.length()==1)
byt = "0"+byt;
scode+=byt;
}
}catch(IOException ioe){}finally{
try{
if(fStream!=null)
fStream.close();
}catch(IOException ioe){};
}
tempcode = scode.toCharArray();
num = tempcode.length/32;
if(tempcode.length%32!=0)
num++;
State = new char[num][32]; //初始化明文/密文数组大小
//Long = tempcode.length/2;
//Result = new char[11][Long]; //用于入置每轮运算的结果
num = 0; //记录第几组128位(32位十六进制)
for(int j=0;j<tempcode.length ;j++)
{
if(i==32)
{
num++;
i = 0;
}
State[num][i] = tempcode[j];
i++;
}
while(i!=32)
{
State[num][i] = '0';
i++;
}
}
static void xorkey() //轮密钥加
{
int i;
char[]temp = new char[32];
for(i=0;i<8;i++)
temp[i] = w[time*4][i];
for(i=0;i<8;i++)
temp[i+8] = w[time*4+1][i];
for(i=0;i<8;i++)
temp[i+16] = w[time*4+2][i];
for(i=0;i<8;i++)
temp[i+24] = w[time*4+3][i];
char[] tempclone = temp.clone();
for( i = 0;i<State.length;i++)
{
State[i] = xor(State[i].clone(),tempclone);
tempclone = temp.clone();
}
temp = null;
}
static void subcode() //字节代换
{
if(jiemi==0)
{
for(int i=0;i<State.length;i++)
{
State[i] = subword(State[i],s);
}
}
else if(jiemi==1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -