2. 算法
AES算法加解密的流程图如下:
AES加密过程涉及到4种操作:
- 字节替代(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 轮密钥加(AddRoundKey)
解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。
2.1 字节替换
字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。
下图(a)是s盒(使用小s表示),图(b)是s逆盒(s逆使用Markdown不知道怎么表示,使用大S表示)。
s盒和S逆盒别为16x16的矩阵,即包含了0x00~0xFF所以的字节数值,s-box用于变换。例如 大专栏 AES Algorithm:字节00替换后的值为s[0][0]=63,再通过S即可得到替换前的值,S[6][3]=00。
/*
void sub_bytes(uint8_t *state) {
uint8_t i, j;
uint8_t row, col;
for (i = 0; i < 4; i++) {
for (j = 0; j < Nb; j++) {
row = (state[Nb*i+j] & 0xf0) >> 4;
col = state[Nb*i+j] & 0x0f;
state[Nb*i+j] = s_box[16*row+col];
}
}
}
/*
* Transformation in the Inverse Cipher that is the inverse of
* SubBytes().
*/
void inv_sub_bytes(uint8_t *state) {
uint8_t i, j;
uint8_t row, col;
for (i = 0; i < 4; i++) {
for (j = 0; j < Nb; j++) {
row = (state[Nb*i+j] & 0xf0) >> 4;
col = state[Nb*i+j] & 0x0f;
state[Nb*i+j] = inv_s_box[16*row+col];
}
}
}