面向分组密码差分故障分析的属性推导与验证平台

为什么做这个平台

在分组密码的差分故障分析(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-128LED-64SM4 三种分组密码算法,提供完整的故障注入、执行轨迹记录、差分传播分析和数学属性推导功能。

用户只需指定密钥、明文和故障配置(故障轮次、位置、值、类型),系统会自动完成以下全部工作:

  1. 用正常密钥和明文执行一次完整加密,记录每一步的中间状态------这是 Normal Trace
  2. 在指定轮次注入故障后执行一次完整加密,记录每一步的中间状态------这是 Faulty Trace
  3. 逐步对比两条轨迹,计算每一步的差分值------这是 Diff Trace
  4. 对每一步运算,根据数学性质推导期望差分,与实际差分对比验证------这是 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:运算步骤名(如 afterSubBytesafterShiftRowsafterMixColumnsafterAddRoundKey
  • 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-subbytesled-s10-subcells
  • algorithm:算法名称
  • round:轮次
  • step:运算步骤
  • type:属性类型(linear 表示线性运算,nonlinear 表示非线性运算)
  • status:验证结论(satisfiedviolated
  • 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 为例的完整推导流程

  1. 从 Normal Trace 取第 5 轮 ShiftRows 后的状态:X=db 13 53 45 ...X = \texttt{db 13 53 45 \ldots}X=db 13 53 45 ...
  2. 从 Faulty Trace 取第 5 轮 ShiftRows 后的状态:X′=da 13 53 45 ...X' = \texttt{da 13 53 45 \ldots}X′=da 13 53 45 ...(第 0 字节不同)
  3. 计算输入差分:Δ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 ...
  4. 对第 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

  1. 期望输出差分第 0 列 =(0x02,0x01,0x01,0x03)= (0x02, 0x01, 0x01, 0x03)=(0x02,0x01,0x01,0x03)
  2. 从 Diff Trace 取实际输出差分第 0 列,与期望值逐字节对比
  3. 如果一致,标记为 Satisfied;如果不一致,标记为 Violated

整个过程在平台上自动完成,每一步都有数学公式和文字解释。

其他功能

Key Schedule 可视化

AES 的密钥编排完整展示 11 轮轮密钥(44 个 32 位字),每轮的生成公式都有数学公式展示。SM4 展示 32 个轮密钥及其生成过程。

十个密码分析小工具

平台提供十个独立工具,可以脱离主推导流程单独使用:

  1. S-box / InvS-box:AES、SM4、LED 三种算法的正向和逆向 S-box 查表,支持单个值查询和批量查询(输入一个 hex 串,自动拆分逐字节查表),附带二进制展示和验证状态
  2. XOR 运算:支持字节模式、半字节模式(LED 专用)和 32 位字模式(SM4 专用),严格对齐或左补零
  3. GF 有限域 :GF(28)GF(2^8)GF(28)(AES/SM4)和 GF(24)GF(2^4)GF(24)(LED)的乘法、求逆、xtime、幂运算,每一步都带详细计算过程
  4. AES MixColumns / InvMixColumns:输入 4 个字节,直接输出列混合结果,正向和逆向都支持
  5. LED MixColumnsSerial :LED 的 GF(24)GF(2^4)GF(24) 列混合运算
  6. SM4 L / L' 线性变换 :SM4 的 LLL 变换和逆 L′L'L′ 变换,输入 32 位字直接出结果
  7. 状态矩阵格式化 :将 hex 串格式化为 AES 4×44 \times 44×4 列优先矩阵、LED 4×44 \times 44×4 nibble 矩阵或 SM4 4 字矩阵,支持两个状态的差分矩阵对比
  8. Hamming Weight / Distance:汉明重量和汉明距离计算,拆分展示每个字节的 HW 值
  9. DDT 差分分布表:S-box 的差分分布表查询,支持单行查询(给定输入差分,输出所有可能的输出差分及其计数)和完整表格展示
  10. 位旋转与字节拆分:ROTL / ROTR,支持 8/16/32/64 位宽度,附带字节拆分展示

留言板

平台内置留言板,支持中英文用户名(包括中文字符),可以留下使用反馈、Bug 报告或学术讨论。留言会展示设备类型、操作系统和浏览器信息。

怎么用

  1. 打开平台,选择算法(AES / LED / SM4)
  2. 输入密钥和明文(hex 格式)
  3. 配置故障:选轮次、位置、故障值、故障类型
  4. 点击"开始推导"
  5. 等待几秒,查看四栏结果:Normal Trace / Faulty Trace / Diff Trace / Properties
  6. 在 Properties 栏中,每条属性都有完整的公式推导和验证结论

如果不想自己填参数,可以点击"运行内置测试向量",系统会用标准测试数据跑一遍,验证算法实现的正确性。AES 用 FIPS 197 测试向量,LED 用 10 组标准测试向量,SM4 用国标测试向量。

访问地址

https://crypto.hxorz.com

适用场景

  • 硬件安全课程的故障注入实验辅助
  • 分组密码差分故障分析的属性验证
  • 密码学论文复现时的中间值校验
  • 密码算法教学演示
  • 故障注入工具链的验证环节

技术实现

  • 前端:原生 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,你立刻知道哪一步的推导出了问题。

欢迎使用,也欢迎在留言板留下反馈。

相关推荐
大数据在线8 分钟前
布局Agentic AI,亚马逊云科技组合拳再升级
人工智能·openai·亚马逊云科技·智能体·agentic ai
8Qi81 小时前
回文子串(Palindromic Substrings)—— 题解
算法·leetcode·职场和发展·动态规划
皮皮学姐分享-ppx4 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
GIS数据转换器4 小时前
基于3D GIS的监控视频精准标定平台
人工智能·物联网·3d·音视频·无人机·知识图谱
专注VB编程开发20年4 小时前
AI 生成C# WinForm 窗体 = 目前就是垃圾
开发语言·人工智能·c#
深小乐4 小时前
Claude Fable5 尝鲜,效果挺不错
人工智能
Nayxxu5 小时前
Gemini + RAG 企业知识库教程:从文档切片到答案生成
运维·人工智能
冬奇Lab5 小时前
真正的 AI-Native Workflow 是什么?——四个判断测试
人工智能·agent
冬奇Lab5 小时前
每日一个开源项目(第128篇):Agent Skills - 给 AI 编程 Agent 装上工程纪律
人工智能·开源·资讯
Deepoch5 小时前
Deepoc VLA开发板:采摘机器人的环境鲁棒作业与不确定性应对
人工智能·机器人·采摘机器人·deepoc