第 23-2 篇:SM3 实现导读——填充、消息扩展、压缩轮
上一篇23-1《国密 SM3 与 KAT 红线——先有答案再写实现》下一篇第 23-3 篇篡改实验——改一个压缩常量看 KAT 怎么崩源码精读篇本文为源码/方法论精读无独立实测文中数字均引述仓库 docs 的板端实测记录。一句话导读SM3 实现导读沿 vllm_crypto.c 逐段精读填充、消息扩展 W 与 W′ 与 64 轮压缩轮把abc变 66c7f0f4 的过程讲成能复述的实现地图本篇属源码精读导览为下一篇篡改实验备好坐标。关键词SM3、实现导读、消息扩展、压缩轮、国密红线证明实现正确。这篇钻进vllm_crypto.c的 SM330–127 行逐段导读填充、消息扩展W 与 W、64 轮压缩。读完你就能回答SM3 为什么把 abc 变成 66c7f0f4…也能在下一篇文章里亲手改坏它。1. 知识点SM3 的三段式骨架SM3GB/T 32905-2016输出 256 位结构是 Merkle–Damgård消息按 512 位64 字节分组每组经一个 64 轮的压缩函数更新 8 个 32 位字的状态IV → 摘要。三段式① 填充消息尾补 0x80 若干 0x00 64 位大端总长使总长 ≡ 0 (mod 512) ② 消息扩展每 64 字节块展开成 W[0..67]再算 W[j]W[j]^W[j4]W[0..63] ③ 压缩64 轮用布尔函数 FF/GG、常量 Tj、置换 P0/P1 更新 a..h最后与旧状态异或设计上它和 SHA-256 同源但不同构布尔函数分两段前 16 轮异或型、后 48 轮多数/选择型常量也只有两个0x79cc4519 / 0x7a879d8a随轮数 Tj 左移 j 位参与。256 位安全性靠的就是这些非线性置换与 64 轮扩散。2. 对应代码vllm_crypto.c 逐段导读2.1 常量与置换33–43 行static const uint32_t SM3_IV[8] { 0x7380166f, 0x4914b2b9, … }; /* 标准初始状态 */ static inline uint32_t sm3_p0(uint32_t x) { return x ^ rotl32(x,9) ^ rotl32(x,17); } static inline uint32_t sm3_p1(uint32_t x) { return x ^ rotl32(x,15) ^ rotl32(x,23); }P1用于消息扩展P0用于每轮输出。23-1 篡改实验改的就是SM3_IV[0]——你现在知道它为什么能让所有摘要失效了。2.2 压缩函数消息扩展 64 轮45–78 行static void sm3_compress(uint32_t s[8], const uint8_t block[64]) { uint32_t w[68], wp[64]; for (int i 0; i 16; i) w[i] GET_U32_BE(block 4*i); /* 块拆 16 个字 */ for (int j 16; j 68; j) /* W 扩展到 68 */ w[j] sm3_p1(w[j-16] ^ w[j-9] ^ rotl32(w[j-3],15)) ^ rotl32(w[j-13],7) ^ w[j-6]; for (int j 0; j 64; j) wp[j] w[j] ^ w[j4]; /* W W^W[4] */ … 装载 a..h s[0..7] … for (int j 0; j 64; j) { uint32_t tj (j16) ? 0x79cc4519u : 0x7a879d8au; /* 两段常量 */ uint32_t ss1 rotl32(rotl32(a,12) e rotl32(tj, j), 7); uint32_t ss2 ss1 ^ rotl32(a, 12); … FF/GG 分段 … tt1/tt2 更新 … dc; crotl32(b,9); ba; att1; /* 循环移位寄存器 */ hg; grotl32(f,19); fe; esm3_p0(tt2); } s[0]^a; …; s[7]^h; /* 与旧状态异或 */ }导读要点W 扩展是向前看 16~1 字的线性反馈w[j-16]^w[j-9]^rotl(w[j-3],15)经 P1 再异或两路——这是把 16 个字搅成 68 个字的扩散引擎每轮只动 7 个寄存器a由 tt1 更新、e由 P0(tt2) 更新其余轮流左移——这就是一字之差64 轮后全盘皆变的结构原因对应 23-1 的雪崩实测FF/GG 的两段设计前 16 轮是线性异或后 48 轮是非线性多数/选择——与 SHA-256 相同思路非线性部分才是抗碰撞的主力。2.3 init/update/final长度计数与填充80–127 行void vc_sm3_update(vc_sm3_ctx *c, const void *p, size_t n) { c-n n; /* 累计字节数final 要算 64 位总长 */ while (n 0) { if (c-buflen 0 n 64) { sm3_compress(c-s, in); … } /* 整块直压 */ else { memcpy 余块进 c-buf … 满 64 再压 … } /* 分块缓冲 */ } } void vc_sm3_final(vc_sm3_ctx *c, uint8_t out[32]) { uint64_t bits c-n * 8; vc_sm3_update(c, \x80, 1); /* 补 0x80 */ while (c-buflen ! 56) vc_sm3_update(c, zero, 1); /* 补 0 直到余 8 字节 */ … 写入 64 位大端长度 … /* 再压最后一组 */ for (i8) PUT_U32_BE(c-s[i], out4*i); /* 状态 → 32 字节摘要 */ }23-1 的第三个向量abcd*16用 361 字节分两次喂专门测的就是这里c-n的 64 位累加在跨块 update 下不丢字节、填充正确落在 56 余数上。填充一个字节错位跨块消息就全错——而单块向量测不出来这就是 KAT 需要不同长度向量的原因。3. 改动后果代码走查式的如果实验本文没有新的板端实验——23-1 已跑过红线23-3 会跑篡改。这里只做纸面推演为 23-3 做铺垫你可以在读代码时验证问题 A把 w[j] 扩展式里的 rotl32(w[j-13],7) 的 7 改成 8 → 单块向量会不会错 → 会。消息扩展任何一位变W[68]/W[64] 全部改变64 轮全受影响。 问题 B把 FF/GG 的分段阈值 16 改成 15 → 只影响第 16 轮开始的非线性函数切换点 → 全向量错。 问题 C把 ss1 的 rotl32(…,7) 改成 6 → 每轮移位错 → 全错。推演的结论先行SM3 里没有任何可以随手改一处还不影响结果的常数。这不是巧合——密码原语就是设计成牵一发动全身。23-3 的实测只改一个 IV 字就让它全红正是这句话的量化版本。4. 学员调试任务A 档配合 23-3先按 2.1–2.3 在源码里标注 10 处红线位IV×8、常量×2、P0/P1、位移参数为 23-3 的篡改清单做准备。B 档纯读源码回答①sm3_compress结尾的s[i]^…76–77 行为什么是异或而不是赋值提示否则多块消息会丢失前块状态②vc_sm3_update里整块直压分支要求buflen0为什么这个前置条件能成立、省掉了 memcpy③c-n为什么必须是 64 位size_t在 32 位板会怎样预期输出一张标好 10 处红线位的 SM3 源码注释图能对任意一处说出改了它哪个 KAT 向量会先红。收尾本篇源码点名vllm_crypto.c常量 33–43、压缩 45–78、填充 107–120开源仓库Kestrel-LLM (Gitee)AGPL-3.0-or-later 或商业许可二选一下篇预告读完实现、标好红线位现在亲手改把压缩常量/IV 改 1重编 KAT看它怎么红——红线价值的可视化最后一课。

相关新闻

关键路径分析(拓扑排序进阶)解析

关键路径分析(拓扑排序进阶)解析

引言 很多同学学完拓扑排序,只会用它给活动排个先后次序。但工程里真正被追问的是另一件事:整个项目最早什么时候能干完?哪些活儿一天都拖不得? 前者是“最长路”,后者是“关键路径(Critical Path&#xf…

2026/10/1 2:44:43 阅读更多 →
检查存在,不等于检查在岗

检查存在,不等于检查在岗

检查存在,不等于检查在岗2026-09-26 工业上位机开发笔记 今天一整天的活,表面上是三件事,底下是同一句话: 一个检查有没有用,不看它「有没有」,看它「长在哪条路上、挂在什么上」。 一件是:有人…

2026/10/1 5:28:07 阅读更多 →
2026深度体验:我用豆包工作处理日常办公的真实感受

2026深度体验:我用豆包工作处理日常办公的真实感受

最近我一直在找能帮自己分担多步骤办公任务的AI工具,之前试过不少只能单次生成内容的AI,每次做完还要自己导文件、整理格式、同步到团队协作平台,来回折腾要花不少额外时间。上周和同部门的朋友吃饭,他说他们团队最近在用一款新的…

2026/9/30 13:11:20 阅读更多 →

最新新闻

Model-Optimizer:GPU大模型推理的跨层协同优化体系

Model-Optimizer:GPU大模型推理的跨层协同优化体系

1. “Model-Optimizer”不是工具名,而是工程共识的隐性代号在NVIDIA生态的实际落地现场,“Model-Optimizer”从来不是一个官方发布的独立软件产品——它没有GitHub仓库、没有PyPI包、没有安装命令pip install model-optimizer。但只要你参与过3个以上GPU…

2026/10/1 14:06:39 阅读更多 →
TensorFlow工业级应用核心:SavedModel、tf.function与GPU部署

TensorFlow工业级应用核心:SavedModel、tf.function与GPU部署

1. 这不是“又一个深度学习框架”:TensorFlow 的真实定位与误用重灾区 很多人第一次听说 TensorFlow,是在某篇“2024年最值得学的AI框架”榜单里,和 PyTorch 并列排在前两位;也有人是在安装失败后,对着满屏红色报错在 …

2026/10/1 14:06:39 阅读更多 →
WSL安装全指南:从零搭建Windows Linux子系统,解决卡顿与报错

WSL安装全指南:从零搭建Windows Linux子系统,解决卡顿与报错

很多人把 WSL 打成 WLS,连官方文档看到都会会心一笑。最近后台问“Windows上安装WSL”的朋友越来越多,有人是为了 Docker Desktop 换 WSL 后端,有人想在 Windows 里跑 Elasticsearch、Redis、binwalk 这类 Linux 工具链,也有人纯粹…

2026/10/1 14:06:39 阅读更多 →
动态路由与自适应编排:多Agent系统的关键设计

动态路由与自适应编排:多Agent系统的关键设计

Agent系列写到第9.3篇,聊一个几乎所有多Agent项目都绕不开的硬骨头:动态路由与自适应编排。很多刚接触Agent开发的朋友会把这两件事混为一谈,其实定位完全不同——路由解决的是“这个任务该交给谁”,编排解决的是“多个任务之间按…

2026/10/1 14:06:39 阅读更多 →
省际绿色金融评价中的神经网络建模:数据预处理与调参实战

省际绿色金融评价中的神经网络建模:数据预处理与调参实战

简介:基于神经网络模型的省际绿色金融评价研究是一份学术PDF论文,面向金融、经济与数据建模领域的研究者及高校师生,内容聚焦利用BP神经网络结合层次分析法评估各省绿色金融发展水平,可为改进传统评价方法、纳入环境与社会指标提供…

2026/10/1 14:06:39 阅读更多 →
Windows下.NET Framework 3.5安装失败:错误码分析与离线修复全攻略

Windows下.NET Framework 3.5安装失败:错误码分析与离线修复全攻略

说个很常见的场面:安装某款设计软件时弹窗提示需要.NET Framework 3.5,你去微软官网找独立安装包,双击后弹出“这台计算机中已经安装了 .NET Framework 4.8 或版本更高的更新”,然后你误以为老组件已经自带,结果软件照…

2026/10/1 14:05:39 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →