1.AES加密算法:AES加密算法是由于DES和3DES在应用中出现的问题而提出的高级加密标准。AES算法不是Feistel结构,AES的操作轮数在10-14之间。其中当数据块和密钥都为128位时,轮数为10。随着数据块的密钥长度的增加,操作轮数也会增加,最大值为14。AES的每一轮包括以下4部分
字节替换:用一张称为“S盒子”的固定表来执行字节到字节的替换
行移位置换:行与行之间执行简单的替换
列混淆替换:列中的每一个字节替换成该列所有字节的一个函数
轮密钥加:用当前的数据块与扩充密钥的一部分进行简单的XOR运算
字节替换:
private void subBytes(){
for(int i = 0;i<16;i++)
data[i] = (byte) sbox[data[i]&0xff];
}
private void invSubBytes(){
for(int i = 0;i<16;i++)
data[i] = (byte) isbox[data[i]&0xff];
}
行移位置换:
private void shiftRows(){
byte[] tmp = new byte[4];
int n;
for(int i = 0;i<4;i++){
n = i*4;
tmp[0] = data[n];
tmp[1] = data[n+1];
tmp[2] = data[n+2];
tmp[3] = data[n+3];
data[n] = tmp[i%4];
data[n+1] = tmp[(1+i)%4];
data[n+2] = tmp[(2+i)%4];
data[n+3] = tmp[(3+i)%4];
}
}
privatevoid invShiftRows(){
byte[] tmp = new byte[4];
int n;
for(int i = 0;i<4;i++){
n = i*4;
tmp[0] = data[n];
tmp[1] = data[n+1];
tmp[2] = data[n+2];
tmp[3] = data[n+3];
data[n+i%4] = tmp[0];
data[n+(1+i)%4] = tmp[1];
data[n+(2+i)%4] = tmp[2];
data[n+(3+i)%4] = tmp[3];
}
}
列混淆置换:
private void mixColumns(){
byte[] tmp = new byte[4];
for(inti = 0;i< 4;i++){
tmp[0] = data[i];
tmp[1] = data[i+4];
tmp[2] = data[i+8];
tmp[3] = data[i+12];
data[i] = (byte)(gfmulBy02(tmp[0])^gfmulBy03(tmp[1])^gfmulBy01(tmp[2])^gfmulBy01(tmp[3]));
data[i+4] = (byte)(gfmulBy01(tmp[0])^gfmulBy02(tmp[1])^gfmulBy03(tmp[2])^gfmulBy01(tmp[3]));
data[i+8] = (byte)(gfmulBy01(tmp[0])^gfmulBy01(tmp[1])^gfmulBy02(tmp[2])^gfmulBy03(tmp[3]));
data[i+12] = (byte) (gfmulBy03(tmp[0])^gfmulBy01(tmp[1])^gfmulBy01(tmp[2])^gfmulBy02(tmp[3]));
}
}
private void invMixColumns(){
byte[] tmp = new byte[4];
for(int i = 0;i< 4;i++){
tmp[0] = data[i];
tmp[1] = data[i+4];
tmp[2] = data[i+8];
tmp[3] = data[i+12];
data[i+0] = (byte) (gfmulBy0e(tmp[0]) ^ gfmulBy0b(tmp[1]) ^gfmulBy0d(tmp[2]) ^ gfmulBy09(tmp[3]));
data[i+4] = (byte) (gfmulBy09(tmp[0]) ^ gfmulBy0e(tmp[1]) ^gfmulBy0b(tmp[2]) ^ gfmulBy0d(tmp[3]));