[信息安全] AES128 加密/解密 --> state 矩阵

张开发
2026/4/13 6:24:24 15 分钟阅读

分享文章

[信息安全] AES128 加密/解密 --> state 矩阵
目录State矩阵一、核心问题state 既是输入也是输出二、state 到底是什么AES 核心结构三、你这段代码AES 解密流程 逐行讲解四、最关键state 全程在被修改五、一句话总结最核心总结AES 加密 / 解密流程图一、先记住state 永远是 4×4 矩阵二、AES 加密流程正向整体结构流程图文字版三、AES 解密流程你代码里的逻辑整体结构对应你代码的流程图四、加密 vs 解密对比图最关键五、一句话总结 state 的一生State矩阵state矩阵即使输入也是输出static void aes_xcrypt(state_t *state, const uint8 *round_key, boolean decrypt) { if (decrypt) { aes_add_round_key(state, AES_ROUNDS, round_key); for (uint32 i 0;; i) { aes_shift_rows(state, TRUE); aes_substitute_bytes(state, TRUE); aes_add_round_key(state, AES_ROUNDS - 1 - i, round_key); if (i AES_ROUNDS - 1) { break; } aes_mix_columns(state, TRUE); } }一、核心问题state 既是输入也是输出state_t *state 是一个指针指向一块内存调用函数时你把待加密 / 解密的数据放进 state 里 → 这是输入函数执行完state 里的数据被改写成加密 / 解密后的结果 → 这是输出它不是 “传值”而是直接修改内存里的内容所以同一个变量既是入参也是出参。二、state 到底是什么AES 核心结构AES 处理的不是零散字节而是一个 4×4 的字节矩阵state[0][0] state[0][1] state[0][2] state[0][3] state[1][0] state[1][1] state[1][2] state[1][3] state[2][0] state[2][1] state[2][2] state[2][3] state[3][0] state[3][1] state[3][2] state[3][3]一共 16 字节AES 分组固定大小state_t 就是这个 4×4 矩阵的类型定义所有 AES 变换行移位、字节代换、列混合、轮密钥加全部都在操作这个矩阵三、你这段代码AES 解密流程 逐行讲解这段代码是 AES 解密核心函数decrypt TRUE 分支。完整逻辑标准 AES-128 解密static void aes_xcrypt(state_t *state, const uint8 *round_key, boolean decrypt) { if (decrypt) // 进入解密模式 { // 1. 先和【最后一轮密钥】异或初始轮密钥加 aes_add_round_key(state, AES_ROUNDS, round_key); // 2. 循环执行 AES 轮函数共 AES_ROUNDS 轮通常 10 轮 for (uint32 i 0;; i) { // 逆行移位解密专用反向移动行 aes_shift_rows(state, TRUE); // 逆字节代换解密用 S 盒逆表 aes_substitute_bytes(state, TRUE); // 轮密钥加使用第 (AES_ROUNDS-1-i) 轮密钥 aes_add_round_key(state, AES_ROUNDS - 1 - i, round_key); // 循环终止条件执行完所有轮次退出 if (i AES_ROUNDS - 1) { break; } // 逆列混合最后一轮不执行 aes_mix_columns(state, TRUE); } } }每一步在干嘛aes_add_round_key把 state 矩阵和轮密钥做异或AES 必用操作。aes_shift_rows(TRUE)解密逆行移位把行移回去。aes_substitute_bytes(TRUE)解密逆字节代换用逆 S 盒查表。aes_mix_columns(TRUE)解密逆列混合最后一轮不做。四、最关键state 全程在被修改整个函数没有任何返回值所有结果都写回 *state进来state 密文出去state 明文这就是 AES 实现里最经典的 in-place 就地运算。五、一句话总结最核心state 是 AES 的 4×4 数据矩阵它是指针所以既是输入也是输出函数所有操作都直接修改这块内存解密完成后原数据被覆盖为解密结果总结state 既是输入也是输出因为它是指针函数直接修改内存里的数据。state 本质是 16 字节的 4×4 矩阵AES 所有变换都围绕它进行。你这段代码是 AES 解密流程按 “逆操作” 还原数据。函数无返回值结果全部写回 state。AES 加密 / 解密流程图下面给你画最清晰、最直观的 AES 加密 / 解密流程图专门围绕你这段代码里的 state 变化来讲。一、先记住state 永远是 4×4 矩阵[ 0] [ 4] [ 8] [12] [ 1] [ 5] [ 9] [13] [ 2] [ 6] [10] [14] [ 3] [ 7] [11] [15]所有操作都在原地修改这个矩阵。二、AES 加密流程正向整体结构初始轮密钥加state ⊕ 第 0 轮密钥循环 Nr−1 轮Nr10 轮 for AES-128字节代换 SubBytes行移位 ShiftRows列混合 MixColumns轮密钥加 AddRoundKey最后一轮无列混合字节代换 SubBytes行移位 ShiftRows轮密钥加 AddRoundKey流程图文字版明文 → [state] ↓ AddRoundKey (轮0) ↓ ┌─────────────────────┐ │ SubBytes │ │ ShiftRows │ │ MixColumns │ │ AddRoundKey (轮i) │ ← 循环 Nr-1 次 └─────────────────────┘ ↓ SubBytes ShiftRows AddRoundKey (轮Nr) ↓ 密文 ← [state]三、AES 解密流程你代码里的逻辑整体结构解密是逆序 逆操作先和最后一轮密钥异或state ⊕ 第 Nr 轮密钥循环 Nr 轮逆行移位 InvShiftRows逆字节代换 InvSubBytes轮密钥加 AddRoundKey从后往前取不是最后一轮才做逆列混合 InvMixColumns对应你代码的流程图密文 → [state] ↓ AddRoundKey (轮Nr) ↓ ┌─────────────────────────┐ │ InvShiftRows │ │ InvSubBytes │ │ AddRoundKey (轮Nr-1-i) │ │ │ │ if (不是最后一轮) │ │ InvMixColumns │ ← 循环 Nr 次 └─────────────────────────┘ ↓ 明文 ← [state]四、加密 vs 解密对比图最关键表格步骤AES 加密正向AES 解密逆向初始AddRoundKey (轮 0)AddRoundKey (轮 Nr)主体循环SubBytes → ShiftRows → MixColumns → AddRoundKeyInvShiftRows → InvSubBytes → AddRoundKey → InvMixColumns轮密钥顺序0 → 1 → 2 → … → NrNr → Nr−1 → … → 0最后一轮无 MixColumns无 InvMixColumnsstate输入明文 → 输出密文输入密文 → 输出明文五、一句话总结 state 的一生加密时state进去是明文出来是密文。解密时state进去是密文出来是明文。全程不复制、不返回、就地修改→ 所以它既是输入也是输出。

更多文章