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

为什么做这个平台

在分组密码的差分故障分析(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 国标 每种算法的实现都通过了内置测试向量的校验,确保加密结果与标准一致。 ![](https://i-blog.csdnimg.cn/img_convert/7da7cdef42cf90806165c9ef64d82131.png) ### 功能总览 本平台支持 **AES-128** 、**LED-64** 、**SM4** 三种分组密码算法,提供完整的故障注入、执行轨迹记录、差分传播分析和数学属性推导功能。 用户只需指定密钥、明文和故障配置(故障轮次、位置、值、类型),系统会自动完成以下全部工作: 1. 用正常密钥和明文执行一次完整加密,记录每一步的中间状态------这是 **Normal Trace** 2. 在指定轮次注入故障后执行一次完整加密,记录每一步的中间状态------这是 **Faulty Trace** 3. 逐步对比两条轨迹,计算每一步的差分值------这是 **Diff Trace** 4. 对每一步运算,根据数学性质推导期望差分,与实际差分对比验证------这是 **Properties** ![](https://i-blog.csdnimg.cn/img_convert/624ae75a230b92eb88d9c8cb9fadaa22.png) 下面逐一详细说明。 ### 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 轮结束,让你完整看到故障从注入点到密文的传播路径。 ![](https://i-blog.csdnimg.cn/img_convert/e15e0440063a74613bb0846e04226cc6.png) ### Properties:数学属性推导与验证 ![](https://i-blog.csdnimg.cn/img_convert/5a793474eecf5aef6eabb05f375078b9.png) 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 为例的完整推导流程 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 5. 期望输出差分第 0 列 =(0x02,0x01,0x01,0x03)= (0x02, 0x01, 0x01, 0x03)=(0x02,0x01,0x01,0x03) 6. 从 Diff Trace 取实际输出差分第 0 列,与期望值逐字节对比 7. 如果一致,标记为 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 位宽度,附带字节拆分展示 ![](https://i-blog.csdnimg.cn/img_convert/4b698d5675935ce8051822a35b24f8a0.png) #### 留言板 平台内置留言板,支持中英文用户名(包括中文字符),可以留下使用反馈、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,你立刻知道哪一步的推导出了问题。 欢迎使用,也欢迎在留言板留下反馈。

相关推荐
不知名的忻2 小时前
并查集(QuickUnion)
java·数据结构·算法·并查集
leo__5202 小时前
基于时延的麦克风声源定位 - C实现
c语言·开发语言·算法
CV-杨帆2 小时前
Gemma-4 模型部署全记录:从下载到对话(2B/4B)
人工智能
likerhood2 小时前
Java实现选择题选项乱序算法
java·开发语言·算法
卷Java2 小时前
MCP协议原理与实战:让大模型真正「能动」起来
人工智能·aigc
Captain_Data2 小时前
AI 12小时设计CPU完整解析:从219字到RISC-V内核的技术突破
人工智能·python·ai·大模型·芯片设计·risc-v
AI砖家2 小时前
解剖 Claude Code:如何搭建一个企业级的私有化 AI 编程助手
前端·人工智能·ai编程
小鱼~~2 小时前
最小二乘&均方误差MSE&平均绝对误差MAE
python·算法·机器学习
数智化精益手记局2 小时前
仓库安灯管理系统的异常响应机制:破解仓库安灯管理系统的跨部门协同难题
大数据·数据结构·人工智能·制造·精益工程