1. FIPS 206(FN-DSA)当前进展
NIST 在与 FALCON 团队协作并推进 FIPS 206 数年之后:
- 预计将很快发布初始公开草案(Initial Public Draft, IPD)
- 文档基本已完成,正在等待批准
本文将预览 FIPS 206 IPD 的主要内容:
- FN-DSA / FALCON 概述
- 与浮点运算相关的特殊挑战
- 与其他 FIPS 标准的相似性 / 差异
- 相对于提交版 FALCON 的计划修改
2. FIPS 206 与 FN-DSA
FIPS 206 基于 NIST PQC 竞赛中被选中的提交方案 FALCON,定义了 FN-DSA:
-
一种基于格(lattice-based)的签名方案
-
采用 Hash-Then-Sign(先哈希后签名) 范式
- 签名是一个格点,该点接近目标点 t \mathbf{t} t
- t \mathbf{t} t 派生自带随机性的消息哈希
-
使用定义在 NTRU 格上的结构
- 环为NTT友好环:
Z
q
[
X
]
/
⟨
X
n
+
1
⟩
\mathbb{Z}_q[X] / \left \langle X^n + 1\right \rangle
Zq[X]/⟨Xn+1⟩
其中: n = 2 ℓ n = 2^\ell n=2ℓ
- 环为NTT友好环:
Z
q
[
X
]
/
⟨
X
n
+
1
⟩
\mathbb{Z}_q[X] / \left \langle X^n + 1\right \rangle
Zq[X]/⟨Xn+1⟩
-
使用 FFT(快速傅里叶变换)和 LDL 树(FALCON Tree)来近似离散高斯采样
FN-DSA 特点为:
- 具有非常小的签名和公钥
- 但实现难度较高
具体来说:
- 相比 ML-DSA(FIPS 204)显著更小
- KeyGen 和 Signing 中的运算需要浮点运算
- 这会带来:
- 验证(validation)挑战
- 侧信道防护挑战
3. FALCON 细节
3.1 Falcon 密钥生成(KeyGen)
Falcon 密钥生成(KeyGen)过程为:
-
私钥是一个格基(按行表示):
B = ( g − f G − F ) \mathbf{B} = \begin{pmatrix} g & -f \\ G & -F \end{pmatrix} B=(gG−f−F)- 采样短(高斯分布)多项式: f , g ∈ Z [ X ] / ⟨ X n + 1 ⟩ f, g \in \mathbb{Z}[X] / \left \langle X^n + 1\right \rangle f,g∈Z[X]/⟨Xn+1⟩
- 计算 F , G F, G F,G,满足 NTRU 方程: f G − g F = q fG - gF = q fG−gF=q
- 检查 Gram-Schmidt(GS)范数小于: 1.17 q 1.17 \sqrt{q} 1.17q【后面有做修正为 0.9999 ⋅ 1.17 q 0.9999 \cdot 1.17 \sqrt{q} 0.9999⋅1.17q】
- 使用
reduce找到等价基,使得 F , G F, G F,G 足够小,从而可以进行byte-encode(字节编码)
-
如果某一步失败,则重新尝试
-
如果全部成功,则:
- 公钥: h = f − 1 g h = f^{-1} g h=f−1g
- 私钥: B \mathbf{B} B
3.2 Falcon 签名(Signing)
Falcon 签名(Signing)过程为:
- 将私钥展开为:
B
~
=
FFT
(
B
)
\tilde{\mathbf{B}} = \text{FFT}(\mathbf{B})
B~=FFT(B) 以及 LDL 树
T
T
T
- LDL 树由 B ~ \tilde{\mathbf{B}} B~ 计算得到
- 正确的签名分布要求:LDL 树叶子节点的数值必须位于 σ min 与 σ max 之间 \sigma_{\min} \ \text{与} \ \sigma_{\max} \ \text{之间} σmin 与 σmax 之间
- GS 范数检查应保证这一点(但需注意:浮点运算不是精确的)
3.3 NIST对 GS 范数、 σ min \sigma_{\min} σmin 和 σ max \sigma_{\max} σmax 的暂定处理方法
当前NIST对 GS 范数、 σ min \sigma_{\min} σmin 和 σ max \sigma_{\max} σmax 的暂定处理方法为:
- 1)Keygen 密钥生成过程中:
- 修改 GS 范数检查:新的最大值为 0.9999 ⋅ 1.17 q 0.9999 \cdot 1.17 \sqrt{q} 0.9999⋅1.17q
- 2)Singing 签名过程中:
- 显式检查 LDL 树叶子节点是否位于 σ min 与 σ max \sigma_{\min} \ \text{与} \ \sigma_{\max} σmin 与 σmax 之间
- 如果不满足,则签名始终返回 ⊥ \perp ⊥
3.4 NIST对浮点与验证的暂定策略
FN-DSA 中允许的表示方式为:
| 表示方式 | 密钥生成(Key Generation) | B ~ \tilde{\mathbf{B}} B~ 与 LDL 树 | 签名(Signing) | 验签(Verification) |
|---|---|---|---|---|
| 浮点数(Floating point) | 允许(Allowed) | 允许(Allowed) | 允许(Allowed) | 否(No / 不适用) |
| 模拟浮点数(Emulated floating point) | 允许(Allowed) | 允许(Allowed) | 允许(Allowed) | 否(No / 不适用) |
| 定点数(Fixed point) | 允许(Allowed) | 否(No) | 否(No) | 否(No / 不适用) |
当前NIST对浮点与验证(floating point/validation)的暂定策略为:
- 1)Verification(验签):
- 不使用浮点运算
- 实现应当与 KAT(已知答案测试,Known Answer Test)完全匹配
- 2)Signing(签名):
- 使用原生或模拟的浮点运算
(IEEE-754 binary64 —— 相关摘录已在 FIPS 中包含并获授权) - 正确的签名分布对于避免私钥泄露至关重要
- 因此,实现应当与 KAT 完全匹配
- 为此,NIST规定了一些细节(如:运算顺序、不使用 fused multiply-add 等)
- FFT 私钥基和 LDL 树可以缓存(但出于验证目的,它们仍被视为签名的一部分)
- 使用原生或模拟的浮点运算
- 3)Key Generation(密钥生成):
- validation(验证)时不要求与 KAT 完全匹配,需要检查:
- GS 范数
- NTRU 方程
- 无穷范数
- 从种子正确生成 f , g f, g f,g
- 这是可以接受的,因为私钥分布的微小偏差对安全性的影响有限
- 允许:
- 原生 / 模拟浮点
- 或定点实现
- 允许更小的循环上限(如用于避免定时侧信道)
- validation(验证)时不要求与 KAT 完全匹配,需要检查:
3.4 NIST对公私钥默认编码暂定方案
当前NIST对公私钥默认编码暂定方案为:
- 1)公钥(Public Key):
- 使用 NTT 形式: h ^ = N T T ( f ) − 1 ⋅ N T T ( g ) \hat{h} = \mathrm{NTT}(f)^{-1} \cdot \mathrm{NTT}(g) h^=NTT(f)−1⋅NTT(g)
- 可以节省少量计算开销,且没有实际缺点
- 2)私钥(Private Key):
- 使用: f , g , F f, g, F f,g,F(以及公钥哈希 t r t_r tr)
- G G G 可以通过以下方式重新计算: G = F f − 1 g m o d ± q G = F f^{-1} g \mod ^{\pm}{q} G=Ff−1gmod±q
- 不使用种子作为私钥
- KeyGen 实现的差异可能导致:
- 相同种子生成不同的密钥对
- KeyGen 实现的差异可能导致:
- 可以缓存 LDL 树 和 B ~ \tilde{\mathbf{B}} B~,但不建议导出这些数据
4. FIPS 206 与 FIPS 204 / 205 的对比(暂定)
FIPS 206 与 FIPS 204 / 205 的对比(暂定):
- 1)相似点(Similarities)
- 区分 pure(纯模式)和 prehash(预哈希模式)版本
- 区分 内部 / 外部 keygen、sign、verify 算法
- 数值编码使用 小端序(little-endian)
- 使用 SHAKE 做伪随机采样
- 包含 BUFF 变换
- 2)不同点(Differences)
- FIPS 206 仅允许随机化签名(randomized signing)
- 确定性签名可能是危险的:浮点实现中的错误可能导致 对同一哈希生成不同签名
- FIPS 206 仅允许随机化签名(randomized signing)
- FIPS 206 禁止导出种子(seed)
- KeyGen 不保证 种子总是以相同方式展开
- FIPS 206 不鼓励导出 FFT 基和 LDL 树
- 这些数据包含浮点数值,且FIPS 206中 未定义其标准字节序编码方式
5. FIPS 206 其他计划暂定修改
FIPS 206 其他计划暂定修改有:
- 在签名与验签中,除了
L
2
L_2
L2 范数外,还额外限制签名的无穷范数(infinity norm)
- 该修改由 Yang Yu 提出(见最近一次 FALCON 更新研讨会)
- 基础采样器(base sampler)对每个系数采样 79 位随机性,而不是 72 位
- 使用原本用于采样符号位的字节中的额外 7 位
- 不需要额外调用 XOF
上述两项修改都被认为不是安全性所必需的,但:
- 成本极低
- 不会降低安全性
此外,将伪随机种子统一为 40 字节(但 keygen 仍使用 32 字节)。
6. 关于FIPS 206的可讨论 / 反馈问题
关于FIPS 206的可讨论 / 反馈问题有:
- 对目前讨论的这些修改是否有任何反对意见?
- 是否应当增加对 密钥 / 消息恢复模式(key/message-recovery mode) 的支持?
- 是否应当增加对 定点版本签名(fixed-point signing) 的支持?
对于Eurocrypt 2025论文 Do Not Disturb a Sleeping Falcon: Floating-Point Error Sensitivity
of the Falcon Sampler and Its Consequences ,NIST认为:
- 当前FIPS 206中的签名验证(validation)方法 以及对随机化签名的要求,可以防御这些攻击
- 但是否也应考虑该论文提出的额外改进建议?
7. 关于FIPS 206的常数时间实现参考资料
关于FIPS 206的常数时间实现参考资料有:
- Thomas Pornin 2019年论文 New Efficient, Constant-Time Implementations of Falcon
- J. Howe、T. Prest、T. Ricosset 和 M. Rossi PQCrypto 2020论文 Isochronous Gaussian Sampling: From Inception to Implementation With Applications to the Falcon Signature Scheme
- Thomas Pornin 2025年论文 Falcon on ARM Cortex-M4: an Update
参考资料
[1] NIST 2025年 slide FIPS 206 Status Update

1198

被折叠的 条评论
为什么被折叠?



