为什么做这个平台

在分组密码的差分故障分析(Differential Fault Analysis, DFA)研究中,有一个绕不开的核心环节:故障传播属性的推导与验证。
具体来说,当你对一个分组密码算法注入一个故障(比如在第 5 轮把某个字节的值改了),这个故障会在后续的每一轮运算中传播。在 SubBytes 层,S-box 的非线性会让差分值发生不可逆的变换;在 ShiftRows 层,字节位置会被置换;在 MixColumns 层,有限域乘法会让一个字节的差分扩散到整列四个字节;在 AddRoundKey 层,轮密钥会对正常路径和故障路径同时作用,在差分中抵消。
研究者需要回答一个关键问题:故障注入后,每一步运算的差分传播是否符合预期的数学属性?
如果不符合,说明推导有误或者算法实现有误。如果符合,说明你对故障传播的理解是正确的,可以继续推导后续步骤。
这个推导过程,手推的话需要:
- 对每一步逐字节(或逐 nibble、逐 32 位字)计算正常值和故障值
- 做异或得到实际差分
- 根据运算的数学性质推导期望差分
- 对比期望差分和实际差分是否一致
以 AES 的 MixColumns 步骤为例。MixColumns 对状态矩阵的每一列做一次矩阵乘法,运算在 GF(28)GF(2^8)GF(28) 有限域上进行,不可约多项式为 x8+x4+x3+x+1x^8 + x^4 + x^3 + x + 1x8+x4+x3+x+1(即十六进制 0x11B0x11B0x11B)。AES 的 MixColumns 矩阵为:
2311123111233112×s0s1s2s3=s0′s1′s2′s3′ \begin{bmatrix} 2 & 3 & 1 & 1 \\ 1 & 2 & 3 & 1 \\ 1 & 1 & 2 & 3 \\ 3 & 1 & 1 & 2 \end{bmatrix} \times \begin{bmatrix} s_0 \\ s_1 \\ s_2 \\ s_3 \end{bmatrix} = \begin{bmatrix} s_0' \\ s_1' \\ s_2' \\ s_3' \end{bmatrix} 2113321113211132 × s0s1s2s3 = s0′s1′s2′s3′
每一个输出字节都是 4 次有限域乘法加 3 次异或的结果。比如第一个输出字节 s0′=2⋅s0⊕3⋅s1⊕1⋅s2⊕1⋅s3s_0' = 2 \cdot s_0 \oplus 3 \cdot s_1 \oplus 1 \cdot s_2 \oplus 1 \cdot s_3s0′=2⋅s0⊕3⋅s1⊕1⋅s2⊕1⋅s3,其中 2⋅s02 \cdot s_02⋅s0 表示在 GF(28)GF(2^8)GF(28) 上乘以 2:先把 s0s_0s0 左移一位,如果最高位为 1 则再异或 0x1B0x1B0x1B。3⋅s13 \cdot s_13⋅s1 则是 2⋅s1⊕s12 \cdot s_1 \oplus s_12⋅s1⊕s1。每一列要做 4×4=164 \times 4 = 164×4=16 次有限域乘法和 12 次异或,AES 一轮有 4 列,共 64 次乘法和 48 次异或。AES 共 9 轮 MixColumns(第 10 轮没有),总计 576 次有限域乘法。
手推一轮 MixColumns 的差分传播,需要先算出正常输入和故障输入的差分值,再逐列乘以矩阵,再逐字节与实际差分对比------一轮就要十几分钟,9 轮下来一两个小时就没了,中间任何一步算错都要重来。LED 的 MixColumnsSerial 在 GF(24)GF(2^4)GF(24) 上进行,矩阵系数不同,但有 32 步。SM4 的 LLL 线性变换是 32 位字上的 5 次循环移位异或,共 32 轮。三种算法全部手推一遍,至少半天,还极容易出错。
这就是做这个平台的初衷:把故障传播的属性推导过程自动化、可视化、可验证。
学术依据
本平台的方法论参考了以下论文的故障传播建模与属性挖掘思想:
X. Wang, W. Hu, S. Tang, X. Wang and H. Zhou, "An Automated Fault Attack Framework for Block Ciphers Through Property Mining and Verification," in IEEE Transactions on Circuits and Systems I: Regular Papers, vol. 72, no. 1, pp. 337-350, Jan. 2025, doi: 10.1109/TCSI.2024.3456787.
这篇论文提出了 fault propagation model generation(故障传播模型生成)、fault property mining(故障属性挖掘)和 fault correlation property(故障关联属性)的方法论。本平台的推导流程------从正常执行和故障执行出发,逐步构建差分轨迹,逐步推导并验证数学属性------正是基于这一思想构建的。
但需要特别说明:本平台参考论文的方法论框架,但具体算法变换和推导公式均基于标准定义独立实现,而非直接复用论文中的公式。 具体依据为:
- AES:基于 FIPS 197 标准
- LED:基于原始论文定义
- SM4:基于 GB/T 32907-2016 国标
每种算法的实现都通过了内置测试向量的校验,确保加密结果与标准一致。

功能总览
本平台支持 AES-128 、LED-64 、SM4 三种分组密码算法,提供完整的故障注入、执行轨迹记录、差分传播分析和数学属性推导功能。
用户只需指定密钥、明文和故障配置(故障轮次、位置、值、类型),系统会自动完成以下全部工作:
- 用正常密钥和明文执行一次完整加密,记录每一步的中间状态------这是 Normal Trace
- 在指定轮次注入故障后执行一次完整加密,记录每一步的中间状态------这是 Faulty Trace
- 逐步对比两条轨迹,计算每一步的差分值------这是 Diff Trace
- 对每一步运算,根据数学性质推导期望差分,与实际差分对比验证------这是 Properties

下面逐一详细说明。
Normal Trace:正常执行的完整轨迹
Normal Trace 是用指定的密钥和明文进行一次标准加密的完整记录。它记录了加密过程中每一轮、每一步运算的中间状态。
AES-128 的 Normal Trace 包含 11 条记录(第 0 轮 + 第 1-9 轮 + 第 10 轮),每条记录包含:
round:轮次编号(0-10)roundInput:该轮的输入状态(第 0 轮为明文 ⊕\oplus⊕ 初始轮密钥)afterSubBytes:SubBytes 之后的状态(16 个字节经过 S-box 替换后的结果)afterShiftRows:ShiftRows 之后的状态(行移位后的结果)afterMixColumns:MixColumns 之后的状态(列混合后的结果,第 10 轮无此步骤)afterAddRoundKey:AddRoundKey 之后的状态(异或轮密钥后的结果)roundKey:该轮使用的轮密钥
LED-64 的 Normal Trace 包含 32 步,每步包含 4 个子运算的中间状态:
afterAddConstants:AddConstants 之后的状态(异或轮常量)afterSubCells:SubCells 之后的状态(4×44 \times 44×4 nibble 经过 S-box 替换)afterShiftRows:ShiftRows 之后的状态(行移位)afterMixColumnsSerial:MixColumnsSerial 之后的状态(GF(24)GF(2^4)GF(24) 列混合)
SM4 的 Normal Trace 包含 32 轮,每轮包含:
x0, x1, x2, x3:轮输入的 4 个 32 位字rk:该轮的轮密钥a:τ(A)\tau(A)τ(A) 的输入(X1⊕X2⊕X3⊕RKX_1 \oplus X_2 \oplus X_3 \oplus RKX1⊕X2⊕X3⊕RK)tauA:S-box 替换后的结果lb:LLL 线性变换后的结果x4:轮输出(X0⊕L(τ(A))X_0 \oplus L(\tau(A))X0⊕L(τ(A)))
Normal Trace 的作用是建立一个"正确"的参照基准。后续的故障分析都要和它对比。
Faulty Trace:故障注入后的执行轨迹
Faulty Trace 是在加密过程中注入故障后的完整执行记录。它的结构和 Normal Trace 完全相同,唯一区别是:在用户指定的轮次和位置,注入了一个故障值。
平台支持以下故障模型:
| 算法 | 故障类型 | 说明 |
|---|---|---|
| AES | byte | 将指定字节替换为故障值 |
| AES | bitflip | 将指定字节与故障值异或(位翻转) |
| LED | nibble | 将指定半字节替换为故障值 |
| LED | bitflip | 将指定半字节与故障值异或 |
| SM4 | byte | 将指定字节替换为故障值 |
| SM4 | word | 将指定 32 位字替换为故障值 |
| SM4 | bitflip | 将指定字节与故障值异或 |
故障注入后,故障值会在后续每一轮的每一步中传播。Faulty Trace 记录了这个故障传播的完整过程。
举例:如果你在 AES 第 5 轮的第 0 个字节注入了一个 byte 故障(值为 0x010x010x01),那么:
- 第 5 轮的 AddRoundKey 输出中,第 0 个字节会和正常值不同
- 第 5 轮之后的 SubBytes 中,这个字节经过 S-box 变换,差分值会变成另一个值
- ShiftRows 会把这个字节移动到另一个位置
- MixColumns 会让这个差分扩散到整列 4 个字节
- 后续每一轮都会继续传播
Faulty Trace 把这个传播过程中每一步的状态都记录了下来。
Diff Trace:逐步差分轨迹
Diff Trace 是 Normal Trace 和 Faulty Trace 逐步异或的结果。它精确展示了故障在每一步运算中的传播情况。
Diff Trace 中的每一条记录包含:
round:轮次step:运算步骤名(如afterSubBytes、afterShiftRows、afterMixColumns、afterAddRoundKey)normalValue:Normal Trace 中该步骤的状态值faultyValue:Faulty Trace 中该步骤的状态值diffValue:两者异或的差分值(Δ=normalValue⊕faultyValue\Delta = \text{normalValue} \oplus \text{faultyValue}Δ=normalValue⊕faultyValue)activePositions:差分值中非零的字节/半字节/字位置hammingWeight:差分值的汉明重量(有多少个 bit 为 1)
Diff Trace 的价值在于:你可以一眼看出故障在每一步传播到了哪些位置、扩散到了多大范围。例如:
- 在 SubBytes 之后,差分可能只有 1 个字节非零(因为 S-box 是逐字节独立替换)
- 经过 ShiftRows 后,这个非零字节的位置发生了移动
- 经过 MixColumns 后,1 个字节的差分扩散到了整列 4 个字节
- 经过 AddRoundKey 后,差分值不变(密钥抵消)
如果你在第 5 轮注入故障,Diff Trace 会从第 5 轮一直展示到第 10 轮结束,让你完整看到故障从注入点到密文的传播路径。

Properties:数学属性推导与验证

Properties 是平台的核心功能。它对 Diff Trace 中的每一步运算,自动推导期望差分,并与实际差分对比验证。
每条 Property 包含以下字段:
id:属性的唯一标识(如aes-r5-subbytes、led-s10-subcells)algorithm:算法名称round:轮次step:运算步骤type:属性类型(linear表示线性运算,nonlinear表示非线性运算)status:验证结论(satisfied或violated)explanation:人类可读的推导说明formulaLatex:数学公式(平台渲染为学术论文风格的公式)normalValue/faultyValue:正常输入和故障输入normalOutput/faultyOutput:正常输出和故障输出expectedDiff:根据数学性质推导的期望差分actualDiff:从 Diff Trace 中计算的实际差分involvedUnits:参与差分传播的字节/半字节位置derivationSteps:完整的推导步骤(每一步都有解释和公式)
验证逻辑:如果 expectedDiff 和 actualDiff 一致,属性标记为 Satisfied(满足);如果不一致,标记为 Violated(违反)。
不同运算步骤的属性推导方式不同:
AddRoundKey / AddConstants(线性运算)
轮密钥或常量对正常路径和故障路径相同,因此在差分中抵消。推导公式为:
ΔY=(X⊕K)⊕(X′⊕K)=X⊕X′=ΔX \Delta Y = (X \oplus K) \oplus (X' \oplus K) = X \oplus X' = \Delta X ΔY=(X⊕K)⊕(X′⊕K)=X⊕X′=ΔX
即输出差分等于输入差分。平台会逐字节验证这一点。
SubBytes / SubCells(非线性运算)
S-box 是非线性替换,差分传播不满足线性关系。平台对每个字节/半字节分别计算:
ΔYi=S(Xi)⊕S(Xi′) \Delta Y_i = S(X_i) \oplus S(X_i') ΔYi=S(Xi)⊕S(Xi′)
其中 XiX_iXi 是正常输入,Xi′X_i'Xi′ 是故障输入,SSS 是 S-box 查表函数。由于 S-box 的非线性,ΔYi\Delta Y_iΔYi 不能简单地从 ΔXi\Delta X_iΔXi 推导------必须知道具体的 XiX_iXi 和 Xi′X_i'Xi′ 值。
平台会将 S(Xi)⊕S(Xi′)S(X_i) \oplus S(X_i')S(Xi)⊕S(Xi′) 的结果作为 expectedDiff,与 actualDiff 逐字节对比。
ShiftRows(线性置换)
ShiftRows 是字节位置的固定置换,差分传播遵循置换关系:
ΔY=P(ΔX) \Delta Y = P(\Delta X) ΔY=P(ΔX)
即输出差分等于输入差分经过相同的置换。平台会验证置换后的差分是否与实际差分一致。
MixColumns(有限域线性变换)
这是最复杂的一步。MixColumns 对每一列的 4 个字节施加一个 4×44 \times 44×4 矩阵乘法,运算在 GF(28)GF(2^8)GF(28) 上进行,不可约多项式为 x8+x4+x3+x+1x^8 + x^4 + x^3 + x + 1x8+x4+x3+x+1(十六进制 0x11B0x11B0x11B)。
平台逐列推导:取输入差分的 4 个字节 (Δd0,Δd1,Δd2,Δd3)(\Delta d_0, \Delta d_1, \Delta d_2, \Delta d_3)(Δd0,Δd1,Δd2,Δd3),分别乘以 MixColumns 矩阵的 4 行系数 (2,3,1,1)(2, 3, 1, 1)(2,3,1,1),得到期望的输出差分 (Δe0,Δe1,Δe2,Δe3)(\Delta e_0, \Delta e_1, \Delta e_2, \Delta e_3)(Δe0,Δe1,Δe2,Δe3),然后与实际差分逐字节对比。每一个系数乘法都是在 GF(28)GF(2^8)GF(28) 上的有限域乘法------乘以 2 就是左移一位后条件异或 0x1B0x1B0x1B,乘以 3 就是乘以 2 再异或原值。
LED 的 MixColumnsSerial 在 GF(24)GF(2^4)GF(24) 上进行,不可约多项式为 x4+x+1x^4 + x + 1x4+x+1,矩阵系数为:
MLED=412286561114109221511 M_{LED} = \begin{bmatrix} 4 & 1 & 2 & 2 \\ 8 & 6 & 5 & 6 \\ 11 & 14 & 10 & 9 \\ 2 & 2 & 15 & 11 \end{bmatrix} MLED= 481121614225101526911
推导逻辑相同但运算是逐 nibble 而非逐字节。
SM4 的 LLL 线性变换是 32 位字上的循环移位异或:
L(B)=B⊕(B⋘2)⊕(B⋘10)⊕(B⋘18)⊕(B⋘24) L(B) = B \oplus (B \lll 2) \oplus (B \lll 10) \oplus (B \lll 18) \oplus (B \lll 24) L(B)=B⊕(B⋘2)⊕(B⋘10)⊕(B⋘18)⊕(B⋘24)
其中 ⋘\lll⋘ 表示循环左移。平台会验证 L(ΔB)L(\Delta B)L(ΔB) 是否等于 ΔL\Delta LΔL。
以 AES 第 5 轮 MixColumns 为例的完整推导流程
- 从 Normal Trace 取第 5 轮 ShiftRows 后的状态:X=db 13 53 45 ...X = \texttt{db 13 53 45 \ldots}X=db 13 53 45 ...
- 从 Faulty Trace 取第 5 轮 ShiftRows 后的状态:X′=da 13 53 45 ...X' = \texttt{da 13 53 45 \ldots}X′=da 13 53 45 ...(第 0 字节不同)
- 计算输入差分:ΔX=X⊕X′=01 00 00 00 ...\Delta X = X \oplus X' = \texttt{01 00 00 00 \ldots}ΔX=X⊕X′=01 00 00 00 ...
- 对第 0 列 (Δd0,Δd1,Δd2,Δd3)=(0x01,0x00,0x00,0x00)(\Delta d_0, \Delta d_1, \Delta d_2, \Delta d_3) = (0x01, 0x00, 0x00, 0x00)(Δd0,Δd1,Δd2,Δd3)=(0x01,0x00,0x00,0x00),乘以 MixColumns 矩阵:
2311123111233112×0x010x000x000x00=0x020x010x010x03 \begin{bmatrix} 2 & 3 & 1 & 1 \\ 1 & 2 & 3 & 1 \\ 1 & 1 & 2 & 3 \\ 3 & 1 & 1 & 2 \end{bmatrix} \times \begin{bmatrix} 0x01 \\ 0x00 \\ 0x00 \\ 0x00 \end{bmatrix} = \begin{bmatrix} 0x02 \\ 0x01 \\ 0x01 \\ 0x03 \end{bmatrix} 2113321113211132 × 0x010x000x000x00 = 0x020x010x010x03
- 期望输出差分第 0 列 =(0x02,0x01,0x01,0x03)= (0x02, 0x01, 0x01, 0x03)=(0x02,0x01,0x01,0x03)
- 从 Diff Trace 取实际输出差分第 0 列,与期望值逐字节对比
- 如果一致,标记为 Satisfied;如果不一致,标记为 Violated
整个过程在平台上自动完成,每一步都有数学公式和文字解释。
其他功能
Key Schedule 可视化
AES 的密钥编排完整展示 11 轮轮密钥(44 个 32 位字),每轮的生成公式都有数学公式展示。SM4 展示 32 个轮密钥及其生成过程。
十个密码分析小工具
平台提供十个独立工具,可以脱离主推导流程单独使用:
- S-box / InvS-box:AES、SM4、LED 三种算法的正向和逆向 S-box 查表,支持单个值查询和批量查询(输入一个 hex 串,自动拆分逐字节查表),附带二进制展示和验证状态
- XOR 运算:支持字节模式、半字节模式(LED 专用)和 32 位字模式(SM4 专用),严格对齐或左补零
- GF 有限域 :GF(28)GF(2^8)GF(28)(AES/SM4)和 GF(24)GF(2^4)GF(24)(LED)的乘法、求逆、xtime、幂运算,每一步都带详细计算过程
- AES MixColumns / InvMixColumns:输入 4 个字节,直接输出列混合结果,正向和逆向都支持
- LED MixColumnsSerial :LED 的 GF(24)GF(2^4)GF(24) 列混合运算
- SM4 L / L' 线性变换 :SM4 的 LLL 变换和逆 L′L'L′ 变换,输入 32 位字直接出结果
- 状态矩阵格式化 :将 hex 串格式化为 AES 4×44 \times 44×4 列优先矩阵、LED 4×44 \times 44×4 nibble 矩阵或 SM4 4 字矩阵,支持两个状态的差分矩阵对比
- Hamming Weight / Distance:汉明重量和汉明距离计算,拆分展示每个字节的 HW 值
- DDT 差分分布表:S-box 的差分分布表查询,支持单行查询(给定输入差分,输出所有可能的输出差分及其计数)和完整表格展示
- 位旋转与字节拆分:ROTL / ROTR,支持 8/16/32/64 位宽度,附带字节拆分展示

留言板
平台内置留言板,支持中英文用户名(包括中文字符),可以留下使用反馈、Bug 报告或学术讨论。留言会展示设备类型、操作系统和浏览器信息。
怎么用
- 打开平台,选择算法(AES / LED / SM4)
- 输入密钥和明文(hex 格式)
- 配置故障:选轮次、位置、故障值、故障类型
- 点击"开始推导"
- 等待几秒,查看四栏结果:Normal Trace / Faulty Trace / Diff Trace / Properties
- 在 Properties 栏中,每条属性都有完整的公式推导和验证结论
如果不想自己填参数,可以点击"运行内置测试向量",系统会用标准测试数据跑一遍,验证算法实现的正确性。AES 用 FIPS 197 测试向量,LED 用 10 组标准测试向量,SM4 用国标测试向量。
访问地址
适用场景
- 硬件安全课程的故障注入实验辅助
- 分组密码差分故障分析的属性验证
- 密码学论文复现时的中间值校验
- 密码算法教学演示
- 故障注入工具链的验证环节
技术实现
- 前端:原生 HTML / CSS / JavaScript,无框架依赖
- 后端:Cloudflare Workers,全球边缘节点
- 存储:Cloudflare D1
- 公式渲染:KaTeX,学术论文风格的数学公式展示
- 安全:CSP、X-Frame-Options、反爬虫、限流、蜜罐、IP 哈希
平台的算法实现不依赖任何第三方密码学库。AES 的 SubBytes、ShiftRows、MixColumns、AddRoundKey 和密钥编排,LED 的 SubCells、ShiftRows、MixColumnsSerial 和 AddConstants,SM4 的 S-box、LLL 线性变换和密钥扩展------全部从标准定义出发独立实现,并通过内置测试向量校验。
写在最后
故障传播属性推导是差分故障分析中最基础也最容易出错的环节。一个字节的 GF(28)GF(2^8)GF(28) 乘法算错,整个推导链就废了。
这个平台的目标很简单:让你把精力放在分析上,而不是放在计算上。选好参数,点一下按钮,所有推导结果和验证结论都在屏幕上。如果某个属性标记为 Violated,你立刻知道哪一步的推导出了问题。
欢迎使用,也欢迎在留言板留下反馈。