找回密码
 立即注册
首页 业界区 安全 Module-Lattice-Based Key-Encapsulation Mechanism Sta ...

Module-Lattice-Based Key-Encapsulation Mechanism Standard

嗣伐 前天 19:55
这份文档不是一篇普通的“探索性”研究论文,而是法律法规级别的技术标准。它是全球后量子密码迁移的最终指南
我们将把这份标准当作一篇“论文”来研读。
【论文(标准)档案】


  • 【标题】:FIPS 203: Module-Lattice-Based Key-Encapsulation Mechanism Standard (基于模格的密钥封装机制标准)
  • 【作者 / 机构】:NIST (美国国家标准与技术研究院)
  • 【年份】:2024年 8月 (正式版)
  • 【前身】:CRYSTALS-Kyber 算法(NIST PQC 竞赛获胜者)
一、整体导航

1. 这份标准“到底想解决什么问题”?


  • 终极目标:给全世界发一套“新锁”的图纸。
  • 背景:现在的互联网基石(RSA, Diffie-Hellman, ECC)都会被未来的量子计算机秒破。
  • 解决方案:NIST 选定了 ML-KEM (即 Kyber) 作为通用的“密钥交换”标准。以后你的浏览器、微信、银行卡都会用这个算法来协商密钥。
  • 位置:它是格密码理论落地的终点。之前的论文是“为什么这么做”,这份文档是“具体怎么做(精确到每一个比特)”。
  • 新在哪里:相比于学术论文的抽象描述,这里规定死了所有细节(模数 \(q\) 是 3329,多项式次数是 256,哈希用 SHA3 等)。它消除了所有歧义,保证不同厂家写的代码能互通。
2. 文字版路线图:这份文档怎么读?

这份标准写得非常像一本“操作手册”。

  • Section 1-2 (Introduction & Terms)【略读】。官样文章,定义术语(比如什么叫 MSB/LSB)。
  • Section 3 (General Purpose)【略读】。讲这个标准是干嘛的,稍微看看就好。
  • Section 4 (Algorithm Specifications) —— 【必须死磕】
  • 4.1 Parameters:定义了三种强度(512/768/1024)。
  • 4.2 Data Types:定义了怎么把数学上的“多项式”变成计算机里的“字节串”(ByteEncode/Decode)。这在写代码时最容易错
  • 4.3 Cryptographic Functions:规定了哈希函数用 SHA3 和 SHAKE。
  • Section 5 (Key Encapsulation Mechanism) —— 【核心中的核心】
  • 这里给出了 ML-KEM.KeyGen、Encaps、Decaps 的完整伪代码。这是你以后写代码或做 PPT 的直接依据。
  • Appendices (附录) —— 【甚至比正文还重要】
  • Appendix A (NTT)【必须死磕】。详细定义了数论变换(NTT)的公式和查找表。
  • Appendix C (Changes from Kyber)【必读】。如果你读过旧的 Kyber 论文,这里告诉你 NIST 改了什么(防止你踩坑)。
二、核心数学与概念拆解

在这份标准里,你会反复看到几个核心概念。
1. 环 \(R_q\) (Polynomial Ring)


  • 定义:\(R_q = \mathbb{Z}_q[X] / (X^{256} + 1)\)。
  • 教授直觉
  • 想象一个有 256 个格子的环形传送带
  • 每个格子里放一个整数(0 到 3328 之间)。
  • 两个传送带相乘(多项式乘法),里面的数字会发生复杂的混合(卷积)。
  • 作用:这是 ML-KEM 的数学舞台。所有的运算都在这个“传送带”上进行。
2. Module Lattice (模格)


  • 符号:\(k \times k\) 的矩阵,里面的元素是上面的“环”。
  • 教授直觉
  • 以前的格密码(LWE)是处理一堆整数
  • 现在的模格(ML-KEM)是处理一堆传送带(多项式)。
  • 作用:通过调整 \(k\) 的大小(2, 3, 4),我们可以像搭积木一样轻松调整安全性(ML-KEM-512 用 2 块,ML-KEM-1024 用 4 块)。
3. Compress / Decompress (压缩/解压)


  • 定义:\(x \mapsto \lceil (2^d / q) \cdot x \rfloor\)。
  • 教授直觉(舍入)
  • 我们算出来的数字是 0~3328 之间的精确值。
  • 但为了省流量,我不想发这么精确。比如数字是 1002,我就发“大约 1000”。
  • Compress 就是“丢弃低位”,只保留高位信息。
  • Decompress 就是接收方收到“大约 1000”,把它还原成标准刻度。
  • 代价:这会引入噪声!解密时必须容忍这个额外噪声。
4. ByteEncode / ByteDecode


  • 作用:连接“数学世界”和“计算机世界”。
  • 教授直觉
  • 数学家说:“这是一个多项式 \(f(x)\)”。
  • 程序员说:“这是一个 char 数组”。
  • 这两个函数规定了怎么把多项式的系数“塞”进字节数组里(比如低位在前还是高位在前)。这是工程实现中最容易出 Bug 的地方(大小端问题)。
三、关键算法的逐行解释

FIPS 203 不讲定理,只讲算法 (Algorithm)。最重要的是 Algorithm 16 (ML-KEM.Encaps)Algorithm 17 (ML-KEM.Decaps)
1. K-PKE (底层加密)


  • 人话总结:这是一个“不完美”的加密方案。它能加密,但如果坏人故意捣乱(发坏的密文),它可能会泄露私钥。
  • 核心逻辑
  • \(u = A^T r + e_1\) (掩盖随机数 \(r\))
  • \(v = t^T r + e_2 + \text{Message}\) (用 \(r\) 和公钥 \(t\) 掩盖消息)
  • 这里全都是多项式运算
2. ML-KEM (顶层封装)


  • 人话总结:给上面的 K-PKE 穿上一层“防弹衣”(Fujisaki-Okamoto 变换)。
  • 核心构造
  • Alice (KeyGen):生成公钥 \(ek\) 和私钥 \(dk\)。
  • Bob (Encaps)

  • 随机选一个种子 \(m\)。
  • 哈希 \(m\) 得到随机数 \(r\) 和共享密钥 \(K\)。
  • 用 \(r\) 和公钥 \(ek\) 加密 \(m\),得到密文 \(c\)。
  • 发给 Alice:密文 \(c\)。自己留着:\(K\)。


  • Alice (Decaps)

  • 解密 \(c\),得到种子 \(m'\)。
  • 【关键一步】再加密验证:Alice 假装自己是 Bob,用 \(m'\) 和 \(ek\) 重新算一遍密文 \(c'\)。
  • 比较:如果 \(c' == c\),说明 \(m'\) 是对的,输出 \(K\)。如果不一样,说明有人捣乱,输出一个垃圾随机数(隐式拒绝)。
四、方案流程的“白板级解释”

这是你 PPT 的核心页面。
KeyGen (生成钥匙)


  • Step 1: 生成随机矩阵 \(A\)(通过种子 \(\rho\) 扩展,省空间)。
  • Step 2: 生成秘密向量 \(s\) 和噪声向量 \(e\)。
  • Step 3: 算出公钥 \(t = As + e\)。
  • Output: 公钥 \((t, \rho)\),私钥 \(s\)。
Encaps (Bob 发起)


  • Step 1: 选个随机消息 \(m\)(32字节)。
  • Step 2: 把 \(m\) 和公钥哈希一下,生成 \((K, r)\)。\(K\) 是我们要用的密钥,\(r\) 是加密用的随机数。
  • Step 3: 运行 K-PKE 加密:\(c = \text{Encrypt}(m, \text{using } r)\)。
  • Output: 发送 \(c\),手里拿着 \(K\)。
Decaps (Alice 接收)


  • Step 1: 运行 K-PKE 解密:\(m' = \text{Decrypt}(c)\)。
  • Step 2: 自我怀疑:Alice 怀疑 \(c\) 是伪造的,于是她用 \(m'\) 重新生成 \(r'\),再重新加密得到 \(c'\)。
  • Step 3: 终极审判


  • 如果 \(c == c'\):成功!算出 \(K = \text{Hash}(m')\)。
  • 如果 \(c \neq c'\):失败!\(K = \text{Hash}(\text{随机垃圾})\)。(注意:这里不报错,只是默默给个错的 Key,让坏人摸不着头脑)
PPT 核心页


  • 页1:ML-KEM 的整体架构图(Alice 和 Bob 的交互)。
  • 页2:Decaps 中的 Re-encryption Check (再加密检查)。这是防备“选择密文攻击”的关键,必须讲清楚。
五、安全性与参数分析(重点)

1. 安全性基于哪个格问题?


  • ML-LWE (Module Learning With Errors)
  • 直觉:给你一堆 \(As + e\),让你求 \(s\)。因为有噪声 \(e\) 的干扰,这在数学上极难。
2. 攻击模型


  • IND-CCA2:最强安全模型。假设攻击者不仅能看密文,还能拿着任意密文找你解密(除了目标密文)。FIPS 203 通过 FO 变换 完美防御了这一点。
3.

参数集 (Parameter Sets)

  • ML-KEM-512 (\(k=2\)):相当于 AES-128 安全性。最快,密文最小。
  • ML-KEM-768 (\(k=3\)):相当于 AES-192。NIST 推荐的默认配置
  • ML-KEM-1024 (\(k=4\)):相当于 AES-256。最安全,但最慢,密文最大。
4. 为什么会有“解密失败”?


  • LWE 本质上是基于噪声的。如果噪声太大(运气极差),或者压缩(Compress)丢掉的信息太多,解密出来的 \(m'\) 就会错一位。
  • 概率:FIPS 203 精心挑选了参数,让这个概率低到忽略不计(比如 \(2^{-139}\)),实际上几百年也不会遇到一次。
六、与相关工作的对比

1. 经典对比

| 维度 | ML-KEM (Kyber) | RSA / ECC | 纯 LWE (FrodoKEM) |
|  |  |  |  |
| 抗量子 | ✅ 是 | ❌ 否 (Shor 算法秒杀) | ✅ 是 |
| 数学结构 | 模格 (Module) | 大数分解 / 离散对数 | 非结构化格 |
| 速度 | 极快 (比 ECC 还快) | 慢 | 较慢 |
| 公钥大小 | 中等 (~1KB) | 小 (ECC ~32B) | 巨大 (~10KB+) |
| 安全性风险 | 代数结构可能被利用 (微小风险) | 已被量子攻破 | 最安全 (保守) |
2. 导师最可能问你的 5 个问题


  • Q: 为什么 NIST 选了 Kyber (ML-KEM) 而不是 NTRU?


  • A: Kyber 在速度、公钥大小和密文大小之间取得了最好的平衡。NTRU 虽然历史悠久,但实现起来比较复杂,且在某些参数下不如 Kyber 高效。

  • Q: FIPS 203 和原始的 Kyber 论文有什么区别?


  • A: 主要是细节微调。比如随机数生成时的哈希方式变了(去掉了 Hash(m) 的预处理,因为现在的随机数生成器够好了),还有一些字节序的明确规定。核心算法没变。(参考 Appendix C)

  • Q: NTT 是干什么用的?必须用吗?


  • A: NTT 是为了加速多项式乘法。把 \(O(n^2)\) 的复杂度降到 \(O(n \log n)\)。在 FIPS 203 中,NTT 不仅是优化,它定义了数据的存储格式,所以必须用,否则互通不了。

  • Q: 解密失败会影响安全性吗?


  • A: 理论上会有极微小的“攻击面”(Decryption Failure Attack),但对于 ML-KEM 的参数,失败率低至 \(2^{-100}\) 以下,实际攻击是不可能的。

  • Q: 这个算法能用来做数字签名吗?


  • A: 不能。这是 KEM(密钥封装)。签名要用 ML-DSA (Dilithium),它是 FIPS 204 标准。两者的数学地基类似,但构造完全不同。
七、汇报与复现导向总结

1. 核心 Takeaway (一句话总结)

FIPS 203 (ML-KEM) 是基于 Module-LWE 困难问题的后量子密钥封装标准,它利用 NTT 加速运算,利用 FO 变换 保证 CCA 安全性,是未来几十年保护互联网通信安全的“新金钟罩”。
2. 值得做后续研究吗?


  • 算法设计层面:不值得。标准已定,乱改参数就是不兼容。
  • 应用与实现层面非常值得
  • 侧信道分析非常值得
3. 创新方向


  • 硬件加速:在 FPGA 或嵌入式设备(如 ARM Cortex-M4)上实现 ML-KEM 的极致优化。
  • 侧信道攻击与防御:研究 ML-KEM 的解密过程(特别是比较 \(c\) 和 \(c'\) 的那一步)会不会通过功耗或时间泄露信息?设计抗侧信道的实现。
  • 混合模式:设计一套协议,同时使用 ECC 和 ML-KEM。如果 ML-KEM 被破了,还有 ECC 顶着;如果 ECC 被量子破了,有 ML-KEM 顶着。这是目前工业界最需要的过渡方案。
严格对齐原文精读“1. Introduction”,“2. Terms, Acronyms, and Notation”

Section 1. Introduction (引言)

这一章主要回答:我们为什么要折腾这个新标准?
1. 逐行精读与直觉拆解

原文片段"...quantum computers... would be able to break many of the public-key cryptosystems currently in use..."
原文片段"...Shor's algorithm... would break the RSA, Diffie-Hellman, and Elliptic Curve Cryptography..."


  • 教授直觉
  • 现在的互联网安全(银行卡、微信、HTTPS)是建立在三个“老家伙”身上的:RSA、Diffie-Hellman 和 ECC。
  • 它们之所以安全,是因为“分解大整数”或者“求离散对数”很难。这就像是用一把复杂的物理锁。
  • 量子计算机(Shor 算法)就像是一把万能激光切割刀。一旦这把刀造出来(足够大的量子计算机),以前的锁瞬间就废了。
  • 所以,我们需要换一种锁,这种锁连激光刀都切不开。这就是 PQC(后量子密码)
原文片段"NIST initiated a public process to select quantum-resistant public-key cryptographic algorithms..."
原文片段"...NIST selected the CRYSTALS-KYBER algorithm..."


  • 教授直觉
  • 2016年,NIST 发了个“英雄帖”,向全世界征集新锁的设计图。
  • 经过 6 年的残酷淘汰赛(从 82 个打到只剩几个),CRYSTALS-Kyber 赢了。
  • FIPS 203 就是 Kyber 的“官方转正版”。以后政府、企业都要用这个版本,不能乱改。
原文片段"This standard specifies a key-encapsulation mechanism (KEM)..."
原文片段"A KEM is a set of algorithms that... can be used to establish a shared secret key..."


  • 核心定义:KEM (密钥封装机制)
  • 教授直觉(重点!)
  • 很多人以为这是“加密”。错! KEM 的目的不是为了传一篇长长的文章。
  • KEM 的目的是:Alice 和 Bob 如何在不安全的网络上,协商出一个“只有他俩知道的密码(Shared Secret)”
  • 一旦协商出这个密码(比如一个 32 字节的随机数),他们就可以用这个密码配合 AES(对称加密)去传那篇长文章了。
  • 比喻:KEM 就像是用来寄送保险箱钥匙的特殊信封。你不用这个信封寄信,你只用它寄钥匙。
2. 常见误解


  • 误解 1:“FIPS 203 能加密我的照片。”
  • 纠正:不能直接加密。它只能帮你和接收方协商出一个密钥,然后你们用这个密钥去加密照片(通常用 AES)。
  • 误解 2:“Kyber 和 FIPS 203 是一模一样的。”
  • 纠正99% 一样,但有微调。NIST 为了工程实现的安全性,修改了一些细节(比如哈希函数的使用方式)。写代码时必须看 FIPS 203,不能只看 Kyber 的旧论文。
3. 整节总结


  • 背景:量子计算机要来了,RSA 这种老锁不安全了。
  • 方案:NIST 选了 ML-KEM (即 Kyber) 作为新一代的“寄钥匙”标准。
  • 定位:这是用于密钥交换的标准,不是直接用于数据加密或数字签名的。
4. 展望创新


  • 混合模式 (Hybrid Mode):在未来很长一段时间,我们不敢完全抛弃 RSA/ECC。现在的创新方向是设计“双保险”协议:同时跑 ECC 和 ML-KEM。坏人必须同时破解这两种锁才能进来。
Section 2. Terms, Acronyms, and Notation (术语、缩写与符号)

这一章是“游戏操作说明书”。如果你数学基础弱,这一节是必须死磕的。所有的魔法符号都在这里定义。
1. 基础数据类型

原文概念Byte (字节)
定义:A sequence of eight bits.


  • 直觉:计算机里的最小存储单位。一个整数可能要占好几个字节。
原文概念Little-Endian (小端序)
定义:The ordering of bytes... where the least significant byte is the first byte...


  • 教授直觉(易错点!)
  • 假设有一个数字:258。十六进制是 0x0102。
  • 大端序(符合人类直觉):先存 01,再存 02。
  • 小端序(反直觉):先存 02(最小的那头),再存 01。
  • FIPS 203 强制使用小端序。你在写代码把数学多项式转成字节串时,必须倒着塞
2. 算法相关的符号

符号:\(x \leftarrow S\)
含义:Sample \(x\) uniformly at random from set \(S\).


  • 直觉抽奖。\(S\) 是一个箱子,里面有很多球。这句话的意思是“闭着眼睛随便摸一个球出来,叫它 \(x\)”。
  • 格密码的关键:安全性全靠这个“随机性”。如果你的“抽奖”不均匀(比如总是摸到上面的球),私钥就泄露了。
符号:\(y \leftarrow \mathcal{A}(x)\)
含义:Algorithm \(\mathcal{A}\) on input \(x\) outputs \(y\).


  • 直觉:这是一个随机函数。比如你输入 \(x\),它可能输出 \(y\),也可能输出 \(y'\)。这表示算法内部有掷骰子的步骤。
3. 数学空间的符号(最难啃的骨头)

这里我们要建立格密码的世界观
符号:\(\mathbb{Z}\) 和 \(\mathbb{Z}_q\)
含义:Integers and Integers modulo \(q\).


  • 教授直觉
  • \(\mathbb{Z}\) 是所有整数。
  • \(\mathbb{Z}_q\) 是“时钟数学”
  • 假设 \(q=12\)。那么 \(11+2\) 不等于 13,而是等于 1。
  • 在 ML-KEM 中,\(q = 3329\)。这是个死数字,记住它。所有的运算结果如果超过 3329,都要减去 3329;如果是负数,要加上 3329。
符号:\(R_q\)
定义:Ring of polynomials... modulo \(X^n + 1\) with coefficients in \(\mathbb{Z}_q\).


  • 教授直觉(核心中的核心!)
  • 这是 ML-KEM 的基本粒子
  • 想象一个长度为 256 的数组(因为 \(n=256\))。
  • 数组里的每个格子,都只能放一个 \(0\) 到 \(3328\) 之间的整数(因为在 \(\mathbb{Z}_q\) 上)。
  • 加法:两个数组对应位置相加(记得模 \(q\))。
  • 乘法:这最难。它不是对应位置相乘,而是多项式乘法(卷积)。乘完之后,如果次数超过了 256,要根据规则 \(X^n = -1\) 绕回来。
  • 比喻:\(R_q\) 就像是一个有 256 个齿轮的复杂机器
符号:\(\mathbf{v}\) (Bold lower case) 和 \(\mathbf{A}\) (Bold upper case)
含义:Vector and Matrix over \(R_q\).


  • 教授直觉
  • \(\mathbf{v}\) (向量):一竖排的 \(R_q\)。也就是一竖排的数组。这叫“模格”(Module Lattice)的由来。它不是一排数字,而是一排“多项式”。
  • \(\mathbf{A}\) (矩阵):一个方阵,里面的每个元素都是一个 \(R_q\) 多项式。
  • 运算:矩阵乘向量,规则和线性代数一样,只是里面的“乘法”变成了上面的多项式乘法。
符号:\(\lceil x \rfloor\)
含义:Rounding to the nearest integer.


  • 直觉四舍五入。这是引入“噪声”或“压缩”的关键步骤。
4. 常见误解


  • 误解 1:看到 \(X^n+1\) 以为要解方程。
  • 纠正:不用解。这只是一个“归约规则”。它告诉你当你做乘法产生 \(X^{256}\) 时,把它换成 \(-1\);产生 \(X^{257}\) 时,换成 \(-X\)。仅此而已。
  • 误解 2:混淆 \(x \leftarrow S\) 和普通赋值。
  • 纠正:一定要意识到这是随机采样。在密码学里,随机数生成器(RNG)的质量决定生死。
5. 整节总结

这一节定义了我们在 ML-KEM 中使用的语言:

  • 数字世界:我们生活在 \(q=3329\) 的时钟世界里。
  • 基本对象:\(R_q\),即长度为 256 的多项式(数组)。
  • 结构:由 \(R_q\) 组成的向量 \(\mathbf{v}\) 和矩阵 \(\mathbf{A}\)。
  • 规则:小端序存储,均匀随机采样。
6. 展望创新


  • 硬件优化:由于 \(R_q\) 上的乘法(多项式乘法)非常慢,现代 CPU 和硬件加速器(FPGA)都在研究如何利用 NTT(数论变换) 来加速这个过程。NTT 本质上是把多项式乘法变成了点乘,速度快几十倍。这是工程实现中最卷的赛道。
下一步学习建议

现在的你,已经拿到了进入格密码世界的“通行证”。

  • 你知道了我们要做什么(KEM,协商密钥)。
  • 你知道了我们的数学工具(3329 模数,多项式环,矩阵)。
下一站(Section 3 & 4),我们将进入真正的算法流程:看看这些矩阵和多项式是如何通过加加减减,神奇地把一个密钥从 Alice 传给 Bob 的。
严格对齐原文精读“3. Overview of the ML-KEM Scheme”

今天我们要精读的是 FIPS 203 的第 3 章:Overview of the ML-KEM Scheme(ML-KEM 方案概览)
如果说前两章是“字典”和“背景介绍”,那么第 3 章就是这座大厦的“建筑蓝图”。这一章不讲具体的数学公式(那是第 4 章的噩梦),而是从宏观上告诉你:这个算法由哪几部分组成?它的安全性由什么保证?它有哪几种规格?
3.1 IND-CCA2 Security (IND-CCA2 安全性)

这一节虽然短,但全是密码学的黑话。如果不理解它,你就不知道为什么 ML-KEM 这么设计。
1. 逐行精读与直觉

原文ML-KEM is an IND-CCA2 secure KEM...
原文...standard security notion for KEMs...


  • 概念拆解:IND-CCA2
  • 全称:Indistinguishability under Adaptive Chosen Ciphertext Attack(适应性选择密文攻击下的不可区分性)。
  • 教授直觉(重点)
  • IND (不可区分性):这是密码学的及格线。即使攻击者截获了密文,他也分不清这个密文里装的是“消息A”还是“消息B”。这就好比你看着两个一模一样的快递盒子,分不清哪个里面装的是苹果,哪个是梨。
  • CCA2 (选择密文攻击):这是最强的攻击模式。想象攻击者是一个极为狡猾的“捣乱者”。他不仅能看密文,他还能拿着自己伪造的密文去骚扰 Alice(解密者)
  • 场景:攻击者发给 Alice 一个坏掉的密文,观察 Alice 的反应(是报错?是变慢?还是解出一堆乱码?)。通过 Alice 的反应,攻击者试图推断出私钥的一点点信息。试它一万次,私钥可能就漏光了。
  • 结论:IND-CCA2 安全意味着,哪怕攻击者拥有这种“骚扰并观察反应”的能力,他也依然破解不了你的密文。
原文...constructed from an IND-CPA secure public-key encryption scheme... by applying a slight variation of the Fujisaki-Okamoto (FO) transform.


  • 概念拆解:FO 变换 (Fujisaki-Okamoto Transform)
  • 教授直觉
  • FIPS 203 的核心其实分为两层。
  • 内层(K-PKE):像一个玻璃做的保险箱。它能锁住秘密,但很脆。如果你拿锤子(CCA 攻击)敲它,或者往锁孔里塞口香糖,它可能会裂开缝隙泄露秘密。这叫 IND-CPA 安全(仅防偷窥,不防捣乱)。
  • 外层(FO 变换):为了保护这个玻璃箱,我们给它套上了一层钛合金防弹衣
  • FO 变换的原理(核心逻辑)

  • Alice 收到密文。
  • Alice 先用私钥解开密文,拿到消息 \(m'\)。
  • (关键一步) Alice 怀疑这个密文是假的。于是她假装自己是发件人,用拿到的 \(m'\) 和公钥,重新加密一遍,生成新密文 \(c'\)。
  • 比对:Alice 比较收到的密文 \(c\) 和新生成的 \(c'\)。


  • 如果一样:说明没问题,这是好人发的。
  • 如果不一样:说明有人篡改了密文!Alice 立刻扔掉结果,不告诉攻击者任何有用信息。
2. 常见误解


  • 误解:“只要数学难题(如 LWE)解不开,算法就是安全的。”
  • 纠正:大错特错!数学难题只保证了内层(玻璃箱)的安全性。如果没有外层(FO 变换)的处理逻辑,攻击者不需要解数学题,只需要通过“发坏密文”搞侧信道攻击就能破解。工程结构和数学基石同等重要。
3.2 ML-KEM Parameter Sets (参数集)

这一节定义了 ML-KEM 的“衣服尺码”。
1. 逐行精读与直觉

原文This standard defines three parameter sets... ML-KEM-512, ML-KEM-768, and ML-KEM-1024.


  • 教授直觉
  • 这就是大中小三个号的 T恤。
  • ML-KEM-512 (Small):速度最快,密文最小。
  • ML-KEM-768 (Medium)NIST 推荐的标准款。平衡了安全和速度。
  • ML-KEM-1024 (Large):最安全,但最慢,密文最大。除非你极度偏执,否则很少用。
原文...security categories 1, 3, and 5, respectively.


  • 概念拆解:Security Categories (安全等级)
  • Category 1:相当于 AES-128 的破解难度。也就是“即使你有量子计算机,暴力破解它的难度也和破解 AES-128 一样”。
  • Category 3:相当于 AES-192
  • Category 5:相当于 AES-256
  • 直觉:AES-128 目前被认为是绝对安全的。所以 ML-KEM-512 其实已经非常安全了。NIST 推荐 768 只是为了留足余量(Margin of Safety)。
2. 核心数学直觉:为什么会有三个等级?


  • 这里的数字 512, 768, 1024 实际上对应的是矩阵的维度
  • 回忆一下上一节讲的 \(k \times k\) 矩阵:
  • ML-KEM-512:对应 \(k=2\)。你需要解一个 2 元方程组。
  • ML-KEM-768:对应 \(k=3\)。你需要解一个 3 元方程组。
  • ML-KEM-1024:对应 \(k=4\)。你需要解一个 4 元方程组。
  • 直觉:未知数越多(\(k\) 越大),方程组越复杂,把它们还原出来(破解私钥)就越难。但同时,你需要传输的数据(公钥和密文)也就越多。
3.3 ML-KEM Algorithm Specifications (算法规格)

这一节给出了整个系统的操作流程图
1. 逐行精读与直觉

原文ML-KEM.KeyGen(): ... generates an encapsulation key \(ek\) and a decapsulation key \(dk\).


  • 1. KeyGen (生成钥匙)
  • 操作:Alice 在本地运行。
  • 产出
  • \(ek\) (Encapsulation Key):这就是公钥。Alice 把它发给全世界。
  • \(dk\) (Decapsulation Key):这就是私钥。Alice 把它藏在床底下。
原文ML-KEM.Encaps(\(ek\)): ... uses the encapsulation key \(ek\) to generate a shared secret key \(K\) and a ciphertext \(c\)...


  • 2. Encaps (封装 - Bob 的操作)
  • 直觉(最易混淆点!)
  • 在传统的加密(PKE)中,是 Bob 想好了消息,然后加密。
  • KEM 中,Bob 不自己想消息。
  • 流程

  • Bob 掷骰子,生成一个随机数 \(m\)。
  • Bob 把 \(m\) 和 Alice 的公钥 \(ek\) 搅在一起,算出两样东西:


  • \(K\) (Shared Secret):这就是我们要的“共享密码”。
  • \(c\) (Ciphertext):这是“包着 \(m\) 的快递盒”。
  • Bob 把 \(c\) 发给 Alice,自己手里留着 \(K\)。
原文ML-KEM.Decaps(\(c, dk\)): ... uses the decapsulation key \(dk\) to recover the shared secret key \(K\).


  • 3. Decaps (解封装 - Alice 的操作)
  • 操作:Alice 收到 \(c\)。
  • 流程

  • Alice 用私钥 \(dk\) 打开盒子 \(c\),拿出里面的随机数 \(m\)。
  • Alice 按照同样的规则,用 \(m\) 算出 \(K\)


  • 结果:现在 Alice 和 Bob 手里都有了一模一样的 \(K\)。接下来他们就可以用这个 \(K\) 去聊微信了。
2. 关键细节:隐式拒绝 (Implicit Rejection)

原文If decryption fails... Decaps returns a "garbage" key...


  • 教授直觉
  • 如果在解密过程中,Alice 发现(通过 FO 变换)密文是被篡改过的,她绝不会报错说“解密失败”。
  • 为什么? 因为“报错”本身就是一种信息泄露。攻击者会想:“哦,这个包报错了,说明我改的那一位很重要。”
  • 做法:Alice 装傻。她会不动声色地生成一个完全随机的垃圾密钥 \(K_{garbage}\),然后当作什么都没发生一样继续运行。
  • 后果:Bob 用真 \(K\) 发消息,Alice 用假 \(K_{garbage}\) 解密,结果是一堆乱码。连接断开。攻击者一脸懵逼,不知道是哪一步出了问题。这叫“死得不明不白”
整节总结 (Section 3)

如果让你在组会上做汇报,这一页 PPT 应该这么写:

  • 安全模型:ML-KEM 是 IND-CCA2 安全的。它通过 Fujisaki-Okamoto (FO) 变换,给底层的数学难题(IND-CPA)穿上了一层防弹衣,能抵御主动攻击。
  • 三种规格


  • 512 (\(k=2\)):轻量级,AES-128 强度。
  • 768 (\(k=3\))标准级,AES-192 强度。
  • 1024 (\(k=4\)):偏执级,AES-256 强度。
  • 这里的 \(k\) 代表模格的维度(矩阵大小)。

  • 三大步骤


  • KeyGen:Alice 生成公钥 \(ek\) 和私钥 \(dk\)。
  • Encaps:Bob 生成随机共享密钥 \(K\) 和密文 \(c\)。
  • Decaps:Alice 从 \(c\) 中恢复 \(K\)。
  • 特性:采用“隐式拒绝”,遇到攻击不报错,只返回垃圾值。
展望创新


  • 侧信道攻击 (Side-Channel Attacks)


  • 虽然 FO 变换在逻辑上防住了 CCA 攻击,但并没有防住物理泄露
  • 思路:在 Alice 做“再加密检查”(Re-encryption)的那一步,CPU 的功耗或运行时间会不会泄露 \(m\)?这是目前最火的攻击方向。

  • 故障注入 (Fault Injection)


  • 如果攻击者用激光照射芯片,让 Alice 在做比较(\(c == c'\))时跳过了检查指令,会发生什么?
  • 思路:如何设计硬件电路,使得这种比较操作即使被干扰也能保持安全?

  • 参数的灵活性


  • 标准定了 \(k=2,3,4\)。有没有可能设计一种 \(k\) 可以动态调整的变体,适应极度受限的物联网设备?
严格对齐原文精读“4. Auxiliary Algorithms”

如果说第 3 章是“建筑蓝图”,那么 FIPS 203 的第 4 章:Auxiliary Algorithms(辅助算法) 就是我们的“备菜环节”
在真正开始炒菜(加密/解密)之前,我们需要把肉切成丝,把菜洗净,把调料配好。第 4 章就在定义这些基础工具

  • 参数(Parameters):规定了我们的世界有多大。
  • 数据转换(Data Conversions):数学家用的“数字”和计算机用的“字节”怎么互转。
  • 密码学函数(Cryptographic Functions):哈希和随机数生成器怎么用。
这一章看似琐碎,却是写代码时 Bug 最多的地方。如果不把这里的“字节序(Endianness)”或“压缩公式”搞对,你的程序跟别人的永远通不上。
4.1 Parameters (参数)

这一节规定了 ML-KEM 这个“宇宙”的物理常数。
1. 逐行精读与直觉

原文:$$q = 3329


  • 直觉:这是我们的“时钟刻度”
  • 所有的加减乘除,一旦超过 3329,就要转圈回来。
  • 为什么是 3329?
  • 它是一个质数。
  • \(3329 = 13 \times 256 + 1\)。这意味着它满足 \(q \equiv 1 \pmod{256}\)。
  • 关键点:这个性质允许我们在 256 维的多项式上使用 NTT(数论变换) 来极速计算乘法。没有这个 \(q\),Kyber 就会慢得像蜗牛。
原文:$$n = 256


  • 直觉:这是多项式的“长度”
  • 每个多项式有 256 个系数(\(a_0, a_1, \dots, a_{255}\))。
  • 为什么是 256? 它是 2 的幂,最适合计算机处理,也正好匹配 NTT 的需求。
原文Three parameter sets: ML-KEM-512, ML-KEM-768, ML-KEM-1024


  • 直觉:这是矩阵的大小 \(k\)。
  • 512: \(k=2\) (2x2 的矩阵)
  • 768: \(k=3\) (3x3 的矩阵)
  • 1024: \(k=4\) (4x4 的矩阵)
  • 这就是安全等级的调节旋钮
4.2 Data Types and Conversions (数据类型与转换)

这是最硬核、最容易晕的部分。我们需要在“抽象数学”和“物理字节”之间架桥。
1. ByteEncode / ByteDecode (字节编码/解码)

原文Algorithms to convert between a sequence of integers... and a byte array.
公式:涉及复杂的位移操作(bit-shifting)。


  • 教授直觉(打包行李)
  • 场景:在数学世界里,我们的数字是 \(0\) 到 \(3328\)(需要 12 个比特才能存下)。但在计算机里,最小单位是字节(8 个比特)。
  • 问题:如果我直接存,每个数字用 2 个字节(16比特),那就浪费了 4 个比特的空间。
  • ByteEncode:这就是“压缩打包”。它把 2 个 12-bit 的数字(共 24 bits),硬挤进 3 个 8-bit 的字节里。一点缝隙都不留。
  • 关键细节(Little-Endian):FIPS 203 规定了“小端序”。意思是:低位先走。这就像吃鱼,先吃尾巴再吃头。写代码如果反了,全盘皆输。
2. Compress / Decompress (压缩/解压)

原文Compress_d(x) = \(\lceil (2^d / q) \cdot x \rfloor \pmod{2^d}\)
原文Decompress_d(y) = \(\lceil (q / 2^d) \cdot y \rfloor\)


  • 教授直觉(有损压缩)
  • 场景:我们算出来的密文,每个系数是 \(0 \sim 3328\)。
  • 问题:为了省流量,我想把数字变小一点。比如,我不想汇报精确的“3329分钟”,我只想汇报“几点钟”(刻度变粗)。
  • Compress (压缩):把 \(0 \sim 3328\) 映射到更小的范围(比如 \(0 \sim 15\) 或 \(0 \sim 1\))。
  • 比如 \(d=1\):把 \(0 \sim 1664\) 变成 0,把 \(1665 \sim 3328\) 变成 1。
  • Decompress (解压):把变小的数字还原回去。
  • 注意:回不去了! 0 变回 0,1 变回 1665。中间的精度丢失了。
  • 代价:这就是“噪声”的来源之一!解密时必须能容忍这种“四舍五入”带来的误差。
4.3 Cryptographic Functions (密码学函数)

这一节规定了随机数和哈希怎么算。
1. PRF and XOF (伪随机函数与扩展输出函数)

原文Use SHAKE-128 and SHAKE-256...


  • 教授直觉(无限长的卷尺)
  • PRF (伪随机函数):给它一个短种子(Seed)和一个计数器(Nonce),它吐出一串固定的随机数。
  • 用途:用来生成噪声向量 \(e\)。
  • XOF (可扩展输出函数):给它一个种子,它可以无限吐出随机字节,要多少给多少。
  • 用途:用来生成巨大的公共矩阵 \(A\)。因为矩阵很大,需要很多随机字节。
  • 为什么不用 rand()?:因为我们需要“确定性”。Alice 和 Bob 必须能通过同一个种子算出同样的一串乱码。
2. Hash Functions (哈希函数 G, H, J)

原文G(c) = SHA3-512(c)
原文H(c) = SHA3-256(c)
原文J(c) = SHAKE-256(c, 32)


  • 教授直觉(专用标签)
  • 虽然底层用的都是 SHA3 家族,但标准给它们起了不同的名字 \(G, H, J\)。
  • 用途
  • \(G\):用于生成共享密钥。
  • \(H\):用于哈希消息和公钥(指纹)。
  • \(J\):用于从种子生成随机数。
  • Domain Separation (域分离):这是为了防止混淆。就像厨房里,切肉的刀和切水果的刀要分开,虽然它们都能切东西。
常见误解


  • 误解:“Compress 和 ByteEncode 是一回事。”


  • 纠正:完全不同!
  • Compress数学上的数值改变(丢弃精度,把 3000 变成 1)。
  • ByteEncode计算机存储格式的改变(把整数变成字节流,数值没变)。

  • 误解:“随机数是真随机的。”


  • 纠正:在算法内部运算时,全是伪随机(由 Seed 派生)。只有最开始的 Seed 是需要真随机生成的。

  • 误解:“\(q=3329\) 可以随便改。”


  • 纠正:牵一发而动全身。改了 \(q\),NTT 算法就失效了,压缩公式也要改。
整节总结 (Section 4)

这章是 ML-KEM 的工具箱

  • 参数:\(q=3329\) 是为了 NTT,\(n=256\) 是为了平衡效率。
  • 数据转换


  • ByteEncode:把数学家用的 12-bit 整数紧凑地打包成程序员用的 8-bit 字节。
  • Compress:主动丢弃精度,以减小密文大小(引入噪声)。

  • 密码函数:使用 SHA3 和 SHAKE 来保证随机数生成的确定性和安全性。
展望创新


  • 硬件加速
  • ByteEncode 这种位操作(Bit-shifting)在通用 CPU 上很慢。如果在 FPGA 或专用芯片上设计专用电路,可以由“几百个时钟周期”变成“1 个周期”。这是硬件工程师的黄金机会。
  • 压缩算法优化
  • 现在的 Compress 是简单的线性量化。有没有可能针对 LWE 噪声的高斯分布特性,设计非线性压缩?在不增加解密失败率的前提下,进一步减小密文大小?
教授的叮嘱
我知道这一章很琐碎,全是 >> 8, & 0xFF 这种代码级的细节。但请务必在纸上画一画“怎么把 2 个 12-bit 数塞进 3 个字节”。弄懂了这个,你离写出自己的 ML-KEM 就只差一步了!
严格对齐原文精读“5. The K-PKE Component Scheme”

今天我们要拆解的是 FIPS 203 的第 5 章:The K-PKE Component Scheme
如果把 ML-KEM 比作一个精密的保险箱,那么第 5 章就是在制造这个保险箱的锁芯
这个锁芯(K-PKE)本身能完成“加密”和“解密”的功能,但它还不够结实(只满足 CPA 安全,防不住主动攻击)。第 7 章会给它装上外壳(FO 变换)变成最终的成品。
但你必须先懂锁芯怎么转,才能懂锁怎么开。准备好,我们要进入带有噪声的线性代数世界了。
5.1 K-PKE Key Generation (密钥生成)

这一节讲述如何制造公钥和私钥。
1. 逐行精读与直觉

原文The decryption key ... is a length-k vector s ... the encryption key is a collection of "noisy" linear equations \((A, As + e)\).


  • 直觉(黄金方程)
  • 格密码的公钥结构几乎都长这样:\(t = As + e\)
  • \(A\) (公共矩阵):一个巨大的、公开的随机矩阵。你可以把它想象成“谜题的题干”
  • \(s\) (私钥):一个秘密向量。这是“标准答案”
  • \(e\) (噪声):一个很小的随机误差。这是“为了防偷看撒的灰”
  • \(t\) (公钥):这是“带噪声的谜底”
  • 为什么安全? (LWE 假设):如果你只给我 \(A\) 和 \(t\),让我求 \(s\)。因为有 \(e\) 的干扰,这在数学上极难(相当于在有误差的测量数据中反推原始参数,但是在高维空间里)。如果不加 \(e\),用高斯消元法一瞬间就解出来了。
算法 13 K-PKE.KeyGen(d) Step 3-7: 生成矩阵 \(\hat{A}\)


  • 操作:用种子 \(\rho\) 扩展生成矩阵 \(\hat{A}\)。
  • 细节:这里用的是 NTT 域的矩阵(带帽子的 \(\hat{A}\))。
  • 直觉:为了省地儿,公钥里不存巨大的矩阵 \(A\),只存一颗种子 \(\rho\)。大家约定好用这颗种子“长”出完全一样的矩阵 \(A\)。
Step 8-15: 采样 \(s\) 和 \(e\)

\[*s \leftarrow SamplePolyCBD...*\]


  • 直觉
  • 私钥 \(s\) 和噪声 \(e\) 不是随便选的,必须“很小”
  • CBD (中心二项分布):这种分布生成的数字大多是 0,偶尔是 \(\pm 1, \pm 2\)。它们很小,像灰尘一样。
Step 18: \(\hat{t} \leftarrow \hat{A} \circ \hat{s} + \hat{e}\)


  • 核心算式:这就是 \(t = As + e\) 的 NTT 版本。
  • 直觉:把私钥 \(s\) 和公钥矩阵 \(A\) 搅在一起,再撒把盐 \(e\),就做成了公钥 \(t\)。
Step 19-20: 编码输出


  • 输出
  • 公钥 (\(ek\)):包含 \(t\) 和 生成矩阵用的种子 \(\rho\)。
  • 私钥 (\(dk\)):就是 \(s\)(当然是编码后的)。
5.2 K-PKE Encryption (加密)

这一节讲述 Alice(拥有公钥)如何把消息 \(m\) 锁进盒子里。
1. 逐行精读与直觉

原文...encode information in the "constant term"... of such a combined equation.


  • 加密的本质
  • 我们要做一个“带有噪声的 ElGamal 加密”。
  • 我们需要两个掩护:一个掩护随机数,一个掩护消息。
算法 14 K-PKE.Encrypt(ek, m, r)


  • 输入:公钥 \(ek\)(含 \(t, \rho\)),消息 \(m\),随机数 \(r\)。
Step 4-8: 重建矩阵 \(\hat{A}\)


  • 直觉:Alice 拿着公钥里的种子 \(\rho\),自己在家“长”出了和 Bob 一模一样的矩阵 \(A\)。
Step 9-17: 采样随机向量 \(y, e_1, e_2\)


  • 直觉:Alice 也要生成一堆“小灰尘”(噪声)。
  • \(y\):是 Alice 这一轮加密用的临时私钥(随机数向量)。
  • \(e_1, e_2\):是为了掩盖这一轮计算撒的新灰尘。
Step 19: \(u \leftarrow NTT^{-1}(\hat{A}^T \circ \hat{y}) + e_1\)


  • 密文第一部分 (\(u\))
  • 算式:\(u = A^T y + e_1\)
  • 直觉:这其实是另一个 LWE 实例!
  • Alice 用公钥矩阵 \(A\)(转置后)和她的临时私钥 \(y\) 生成了一个向量 \(u\)。
  • 作用:这个 \(u\) 是发给 Bob 的“线索”,Bob 可以用他的私钥 \(s\) 和这个 \(u\) 算出共享秘密。
Step 21: \(v \leftarrow NTT^{-1}(\hat{t}^T \circ \hat{y}) + e_2 + \mu\)


  • 密文第二部分 (\(v\))
  • 算式:\(v = t^T y + e_2 + \mu\)
  • 这里 \(\mu\) 是把消息 \(m\) 编码成多项式后的样子。
  • 直觉(最精彩的部分!)
  • Alice 计算 \(t^T y\)。这相当于 \(t \cdot y\)(点积)。
  • 回顾 \(t \approx As\)。所以 \(t^T y \approx (As)^T y = s^T A^T y\)。
  • Bob 收到 \(u\) 后,可以算 \(s^T u = s^T (A^T y + e_1) \approx s^T A^T y\)。
  • 发现了吗? Alice 算出的 \(t^T y\) 和 Bob 能算出的 \(s^T u\) 是近似相等的!这就是他们的共享秘密
  • Alice 把消息 \(\mu\) 加在这个共享秘密上。Bob 只要算出共享秘密,减去它,就能拿到消息。
Step 22-23: 压缩 (\(c_1, c_2\))


  • 操作:Compress(u) 和 Compress(v)。
  • 直觉:为了省流量,Alice 把计算结果的“低位”砍掉了(四舍五入)。这又引入了一层人为的“噪声”。
5.3 K-PKE Decryption (解密)

这一节讲述 Bob(拥有私钥)如何打开盒子。
1. 逐行精读与直觉

算法 15 K-PKE.Decrypt(dk, c)


  • 输入:私钥 \(dk\)(即 \(s\)),密文 \(c=(c_1, c_2)\)。
Step 3-4: 解压 (\(u', v'\))


  • 直觉:Bob 把收到的一堆字节还原成多项式向量 \(u'\) 和多项式 \(v'\)。注意,因为 Alice 压缩过,这里的 \(u', v'\) 和 Alice 算出来的原始值有一点点误差。
Step 6: \(w \leftarrow v' - NTT^{-1}(\hat{s}^T \circ NTT(u'))\)


  • 核心算式\(w = v' - s^T u'\)
  • 数学推导(见证奇迹的时刻)
    让我们忽略掉复杂的 NTT 和压缩误差,看看本质:

\[  \begin{aligned}  w &= v - s^T u \\    &= (t^T y + e_2 + \mu) - s^T (A^T y + e_1) \\    &= ((As + e)^T y + e_2 + \mu) - (s^T A^T y + s^T e_1) \\    &= (s^T A^T y + e^T y + e_2 + \mu) - s^T A^T y - s^T e_1 \\    &= \mu + (e^T y + e_2 - s^T e_1)\end{aligned}\]

  • 直觉
  • \(s^T A^T y\) 这一项(主要的干扰项)被完美抵消了!
  • 剩下的是 \(\mu + \text{一堆噪声}\)
  • 这堆噪声由 \(e, y, e_1, e_2, s\) 组成,它们都是“很小”的数,所以乘积和加和也比较小。
  • 消息 \(\mu\) 是什么?它是把比特 0 变成 0,把比特 1 变成 \(\lceil q/2 \rfloor\)(大概 1665)。这是一个很大的信号
  • 结论信号(消息) >> 噪声
Step 7: \(m \leftarrow ByteEncode(Compress_1(w))\)


  • 直觉
  • Bob 看着 \(w\),大概是 \(1665 + \text{noise}\) 或者 \(0 + \text{noise}\)。
  • 他做一个“四舍五入”:靠近 1665 的就猜是 1,靠近 0 的就猜是 0。
  • 只要噪声别大到把 0 推到 1665 那边去,解密就是正确的。
常见误解


  • 误解:“K-PKE 可以直接用来发微信消息。”



纠正绝对不行! 文档反复强调 ,K-PKE 只是组件。它是 CPA 安全的,意味着如果坏人给你发一个特制的“坏密文”,观察你的解密反应,就能偷走你的私钥 \(s\)。必须套上第 6、7 章的 FO 变换才敢用。

  • 误解:“为什么要转置 \(A^T\)?”


  • 直觉:KeyGen 用的是 \(As\)(列向量乘法)。Encrypt 为了利用 LWE 的对偶性,必须用 \(A^T y\)(行向量乘法,或者叫对偶 LWE)。这样解密时 \(s^T A^T y\) 才能和 \(t^T y\) 对上号。

  • 误解:“压缩只是为了变小,没别的用。”


  • 纠正:压缩不仅减小了尺寸,它本质上也是一种“加密”。它丢弃了低位信息,增加了 LWE 问题的难度(LWR, Learning With Rounding),虽然在这里主要是为了带宽,但从安全分析角度看,它引入了额外的噪声项。
整节总结 (Section 5)


  • 身份:K-PKE 是 ML-KEM 的心脏,一个基于模格(Module-Lattice)的公钥加密方案。
  • 原理
  • KeyGen:制造带噪声的线性方程组 \(t = As + e\)。
  • Encrypt:制造对偶的噪声方程组 \(u = A^T y + e_1\),并用共享秘密 \(t^T y\) 掩盖消息。
  • Decrypt:利用私钥 \(s\) 消除主要干扰 \(A\),在噪声中提取消息。
  • 特点
  • 全是矩阵和向量运算(\(R_q\) 上的多项式)。
  • 重度依赖 NTT 加速。
  • 有解密失败的概率(如果运气太差,噪声累积超过了阈值),但概率极低。
展望创新


  • 同态加密 (Homomorphic Encryption)


  • 你看 K-PKE 的结构:\(c_1 + c_2\) 对应的明文正好是 \(m_1 + m_2\)(在噪声允许范围内)。
  • 思路:K-PKE 其实就是一个“弱化版”的全同态加密(FHE)方案(类似于 BGV/BFV 的基础)。如果你想研究 FHE,ML-KEM 是最好的入门跳板。

  • 解密失败攻击 (Decryption Failure Attacks)


  • 虽然标准参数下失败率很低,但在侧信道或者故障注入场景下,攻击者能不能人为诱导解密失败?
  • 思路:研究如何通过控制环境(电压、温度)让噪声 \(e\) 变大,导致 Bob 解密出错,从而反推 \(s\)。

  • 硬件上的 NTT 优化


  • Step 6 的点积和 NTT 逆变换是计算热点。
  • 思路:在 RISC-V 或 ARM 架构上,如何设计专用指令集来并行化 \(\hat{s}^T \circ \hat{u}\)?
严格对齐原文精读“6. Main Internal Algorithms”

如果说第 5 章(K-PKE)是造了一个“玻璃保险箱”(能锁住东西,但防不住暴力砸),那么第 6 章就是“给玻璃箱穿上防弹衣”的车间。
这一章是 ML-KEM 安全性的核心所在。它实现了我们在第 3 章提到的 Fujisaki-Okamoto (FO) 变换。这里的代码逻辑虽然只有寥寥几行,但每一行都凝聚了密码学家几十年的智慧,用来抵御最凶险的 CCA(选择密文)攻击
作为你的导师,我要提醒你:这一章的代码逻辑是“确定性”(Deterministic)的。这意味着这里面没有掷骰子的动作(随机数生成都在第 7 章的外壳里)。这里的函数就像数学公式一样,输入固定,输出就永远固定。
6.1 Internal Key Generation (内部密钥生成)

这一节是对 K-PKE 密钥生成的一个“扩充”。
1. 逐行精读与直觉

算法 16 ML-KEM.KeyGen_internal(d, z)
输入:随机种子 \(d\)(用于生成 K-PKE 密钥),随机种子 \(z\)(用于隐式拒绝)。
Line 1: \((ek_{PKE}, dk_{PKE}) \leftarrow K-PKE.KeyGen(d)\)


  • 直觉:先调用第 5 章的那个“玻璃保险箱”工厂,造出一对普通的公私钥。
  • 注意:这里用的随机数是输入的 \(d\),不是现生成的。
Line 2: \(ek \leftarrow ek_{PKE}\)


  • 直觉:ML-KEM 的公钥(Encapsulation Key)就是 K-PKE 的加密钥(Encryption Key)。它俩是一回事,没变。
Line 3: \(dk \leftarrow (dk_{PKE} || ek || H(ek) || z)\)


  • 直觉(扩充私钥)
  • ML-KEM 的私钥(Decapsulation Key)比 K-PKE 的私钥胖了很多。它不仅仅包含解密用的 \(dk_{PKE}\)(私钥向量 \(s\)),还打包了三样东西:

    • \(ek\) (公钥):是的,私钥里存了一份公钥!为什么?因为解密的时候需要做“再加密检查”,而加密需要公钥。为了方便,干脆把公钥随身携带。


    • \(H(ek)\) (公钥指纹):公钥的哈希值。用于生成共享密钥时绑定公钥,防止“替换公钥攻击”。


    • \(z\) (隐式拒绝种子):这是一个 32 字节的随机数。它的作用是“万一解密失败,就用它来生成垃圾密钥”

2. 常见误解


  • 误解:“私钥里存公钥,会不会泄密?”
  • 纠正:不会。公钥本来就是公开的,存哪里都一样。把它放在私钥结构体里纯粹是为了工程上的方便(解密时不用满世界找公钥)。
6.2 Internal Encapsulation (内部封装)

这一节是 Bob 的工作。但注意,这是一个“去随机化”的版本。
1. 逐行精读与直觉

算法 17 ML-KEM.Encaps_internal(ek, m)
输入:公钥 \(ek\),随机数 \(m\)


  • 关键点:这里的 \(m\) 是作为输入传进来的,不是函数内部生成的。这意味着如果我给你同样的 \(m\),你算出的密文永远一样。
Line 1: \((K, r) \leftarrow G(m || H(ek))\)


  • 直觉(核心逻辑 - 锁定随机性)
  • 我们把输入的随机种子 \(m\) 和公钥指纹 \(H(ek)\) 扔进哈希函数 \(G\)。
  • 产出两样东西

  • \(K\) (共享密钥):这是我们最终想要协商的密码。
  • \(r\) (加密随机数):这是接下来加密要用的“硬币”。


  • 为什么要这样做?
  • 这叫“随机性派生”。加密用的随机数 \(r\) 不是随便选的,而是由消息 \(m\) 决定的。
  • 只要 \(m\) 确定了,加密的过程就被锁死了。这是 FO 变换能够进行“再加密验证”的前提。
Line 2: \(c \leftarrow K-PKE.Encrypt(ek, m, r)\)


  • 直觉:用刚才派生出的 \(r\),把 \(m\) 锁进玻璃保险箱(K-PKE)。
  • 注意:这里加密的消息就是 \(m\) 本身。
Line 3: return \((K, c)\)


  • 直觉:输出最终的共享密钥 \(K\) 和密文 \(c\)。
2. 常见误解


  • 误解:“\(m\) 是我们要传输的消息吗?”
  • 纠正:在 KEM 里,\(m\) 只是一个种子。它本身没有含义。它的作用是生成 \(K\)。我们最终用的是 \(K\)。
6.3 Internal Decapsulation (内部解封装)

这一节是 Alice 的工作。这是全书最精彩、逻辑最严密的地方——FO 变换的校验逻辑
1. 逐行精读与直觉

算法 18 ML-KEM.Decaps_internal(dk, c)
Line 1-4: 拆包私钥


  • 直觉:把那个“胖胖的私钥”拆开,拿出 \(dk_{PKE}\)(解密钥)、\(ek_{PKE}\)(加密钥)、\(h\)(公钥指纹)、\(z\)(种子)。
Line 5: \(m' \leftarrow K-PKE.Decrypt(dk_{PKE}, c)\)


  • 直觉(尝试开锁)
  • Alice 用私钥尝试打开玻璃保险箱 \(c\)。
  • 得到一个结果 \(m'\)。
  • 警惕:这时候 Alice 绝不相信 \(m'\) 是真的。因为攻击者可能发了一个坏的 \(c\),导致解出来的 \(m'\) 是被篡改过的。
Line 6: \((K', r') \leftarrow G(m' || h)\)


  • 直觉(情景重现)
  • Alice 想:“如果这个 \(m'\) 是真的,那么当初 Bob 生成的共享密钥 \(K'\) 和加密随机数 \(r'\) 应该就是这一对。”
Line 7: \(\bar{K} \leftarrow J(z || c)\)


  • 直觉
  • Alice 提前熬好一碗“假药” \(\bar{K}\)。
  • 这碗药是用私钥里的随机数 \(z\) 和密文 \(c\) 混合而成的。
  • 特点:对于攻击者来说,这碗药看起来和真药(真密钥)一模一样,都是乱码。但它不仅是假的,而且每次密文 \(c\) 变了,这碗药的味道也会变(伪随机)。
Line 8: \(c' \leftarrow K-PKE.Encrypt(ek_{PKE}, m', r')\)


  • 直觉(再加密 - 核心中的核心)
  • Alice 扮演 Bob 的角色!
  • 她用刚才推导出的 \(m'\) 和 \(r'\),配合公钥,自己重新加密一次,得到 \(c'\)。
  • 逻辑:因为加密是确定性的(由 \(m'\) 和 \(r'\) 锁死),所以如果 \(m'\) 是原装的,那么这一步算出来的 \(c'\) 必须和收到的 \(c\) 一模一样
Line 9-11: 比较与隐式拒绝
if \(c \neq c'\) then \(K' \leftarrow \bar{K}\)


  • 直觉(终极审判)
  • Alice 比较:手里收到的 \(c\) vs. 自己算出的 \(c'\)。
  • 相等:说明 \(c\) 是合法的,没被篡改。\(K'\) 是真密钥。
  • 不相等:说明有人捣乱!\(c\) 是伪造的!
  • 动作:Alice 不动声色地把 \(K'\) 替换成了那碗假药 \(\bar{K}\)。
  • 为什么不报错? 如果报错,攻击者就知道“啊,我改的这个字节会导致解密失败”。如果不报错,攻击者拿到 \(\bar{K}\) 去通信,发现解不开,但他不知道是哪一步错的。
Line 12: return \(K'\)


  • 直觉:输出结果(可能是真 \(K\),可能是假 \(\bar{K}\))。
2. 常见误解


  • 误解 1:“为什么要重新加密?太浪费时间了。”
  • 纠正:这是为了防 CCA 攻击。没有这一步,攻击者可以通过构造特殊的密文来一点点窃取私钥。这是用时间换安全。
  • 误解 2:“隐式拒绝的 \(\bar{K}\) 是固定的吗?”
  • 纠正:不是。它是 \(J(z || c)\)。只要密文 \(c\) 变一点点,\(\bar{K}\) 就变。这让攻击者无法通过统计返回值的固定模式来判断是否失败。
整节总结 (Section 6)

这章展示了 ML-KEM 的三个“内脏器官”:

  • KeyGen_internal:不仅生成公私钥,还把公钥公钥指纹隐式拒绝种子一股脑打包进了私钥里。
  • Encaps_internal去随机化。输入随机种子 \(m\),通过哈希派生出加密所需的随机数 \(r\),确保加密过程是确定性的。
  • Decaps_internal:实现了 FO 变换


  • 解密 (\(m'\)) -> 重构 (\(r'\)) -> 再加密 (\(c'\)) -> 比对 (\(c == c'\)?)。
  • 如果比对失败,返回伪随机垃圾值(Implicit Rejection)。
展望创新


  • 侧信道防护 (Side-Channel Resistance)


  • Line 9 的比较操作 if c != c' 是极其危险的。
  • 攻击点:如果这个比较不是常数时间(Constant-Time)的,或者比较失败时 CPU 的功耗有细微差别,攻击者就能绕过 FO 变换。
  • 研究方向:如何设计硬件或软件,使得“成功”和“失败”两条路径的执行特征完全由物理层面不可区分?

  • 故障注入 (Fault Injection)


  • 如果攻击者用激光照射芯片,跳过了 c != c' 的检查,或者强行让比较结果为真,FO 变换就失效了。
  • 研究方向:代码混淆或冗余检查机制。
教授的叮嘱
第 6 章是 ML-KEM 的逻辑核心。你要死死记住 “解密-再加密-比较” 这个三步走流程,这是面试官最爱问的格密码(及所有后量子 KEM)的标准动作。
严格对齐原文精读“7. The ML-KEM Key-Encapsulation Mechanism”

你好!欢迎来到 FIPS 203 标准文档精读的最后一站。
我们刚刚在第 6 章把 ML-KEM 的“内脏”(内部算法)都掏出来研究了一遍。现在,第 7 章 "The ML-KEM Key-Encapsulation Mechanism" 就是要把这些内脏装进一个漂亮的机箱里,接上电源(随机数生成器),装上安全阀(输入检查),贴上封条,最终交付给用户使用。
这一章是应用层接口(API)的定义。作为一个未来的工程实现者,你以后被调用的接口就是这一章定义的这三个函数。
准备好了吗?我们开始最后的组装。
7.0 概览 (Overview)

原文This section describes the three main algorithms of the ML-KEM scheme: 1. Key generation... 2. Encapsulation... 3. Decapsulation...


  • 教授直觉
  • 第 6 章的函数叫 _internal(内部版),它们是确定性的(给同样的输入,出同样的输出),不产生随机数。
  • 第 7 章的函数(不带 _internal)是完整版。它们负责调用随机数生成器 (RNG),并将随机数传给内部函数。
  • 比喻:第 6 章是“发动机”,第 7 章是“整车”。用户只管踩油门(调用接口),不需要知道油是怎么喷进发动机的。
7.1 ML-KEM Key Generation (密钥生成)

这是 Alice 在一切开始前做的事情:造锁(公钥)和钥匙(私钥)。
1. 逐行精读与直觉

Algorithm 19 ML-KEM.KeyGen()
Line 1: \(d \leftarrow \mathbb{B}^{32}\)
Line 2: \(z \leftarrow \mathbb{B}^{32}\)


  • 直觉(注入灵魂)
  • 这里调用了系统的随机数生成器 (RBG)
  • \(d\):用来生成那个数学上的格结构(\(A\) 和 \(s, e\))。
  • \(z\):那个用来搞“隐式拒绝”的假药种子。
  • 重点:这两个数必须是真随机或者密码学安全的伪随机。如果这两个数被黑客猜到了,你的格密码再复杂也是白搭。
Line 3-5: Check for NULL


  • 直觉:如果系统太忙,随机数生成失败了,必须立刻报错停止。不能用全 0 或者垃圾值硬算,否则私钥就是弱密钥。
Line 6: \((ek, dk) \leftarrow \text{ML-KEM.KeyGen\_internal}(d, z)\)


  • 直觉:拿着刚才求来的两个随机种子,去第 6 章的工厂里把公私钥造出来。
Key pair check (密钥对检查)


  • 场景:有些时候,你的钥匙不是自己生成的,是“第三方可信机构”发给你的。你敢直接用吗?
  • 教授直觉
  • 标准提供了一套“体检套餐”,用来检查这对钥匙是不是好钥匙。
  • 1. Seed consistency:如果你有种子 \((d, z)\),你自己重新跑一遍 KeyGen,看看生出来的钥匙是不是和手里这对一样。

    • Pair-wise consistency (配对一致性) :

  • 这招最绝。自己给自己发个快递
  • 用公钥 \(ek\) 封装一个随机数,得到 \((K, c)\)。
  • 用私钥 \(dk\) 解开 \(c\),得到 \(K'\)。
  • 如果 \(K \neq K'\),说明这把钥匙是坏的,或者是被动过手脚的(比如被植入了后门)。立刻丢弃!
7.2 ML-KEM Encapsulation (封装)

这是 Bob 给 Alice 发送共享密钥的过程。
1. 逐行精读与直觉

Encapsulation key check (封装密钥检查)


  • 场景:Bob 拿到 Alice 的公钥 \(ek\),准备塞信封。但他怎么知道这个公钥是合法的?如果 Alice 是个坏人,给了一个精心构造的“畸形公钥”来诱骗 Bob 泄密怎么办?
  • 检查 1:Type check:长度对不对?(比如 ML-KEM-768 的公钥必须是 1184 字节)。

检查 2:Modulus check (模数检查)

  • 公式:\(test \leftarrow ByteEncode_{12}(ByteDecode_{12}(ek))\)。如果 \(test \neq ek\),报错。
  • 数学直觉(重要!)
  • 我们的数学世界是在 \(\mathbb{Z}_q\) 上的,数字范围是 \(0 \sim 3328\)。
  • 但是,公钥是以 12-bit 为单位存储的。12-bit 能表示 \(0 \sim 4095\)。
  • 漏洞:如果公钥里混进了 \(3330\) 这个数,它在数学上等价于 \(1\)(因为 \(3330 \pmod{3329} = 1\)),但在字节表示上它就是 \(3330\)。
  • 攻击:这种“非规范编码”可能会导致哈希值改变,或者触发某些未定义的行为。
  • 防御:这个检查强制要求公钥里的每个数必须严格小于 3329。如果是 \(3330\),ByteDecode 会把它模一下变成 \(1\),再 ByteEncode 回去就是 \(1\)。原公钥是 \(3330\),新的是 \(1\),不想等,这就抓住了“李鬼”。
Algorithm 20 ML-KEM.Encaps(ek) Line 1: \(m \leftarrow \mathbb{B}^{32}\)


  • 直觉
  • Bob 在这里生成了一个真正的随机数 \(m\)
  • 这个 \(m\) 就是第 6 章里那个确定性函数的源头。
  • 这就是为什么每次运行 Encaps 结果都不一样的原因
7.3 ML-KEM Decapsulation (解封装)

这是 Alice 收到快递后打开的过程。
1. 逐行精读与直觉

Decapsulation input check (解封装输入检查)


  • 场景:Alice 拿到密文 \(c\) 和自己的私钥 \(dk\)。
  • 检查 1 & 2:密文和私钥的长度必须对。

检查 3:Hash check (哈希检查)

  • 公式:\(H(dk的公钥部分) \stackrel{?}{=} dk的指纹部分\)。
  • 背景回顾:还记得私钥 \(dk\) 的结构吗?它是 \((dk_{PKE} || ek || H(ek) || z)\)。里面包含了一份公钥 \(ek\) 和一份公钥指纹 \(H(ek)\)。
  • 直觉:这个检查是为了防止“张冠李戴”
  • 万一内存出错了,或者硬盘坏了,导致私钥结构体里的 \(ek\) 和后面的指纹 \(H(ek)\) 对不上了。
  • 如果不检查直接用,Alice 可能会在 FO 变换的“重加密”步骤中用错误的公钥去加密,导致永远验证失败(隐式拒绝),或者更糟,泄露错误公钥的信息。
  • 这个检查保证了私钥内部的一致性。
Algorithm 21 ML-KEM.Decaps(dk, c)


  • 直觉
  • 这里没有随机数生成。解密过程必须是确定性的。
  • 直接调用第 6 章的 Decaps_internal,执行那个著名的“解密-再加密-比较”流程。
常见误解 (Common Misconceptions)


  • 误解:“ML-KEM.Encaps 不需要随机数生成器。”



纠正:大错特错!虽然它调用的 _internal 函数是确定性的,但 Encaps 本身的第一步就是生成随机种子 \(m\) 。如果这一步的随机数生成器很烂(比如总是生成 0),那么你发出去的所有密文都一样,私钥瞬间被破解。

  • 误解:“输入检查(Input Check)太麻烦了,我可以跳过。”



纠正绝对不行。Modulus check(模数检查)是防范“恶意公钥攻击”的第一道防线。如果不检查,攻击者可能利用非规范的公钥值触发软件 Bug 或侧信道泄露。FIPS 标准里用了 "shall" (必须) 这个词 ,意味着不检查就不合规。

  • 误解:“私钥检查(Key pair check)是必须做的。”



纠正:标准说这是 "optional" (可选的) 。通常只有当你从别人那里导入一个私钥,或者系统刚启动不放心硬件的时候才做。在正常的通信流程中,不用每次都查,太慢了。
整节总结 (Section 7)

这一章把所有零件组装成了最终产品:

  • 分层架构


  • API 层(本章):负责随机数生成 (RBG)、输入合法性检查 (Modulus check, Hash check)。
  • 核心层(第6章):负责密码学逻辑(FO 变换)。
  • 原语层(第5章):负责数学运算(LWE 加密)。

  • 三大接口


  • KeyGen:生成 \((ek, dk)\)。必须使用高质量随机数。
  • Encaps:输入 \(ek\),输出 \((K, c)\)。必须检查 \(ek\) 的规范性。
  • Decaps:输入 \((dk, c)\),输出 \(K\)。必须检查 \(dk\) 的一致性。

  • 安全原则:不仅仅依赖数学,更依赖严格的格式检查一致性验证,把所有“畸形输入”拒之门外。
展望创新


  • 硬件卸载输入检查


  • 那个 Modulus check (\(ByteEncode(ByteDecode(ek)) == ek\)) 看起来简单,但在高并发下也是开销。
  • 创新点:在网卡或安全芯片(SE)中设计专用电路,在数据流入 CPU 之前就自动完成这个检查,非法的直接丢弃,减轻 CPU 负担。

  • 对抗故障注入的检查


  • 如果攻击者跳过了 Hash check 怎么办?
  • 创新点:设计“纠缠式”代码,让 Hash check 的计算结果成为后续解密步骤的必要参数(比如作为内存地址偏移量)。如果跳过检查,后续步骤直接访问非法内存崩溃,而不是算出错误结果。

  • 无状态重用 (Stateless Reuse)


  • 标准里的 KeyGen 需要随机数。在某些极简的嵌入式设备上,RNG 可能很慢。
  • 创新点:研究如何安全地把 \(d\) 和 \(z\) 烧录在设备里(类似于出厂设置),在保证不重用 Nonce 的前提下,实现确定性的密钥生成,这在物联网安全中很有价值。
教授的结束语:
从最底层的多项式环 \(R_q\),到中间的 K-PKE 玻璃箱,再到 FO 变换的防弹衣,最后到本章的随机数注入和安检系统。你现在脑子里应该有一张完整的蓝图了。
这就是格密码(Lattice-based Cryptography)从理论走向现实的样子。它不只是一堆漂亮的公式,更是无数工程细节堆砌起来的堡垒。
严格对齐原文精读“8. Parameter Sets”

你好!欢迎来到 FIPS 203 标准文档精读的最后一课
我们已经完成了所有的“硬核”部分:数学原理、内部逻辑、API 封装。
现在,第 8 章:Parameter Sets(参数集) 是我们的“产品选购指南”
在这一章,NIST 像一个负责任的店主,摆出了三款不同规格的 ML-KEM 产品(512, 768, 1024)。你的任务是搞清楚:这三款到底有什么区别?我该买哪一款?
8. Parameter Sets (参数集概览)

1. 逐行精读与直觉

原文ML-KEM is equipped with three parameter sets... each comprises five individual parameters: k, \(\eta_1\), \(\eta_2\), \(d_u\), and \(d_v\). 原文There are also two constants: \(n=256\) and \(q=3329\).


  • 教授直觉(不变的基石 vs. 可调的旋钮)
  • 不变的基石 (\(n, q\)):不管你是买轻量版还是旗舰版,发动机的核心设计是不变的
  • \(n=256, q=3329\):这两个数是为了让 NTT(快速乘法) 能跑起来。如果改了它们,整个数学引擎就得重写。
  • 可调的旋钮:为了调整安全性和速度,我们有 5 个旋钮可以转动。
原文The parameter k determines the dimensions of the matrix \(\hat{A}\)...


  • 旋钮 1:\(k\) (维度)
  • 直觉:这是“矩阵的大小”
  • \(k=2\):解一个 2元一次方程组。
  • \(k=3\):解一个 3元一次方程组。
  • \(k=4\):解一个 4元一次方程组。
  • 影响:\(k\) 越大,未知数越多,方程越难解(更安全),但计算量越大(更慢),占用的内存也越大(公钥/密文更大)。
原文The parameter \(\eta_1\) ... specify the distribution for generating the vectors s and e... 原文The parameter \(\eta_2\) ... specify the distribution for generating the vectors \(e_1\) and \(e_2\)...


  • 旋钮 2 & 3:\(\eta_1, \eta_2\) (噪声宽度)
  • 直觉:这是我们撒的“迷雾”的浓度
  • \(\eta\) 控制了随机噪声的取值范围(比如是取 \(-2 \sim 2\) 还是 \(-3 \sim 3\))。
  • 权衡
  • 迷雾越浓(\(\eta\) 越大),攻击者越看不清真相(安全性 \(\uparrow\))。
  • 但是,迷雾太浓,连合法的接收者(Bob)解密时也容易看错(解密失败率 \(\uparrow\))。
  • 所以,\(\eta\) 的选择是在“安全性”和“正确性”之间走钢丝。
原文The parameters \(d_u\) and \(d_v\) serve as parameters ... for ... Compress, Decompress...


  • 旋钮 4 & 5:\(d_u, d_v\) (压缩比特数)
  • 直觉:这是“压缩图片的画质”
  • 我们的原始数据是 12-bit 的。
  • \(d_u=10\):意味着我们把 12-bit 的数据强行压缩成 10-bit,扔掉 2-bit 的精度。
  • \(d_v=4\):意味着压缩成 4-bit,扔掉 8-bit 的精度(狠!)。
  • 影响:丢弃的精度越多,密文越小(省流量),但引入的“量化噪声”越大(容易解密失败)。这也是一个精细的平衡。
Table 2 & 3: 三大套餐详解

让我们看着 Table 2Table 3  来选购。
套餐 A:ML-KEM-512 (轻量级)


  • 参数:\(k=2\)。
  • 尺寸:公钥 800 字节,密文 768 字节。
  • 安全等级Security Category 1(相当于 AES-128)。
  • 适用场景:对流量极其敏感的物联网设备、嵌入式芯片。它虽然是“入门款”,但对于目前的标准来说,破解它的难度等同于破解 AES-128,在绝大多数商业场景下已经足够安全
套餐 B:ML-KEM-768 (标准级 - 推荐)


  • 参数:\(k=3\)。
  • 尺寸:公钥 1184 字节,密文 1088 字节。
  • 安全等级Security Category 3(相当于 AES-192)。
  • 适用场景绝大多数互联网应用(Web, App, VPN)

NIST 的态度"NIST recommends using ML-KEM-768 as the default parameter set..." 。它在安全性和性能之间取得了完美的平衡。
套餐 C:ML-KEM-1024 (偏执级)


  • 参数:\(k=4\)。
  • 尺寸:公钥 1568 字节,密文 1568 字节。
  • 安全等级Security Category 5(相当于 AES-256)。
  • 适用场景:绝密级军事通信、核心金融系统。或者你非常担心未来几十年量子计算机突飞猛进,想要留出巨大的安全余量。
Security Categories (安全等级的含义)

这里有一个初学者常晕的概念:Category 1, 3, 5 是什么意思?为什么没有 2 和 4?
原文ML-KEM parameter set is claimed to be at least as secure as a generic block cipher...


  • 教授直觉
  • 密码学界有一个共识:AES 是目前的标尺。
  • Category 1:破解它需要的计算资源 \(\ge\) 暴力破解 AES-128。
  • Category 3:破解它需要的计算资源 \(\ge\) 暴力破解 AES-192。
  • Category 5:破解它需要的计算资源 \(\ge\) 暴力破解 AES-256。
  • 为什么没有 2 和 4?
  • 因为 ML-KEM 的维度 \(k\) 必须是整数。\(k=2\) 对应 Cat 1,\(k=3\) 对应 Cat 3。我们没法取 \(k=2.5\)。所以格密码的安全性是“跳跃式”的,不是连续可调的。
常见误解 (Common Misconceptions)


  • 误解:“ML-KEM-512 不安全,因为它是最低级的。”


  • 纠正大错特错。AES-128 至今没有被破解的迹象。ML-KEM-512 达到了同等级别,意味着它是非常安全的。除非有极高的合规要求(如涉及 Top Secret),否则 512 完全够用。

  • 误解:“为了安全,我应该总是用 ML-KEM-1024。”


  • 纠正:不推荐。1024 的密文和公钥都比 768 大了约 30%-40%。在移动网络或高并发服务器上,这会显著增加延迟。安全够用就好,过度冗余是浪费。

  • 误解:“我可以自己修改参数,比如搞个 \(k=3, \eta_1=1\)。”


  • 纠正绝对禁止。FIPS 标准之所以叫标准,就是不允许你乱改。你自己改的参数组合可能破坏了数学证明的条件,或者导致解密失败率飙升。只能在三款套餐里选,不能单点。
整节总结 (Section 8)


  • 三大套餐


  • 512 (\(k=2\)):小巧快,AES-128 级。
  • 768 (\(k=3\))NIST 官方推荐默认款,AES-192 级。
  • 1024 (\(k=4\)):重装甲,AES-256 级。

  • 参数机制


  • 固定 \(n=256, q=3329\) 保证算法结构不变。
  • 通过调整维度 \(k\)、噪声 \(\eta\) 和压缩率 \(d\),在安全、尺寸和错误率之间做权衡。

  • 选择原则:除非你有特殊理由(极度受限的硬件或极度敏感的数据),否则闭眼选 ML-KEM-768
全书总结与展望创新

恭喜你!我们不仅读完了第 8 章,也完成了对整个 FIPS 203 (ML-KEM) 标准的精读。
回顾

  • 第一章:知道了我们要干什么(抵抗量子计算机,协商密钥)。
  • 第二章:学会了数学语言(\(R_q\),多项式,小端序)。
  • 第三章:看了蓝图(CCA 安全,KeyGen/Encaps/Decaps 流程)。
  • 第四章:造了工具(NTT,压缩,ByteEncode)。
  • 第五章:造了锁芯(K-PKE,利用 LWE 构造加密)。
  • 第六章:加了防弹衣(FO 变换,再加密验证)。
  • 第七章:封装了接口(随机数生成,输入检查)。
  • 第八章:选了配置(512/768/1024)。
下一步可以做什么?

  • 实现与优化


  • 尝试用 Python 或 C 语言,从零手写一遍 ML-KEM。不为了跑得快,只为了跑通。这会让你对每一个字节的含义刻骨铭心。
  • 研究 AVX2 / NEON 指令集,看看如何加速 NTT 和哈希运算。这是发工程类论文的好方向。

  • 侧信道研究 (Side-Channel)


  • ML-KEM 的实现在处理 0 和 1 时,功耗有没有区别?
  • 在 Decaps 的比较阶段,能不能通过电磁辐射泄露私钥?
  • 这是一个永远有饭吃的领域。

  • 应用集成


  • 研究如何把 ML-KEM 集成到现有的协议中(如 TLS, SSH, VPN)。
  • 混合加密(ECC + ML-KEM)的工程实践和性能评估。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册