1. 引言
Falcon 是一种密码学签名算法,于 2017 年 11 月 30 日提交至 NIST 的 Post-Quantum Cryptography Project。其设计者包括:Pierre-Alain Fouque、Jeffrey Hoffstein、Paul Kirchner、Vadim Lyubashevsky、Thomas Pornin、Thomas Prest、Thomas Ricosset、Gregor Seiler、William Whyte、Zhenfei Zhang。
后量子密码算法的目标,是在面对 量子计算机 时仍能保持其安全特性。根据人们当前对物理规律的理解,量子计算机是可行的,但要构建一个完全可用的系统仍有许多关键技术问题尚未解决。一旦实现,这类计算机将能够高效破解基于数论的传统非对称加密和数字签名算法(如 RSA、DSA、Diffie-Hellman、ElGamal 及其椭圆曲线变种)。
Falcon 基于 Gentry、Peikert 和 Vaikuntanathan 提出的格签名理论框架(参见 2008年论文 How to Use a Short Basis: Trapdoors for Hard Lattices and New Cryptographic Constructions),并在 NTRU 格上进行实例化,使用一种称为“快速傅里叶采样(fast Fourier sampling)”的陷门采样器。其底层困难问题是 NTRU 格上的 short integer solution(SIS)问题,目前在一般情况下尚无已知高效算法可以求解,即使借助量子计算机也不例外。
2. Falcon算法特点(Algorithm Highlights)
Falcon 具有以下特性:
- 安全性(Security):
内部使用真高斯采样器,在理论上可支持几乎无限次数(超过 2 64 2^{64} 264 次)签名,同时保证对私钥的信息泄露可忽略不计。 - 紧凑性(Compactness):
得益于 NTRU 格结构,在相同安全级别下,签名长度显著短于其他格基签名方案,而公钥大小大致相当。 - 速度(Speed):
利用快速傅里叶采样,实现极高效率:在普通计算机上每秒可生成数千个签名;验证速度快 5 到 10 倍。 - 可扩展性(Scalability):
运算复杂度为 O ( n log n ) O(n \log n) O(nlogn)( n n n 为多项式阶),可在合理成本下支持长期安全参数。 - 内存效率(RAM Economy):
改进后的密钥生成算法仅需不到 30 KB 内存,相比 NTRUSign 等早期方案降低约两个数量级,适用于资源受限的嵌入式设备。
3. Falcon性能(Performance)
虽然抗量子能力是 Falcon 设计的核心目标,但其在当前(量子计算机尚未普及)的现实环境中的效率同样至关重要。基于参考实现,在一台普通桌面电脑(Intel® Core® i5-8259U @ 2.3 GHz,关闭 TurboBoost)上,Falcon 的性能如下:
| 变体 | 密钥生成(ms) | 密钥生成内存(bytes) | 签名/秒 | 验签/秒 | 公钥大小(bytes) | 签名大小(bytes) |
|---|---|---|---|---|---|---|
| Falcon-512 | 8.64 | 14336 | 5948.1 | 27933.0 | 897 | 666 |
| Falcon-1024 | 27.45 | 28672 | 2913.0 | 13650.0 | 1793 | 1280 |
其中:
- 尺寸(密钥生成时的 RAM 使用量、公钥大小、签名大小)均以字节为单位表示。
- 密钥生成时间以毫秒为单位。
- 私钥大小(未在上表列出)大约是签名大小的三倍;
- 理论上,如果签名方能够在每次加载其私钥时重新执行密钥生成算法,则私钥可以被压缩为一个较小的 PRNG 种子(如 32 字节)。
作为对比,Falcon-512 在经典安全性上大致相当于 RSA-2048,而后者的签名和公钥大小均为 256 字节。在进行上述测试的系统上,OpenSSL 经过高度优化的汇编实现每秒大约可生成 1140 个签名;因此,Falcon 的参考实现(具备可移植性,并且在 x86 CPU 上未使用内联汇编)已经比其快 5 倍以上,并且在更大参数规模(用于长期安全)下具有更好的扩展性。
4. Falcon相关资源(Resources)
警告(2021-11-01): Algorand团队的 David Lazar 和 Chris Peikert 发现外部 API 中存在一个问题:函数 shake256_init_prng_from_seed() 和 shake256_init_prng_from_system() 的行为不正确。用于 NIST 后量子密码标准化项目的 API、测试向量和基准测试不受影响;PQClean 和 pqm4 库中的 Falcon 实现同样不受影响。下方链接的参考源码(包括 Zip 包和在线浏览版本)已修复该问题。
- Falcon 提交包 [zip](规范、源码、脚本和测试向量)
- Falcon 规范 [pdf]
- Falcon 参考实现:
- Python 实现 [html]
- 供参考:前几轮提交包:Round 1 [zip] 和 Round 2 [zip]
- NIST PQC 标准化会议演示材料:Round 1 [pdf] 和 Round 2 [pdf]
其中Falcon参考实现源码Falcon-impl-20211101 与 Falcon 提交包falcon-round3 这两份代码同源(都是 Thomas Pornin 的官方 Falcon 实现),但有结构性差异:
- 1)完全相同的文件(round3 三个变体 int/fpu/avx2 都一样):
- codec.c、common.c、vrfy.c
- 2)有差异的文件:fft.c、fpr.c、fpr.h、inner.h、keygen.c、rng.c、shake.c、sign.c
- 3)差异性质:
- Falcon-impl-20211101/ 是统一上游源码,通过 #if FALCON_AVX2 / FALCON_LE / FALCON_KG_CHACHA20 / FALCON_RAND_GETENTROPY/URANDOM/WIN32 等条件编译开关和 // yyyAVX2 / yyyKG_CHACHA20 / yyyNIST /
yyyPQCLEAN / yyySUPERCOP 等预处理标记,在同一份代码里同时容纳所有目标配置。 - falcon-round3/ 是NIST 提交版本,已经通过这些 yyy 标记把统一源码"切片"成具体变体(falcon512int / falcon512fpu / falcon512avx2 / falcon512cxm4 等),每个目录里只保留该变体激活的那一支代码,所以 inner.h 里的多平台分发块、rng.c 里的 OS 熵源选择、keygen.c 里的 ChaCha20 KG 路径、AVX2 内联函数等都被裁掉了。
- 这也解释了为什么 fpr.c 在 fpu/avx2 变体上 diff 巨大(用 IEEE-754 双精度替换了 int 版本的定点 fpr 实现),而 fft.c 等差异主要只是 yyy 注释和 #if 框架的去除。
- Falcon-impl-20211101/ 是统一上游源码,通过 #if FALCON_AVX2 / FALCON_LE / FALCON_KG_CHACHA20 / FALCON_RAND_GETENTROPY/URANDOM/WIN32 等条件编译开关和 // yyyAVX2 / yyyKG_CHACHA20 / yyyNIST /
- 4)目录级差异:
- 仅 20211101 有:Makefile、README.txt、config.h、falcon.c/.h(高层 API 封装)、test_falcon.c、speed.c
- 仅 round3 有:api.h、nist.c(NIST KAT 测试桩),以及 Extra/、KAT/、Supporting_Documentation/
即二者算法核心等价,可以认为 round3 是 20211101 上游源码按 NIST 提交格式预处理出的具体配置快照;但文件级逐字节并不相同,差异主要在条件编译框架和分发文件,而非密码学逻辑。
Algorand的 falcon-algo 是在 Falcon-impl-20211101 基础上做了确定性签名 (Falcon-DET) 改造,并加上 Go 绑定的派生版本。
- 1)二者完全相同的 9 个 C 文件:
- codec.c、common.c、fft.c、fpr.c、fpr.h、keygen.c、rng.c、shake.c、sign.c
- 2)二者有差异的 C/H 文件(全部都是为支持 Falcon-DET 而做的改动,差异都很小):
- 2.1)config.h (~141 行 diff):核心配置改变 —— 强制 FALCON_FPEMU=1、FALCON_FMA=0,改用整数浮点模拟器而非原生FPU。注释里反复强调这是为了让签名跨平台严格确定性,警告非确定性会导致灾难性密钥泄漏。原版默认开 FALCON_FMA=1 用硬件浮点。
- 2.2)falcon.c / falcon.h(各 1 行):falcon_get_logn(void *obj, …) 参数加了 const 修饰。纯 API 微调。
- 2.3)inner.h(+15 行):新增 5 个内部 mq_ 函数的对外声明 —— Zf(mq_NTT)、Zf(mq_iNTT)、Zf(mq_poly_montymul_ntt)、Zf(mq_poly_sub)、Zf(mq_sub),注释写明 “exported for use in deterministic.h”。
- 2.4)vrfy.c(+11 行):为上述 5 个原本是 static 的 mq_ 内部函数补上 thin wrapper,把它们导出给 deterministic.c 使用。
- 3)目录级附加内容(只在 falcon-algo 里):
- deterministic.c / deterministic.h、falcon-det.pdf —— Falcon-DET 确定性签名层
- falcon.go、falcon_test.go、go.mod、go.sum、tests/ —— Go cgo 绑定
- Makefile / README.txt 也有相应差异
Algorand的 falcon-algo 和 Falcon-impl-20211101 二者 C 核心代码 95% 以上字节级一致,但 falcon-algo 不是单纯的镜像,falcon-algo通过:
- 1)关闭硬件 FP/FMA 改用 fpr.c 整数模拟
- 2)暴露 NTT 系列 mq_ 内部原语
- 3)叠加 deterministic.c 层
把概率性的 Falcon 改造成确定性签名方案,并对外提供 Go API。
5. Falcon相关工作(Related works)
-
Thomas Pornin 和 Thomas Prest
2019年论文 More Efficient Algorithms for the NTRU Key Generation using the Field Norm -
Xingye Lu, Man Ho Au 和 Zhenfei Zhang
2018年论文 Raptor: A Practical Lattice-Based (Linkable) Ring Signature -
Thomas Pornin
2019年论文 New Efficient, Constant-Time Implementations of Falcon -
Pierre-Alain Fouque, Paul Kirchner, Mehdi Tibouchi, Alexandre Wallet 和 Yang Yu
2019年论文 Key Recovery from Gram-Schmidt Norm Leakage in Hash-and-Sign Signatures over NTRU Lattices -
James Howe, Thomas Prest, Thomas Ricosset 和 Mélissa Rossi
2019年论文 Isochronous Gaussian Sampling: From Inception to Implementation
参考资料
[1] Falcon官网

2220

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



