AES Algorithm


2. 算法

AES算法加解密的流程图如下:

流程图

AES加密过程涉及到4种操作:

  • 字节替代(SubBytes)
  • 行移位(ShiftRows)
  • 列混淆(MixColumns)
  • 轮密钥加(AddRoundKey)

解密过程分别为对应的逆操作。由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。加解密中每轮的密钥分别由初始密钥扩展得到。算法中16字节的明文、密文和轮密钥都以一个4x4的矩阵表示。

2.1 字节替换

字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

下图(a)是s盒(使用小s表示),图(b)是s逆盒(s逆使用Markdown不知道怎么表示,使用大S表示)。

s-box Inverse s-box

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];
        }
    }                                                                                                                                                        
}

3. 参考


猜你喜欢

转载自www.cnblogs.com/wangziqiang123/p/11710945.html