AES算法
(一)设计思路(可包含部分关键代码说明)
/*通过密钥计算规则计算余下数组
*
*1.如果i不是4的倍数,那么第i列由如下等式确定:
*W[i]=W[i-4]⨁W[i-1]
*2.如果i是4的倍数,那么第i列由如下等式确定:
*W[i]=W[i-4]⨁T(W[i-1])
*其中,T是一个有点复杂的函数。函数T由3部分组成:字循环(每次循环一位)、字节代换(s盒)和轮常量异或。
*/
for (i = 4; i < 44; i++) {
temp = word[i - 1];//看作W[i-1]
if (i % 4 == 0) { //i为4的倍数 进入函数运算 W[i-1]=T(W[i-1])
temp = subWord(rotWord(temp));
temp[0] = temp[0] ^ RCon[i / 4 - 1];
}
for (j = 0; j < 4; j++) {
word[i][j] = word[i - 4][j] ^ temp[j];//相当于W[i]=W[i-4]⨁W[i-1]
}
}
}
//密钥扩展中的移位
static int[] rotWord(int[] word) {
int[] rot = new int[4];
int i;
for (i = 0; i < 4; i++) {
rot[i] = word[(i + 1) % 4];
}
return rot;
}
//密钥扩展中的4个字节的代换(4个字节为一组) 例如 A2 BE C4 D5
static int[] subWord(int[] word) {
int sub[] = new int[4];
int i;
for (i = 0; i < 4; i++) {
sub[i] = subByte(word[i]);
}
return sub;
}
//S盒的单个字节代换 例如 AE
static int subByte(int w) {
int x = w / 16;
int y = w % 16;
return sbox[x * 16 + y];
}
//轮密钥加
static int[] addRoundKey(int[] text, int round) {
int[] add = new int[16];
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
//System.out.print(Integer.toHexString(word[4 * round + i][j]) + ",");//第round轮的轮密钥
add[4 * i + j] = text[4 * i + j] ^ word[4 * round + i][j]; //逐比特异或
}
}
return add;
}
//行移位(循环移位)规则:第0行移0位 ..... 第3行移3位
static int[] shiftRows(int[] text) {
int[] shift = new int[16];
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
shift[4 * i + j] = text[4 * ((i + j) % 4) + j];
}
}
return shift;
}
//列混合
static int[] mixColumn(int[] text) {
int[] mix = new int[16];
int[] mass = {2, 3, 1, 1};
int i, j, u;
for (i = 0; i < 16; i++) {
u = 0;
for (j = 0; j < 4; j++) {
u = u ^ fieldMulit(text[(i / 4) * 4 + j], mass[(4 - i % 4 + j) % 4]);
}
mix[i] = u;
}
return mix;
}