news 2026/10/28 2:01:45

密码算法:AES从 FIPS 197 到安全芯片侧信道防护(Python + C 完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
密码算法:AES从 FIPS 197 到安全芯片侧信道防护(Python + C 完整代码)

代码实现源码(python版+C版)## 摘要

本文以 FIPS 197 为准绳,从算法原理、软实现、安全芯片驱动、侧信道防护、国际认证五个维度,完整解析 AES 的软件实现。给出可运行的Python 参考实现(aes.py)与C 驱动(aes_.c),后者在逆运算校验基础上,进一步实现掩码 S 盒、常数时间查表、随机延时流控三层侧信道防护。全部代码通过 FIPS 197 附录 B/C 标准测试向量验证。

关键词:AES、FIPS 197、软实现、侧信道攻击、DPA、掩码、安全芯片、SOG-IS、GF(2⁸)


一、为什么 AES 的软实现比 DES 更值得讲

承接前一篇 DES 软实现,AES 与之有本质结构差异,这决定了实现难度与防护策略完全不同:

特性DESAES
结构Feistel(L/R 半区互换)SPN(替代-置换网络)
解密子密钥逆序(“免费”)完整逆变换链(逆 S 盒/逆 ShiftRows/逆 MixColumns)
非线性8 个 6→4 bit S 盒1 个 8→8 bit S 盒(GF(2⁸) 逆元+仿射)
密钥56 bit(已可破解)128/192/256 bit
分组64 bit128 bit

核心结论:AES 解密不能"免费",必须独立实现一套逆变换,这是软实现最容易出错、也最考验功底的地方。


二、算法原理(FIPS 197 要点)

2.1 四个轮变换

加密每轮四步:

  1. SubBytes:字节经 S 盒替换(唯一非线性);
  2. ShiftRows:第 r 行循环左移 r 字节;
  3. MixColumns:每列左乘固定矩阵(GF(2⁸) 域运算,列间扩散);
  4. AddRoundKey:与轮密钥逐字节异或。

首轮只 AddRoundKey;末轮省略 MixColumns。

2.2 GF(2⁸) 有限域——AES 的数学心脏

AES 的 S 盒与 MixColumns 都建立在 GF(2⁸) 上,不可约多项式为:

m(x) = x⁸ + x⁴ + x³ + x + 1 (即 0x11B)

这是整个实现正确性的根基。MixColumns 的01/02/03、逆矩阵的09/0b/0d/0e,全靠它做乘法。

2.3 S 盒的构造

S 盒是 AES 唯一的非线性环节,本质是GF(2⁸) 乘法逆元 + 仿射变换。实现时逆 S 盒由 S 盒程序化生成,避免手工抄写 256 项易错:

SBOX=[0x63,0x7c,0x77,0x7b,...]# FIPS 197 图 7INV_SBOX=[0]*256foriinrange(256):INV_SBOX[SBOX[i]]=i# 由 S 盒反推逆 S 盒

2.4 密钥编排(Key Expansion)

密钥按 4 字节成字w[i],i≥Nk时:若i mod Nk==0则对w[i-1]做RotWord→SubWord→异或 Rcon;AES-256 时i mod Nk==4额外 SubWord。生成Nr+1个 128 bit 轮密钥:

i%Nk==0

AES-256 且 i%Nk==4

否则

密钥 Nk×32bit

w[0..Nk-1]

i≥Nk

RotWord→SubWord→⊕Rcon

SubWord

直接

w[i]=w[i-Nk]⊕temp

轮密钥 Nr+1 组


三、Python 实现核心片段

3.1 有限域乘法

MixColumns 的02倍乘本质是「左移 + 条件异或 0x11B」,即_xtime;通用乘法_gmul则在其上叠加循环:

def_xtime(a):# x 倍(×2)a<<=1ifa&0x100:a^=0x11B# 溢出则模不可约多项式returna&0xFFdef_gmul(a,b):# 通用乘法(MixColumns 用)r=0for_inrange(8):ifb&1:r^=a hi=a&0x80a=(a<<1)&0xFFifhi:a^=0x1Bb>>=1returnr

3.2 解密逆变换链(SPN 与 DES 的本质差异)

AES 解密是严格逆序的完整逆变换:先AddRoundKey(末轮密钥),中间轮按InvShiftRows → InvSubBytes → AddRoundKey → InvMixColumns顺序,末轮无 InvMixColumns。这与 DES「子密钥逆序免费解密」截然不同——必须独立实现逆 S 盒、逆 ShiftRows、逆 MixColumns。

模块调用关系如下:

aes_crypt

aes_encrypt_block

aes_decrypt_block

key_expansion

_sub_bytes

_shift_rows

_mix_columns

_sub_bytes(INV)

_inv_shift_rows

_inv_mix_columns

_gmul

3.3 密钥编排

defkey_expansion(key):nk=len(key)//4nr={4:10,6:12,8:14}[nk]# 密钥长度驱动轮数w=[[key[4*i+j]forjinrange(4)]foriinrange(nk)]foriinrange(nk,4*(nr+1)):temp=w[i-1][:]ifi%nk==0:temp=_sub_word(_rot_word(temp))temp[0]^=RCON[i//nk-1]elifnk>6andi%nk==4:# AES-256 特有temp=_sub_word(temp)w.append([w[i-nk][j]^temp[j]forjinrange(4)])...

3.4 单块加密(末轮无 MixColumns)

单块加密数据流如下图所示(首轮 AddRoundKey → 中间 Nr−1 轮完整四步 → 末轮省 MixColumns):

明文 128bit

AddRoundKey(K0)

中间轮 1..Nr-1

SubBytes

ShiftRows

MixColumns

AddRoundKey(Ki)

SubBytes(末轮)

ShiftRows

AddRoundKey(Knr)

密文 128bit

defaes_encrypt_block(block16,key):rks=key_expansion(key);nr=len(rks)-1state=_add_round_key(block16,rks[0])forrndinrange(1,nr):state=_sub_bytes(state,SBOX)state=_shift_rows(state)state=_mix_columns(state)state=_add_round_key(state,rks[rnd])state=_sub_bytes(state,SBOX)# 末轮省略 MixColumnsstate=_shift_rows(state)state=_add_round_key(state,rks[nr])returnstate

3.5 自测:FIPS 197 附录 B/C 三档向量

AES-128: key=000102...0f0f PT=001122...eeff → 69c4e0d86a7b0430d8cdb78070b4c55a AES-192: key=000102...1717 PT=001122...eeff → dda97ca4864cdfe06eaf70a0ec0d7191 AES-256: key=000102...1f1f PT=001122...eeff → 8ea2b7ca516745bfeafc49904b496089

运行python aes.py,三档全部通过。


四、C 驱动与侧信道防护

aes_.c在 DES 驱动基础上,构建三层侧信道防护:

4.1 逆运算校验(抗故障注入)

staticse_statusaes_encrypt_block_secure(constuint8_tin[16],uint8_tout[16],constuint8_t*rks,intnr){/* ... 加密 ... *//* 逆运算校验:解密回明文比对 */uint8_tback[16];aes_decrypt_block(s,back,rks,nr);if(memcmp(back,in,16)!=0)returnSE_FALSE;memcpy(out,s,16);returnSE_TRUE;}

4.2 常数时间掩码 S 盒(抗缓存侧信道)

/* 全表扫描 + 掩码选通:无数据依赖的访存地址差异 */staticuint8_tsbox_masked_ct(uint8_tidx){uint8_tr=0;for(inti=0;i<256;i++){uint8_tmatch=(uint8_t)(0xFFu*(uint8_t)(idx==i));r|=SBOX[i]&match;}returnr;}

4.3 随机延时流控(抗 SPA)

staticvoidrandom_delay(void){volatileuint32_td=rng_next()&0x3F;while(d--){asmvolatile("":::"memory");}}

统一入口AES_Crypto_drv通过mode位域(bit14 逆校验、bit13 掩码、bit12 延时)开关防护,ECB/CBC、AES-128/192/256 全支持。

4.4 算法实现关键点小结

  1. SPN 结构与逆变换链:解密需独立逆 S 盒、逆 ShiftRows、逆 MixColumns,不可像 DES 那样子密钥逆序了事。
  2. GF(2⁸) 域运算:0x11B不可约多项式是 MixColumns/InvMixColumns 的正确性根基,_gmul/_xtime是实现核心。
  3. 末轮无 MixColumns:加密与解密的末轮均省略列混合,最易漏。
  4. 逆 S 盒程序化生成:避免手工 256 项抄写错误。
  5. 密钥长度驱动轮数:Nk=4/6/8 对应 Nr=10/12/14,Rcon 索引随轮数延伸。
  6. KAT 自测:FIPS 197 附录 B/C 三档向量是最低验证门槛。

五、抗侧信道攻击分析

5.1 计时攻击 / 缓存侧信道(Cache-Timing)

泄漏点位置防护手段
S 盒查表索引依赖密钥SBOX[state[i]]常数时间查表(sbox_masked_ct);或 bitslicing
MixColumns 分支gmul的 if改为常数时间(无数据依赖分支)

5.2 功耗分析(SPA/DPA)

泄漏点位置防护手段
S 盒输出汉明重量与功耗相关SubBytes布尔掩码(sub_bytes_masked)
轮密钥异或功耗模式AddRoundKey掩码 + 随机化

5.3 故障注入攻击(FA)

泄漏点位置防护手段
轮次/中间位可被翻转各轮变换逆运算校验(已实现)、冗余计算

六、侧信道防护全景

防护目标手段状态
计时/缓存侧信道常数时间查表✅ 已实现
DPA(功耗)一阶布尔掩码✅ 已实现
SPA(时序)随机延时流控✅ 已实现
故障注入逆运算校验✅ 已实现
高阶 DPA高阶掩码/双轨逻辑⚠️ 需硬件
密钥生命周期安全存储+用后清零⚠️ 待补充

纯软件掩码是必要不充分条件,完整抗侧信道需芯片硬件(TRNG、双轨逻辑、屏蔽层)协同。密钥目前以明文传入,生产落地需改为安全存储 + 用后清零。


七、认证对照

认证体系与 AES 的关系
EMVCoAES 取代 TDES 用于支付 MAC/加密
EUCC / SOG-ISAES-128/192/256 是 SOG-IS认可对称算法;pp0084 要求密码机制硬件化
GB/T 22186-2016IC 卡芯片安全技术要求,对应 CC 国标映射
现行标准FIPS 197(本体);SP 800-38A(模式);SP 800-90A(随机数)

八、总结

  1. AES 是SPN 结构,解密需完整逆变换链,这是与 DES(Feistel)最大的实现差异。
  2. GF(2⁸) 域运算(0x11B)是正确性根基,MixColumns/InvMixColumns 全靠它。
  3. C 驱动实现「逆运算校验 + 掩码 S 盒 + 随机延时流控」三层侧信道防护,相对 DES 是显著增量。
  4. 生产落地优先 AES-256 + 硬件密码引擎;软实现用于教学、算法验证与驱动参考。
    代码实现链接:见链接
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 2:00:16

曼德博分形图的简单绘制和保存

/*在窗口中绘制分形图&#xff0c;并可以保存为图像文件*/#define _USE_MATH_DEFINES //定义此宏就可以使用其它预定义的宏&#xff0c;比如 M_PI #include <math.h> //使用数学函数&#xff0c;比如 sqrt #include <stdio.h> #include <windows.h> #include…

作者头像 李华
网站建设 2026/10/28 1:59:50

棉花采摘棉铃检测数据集 | 棉花成熟度 棉铃检测 智慧农业 目标检测 YOLO格式9252期

棉花采摘棉铃检测数据集 | 棉花成熟度 棉铃检测 智慧农业 目标检测 YOLO格式9252期 数据集概述 本数据集专注于农田场景下棉花棉铃成熟度与采摘状态的视觉检测&#xff0c;服务于智慧农业、自动化采摘及棉花产量评估。数据涵盖四种典型的棉铃状态&#xff0c;适配目标检测模型…

作者头像 李华
网站建设 2026/10/28 1:58:49

如何写 Skill 番外,你的第一个自定义 agent

摘要&#xff1a;同一段盲测提示词&#xff0c;手写到第三遍&#xff0c;我把它固化成了自己的第一个自定义 agent。这篇讲造岗的全套手艺&#xff1a;什么时候该把重复劳动抽象成岗&#xff0c;一份 agent 定义文件的三个读者各读什么&#xff0c;字段拼错和方言差异怎么防&am…

作者头像 李华
网站建设 2026/10/28 1:58:08

高通SA8295P与SA8775P深度对比:智能座舱平台升级,真正改变了什么?

高通SA8295P与SA8775P深度对比:智能座舱平台升级,真正改变了什么? 一、SA8295P和SA8775P为什么值得对比? 高通SA8295P和SA8775P是智能座舱及融合计算领域值得关注的两款汽车级处理器。 SA8295P主要面向高性能智能座舱,包括多屏显示、3D图形渲染、视频编解码、摄像头处理…

作者头像 李华