参考文献:
- 基于NTT的循环码:RS码、BCH码、RM码_vntt-CSDN博客
- 解码器:通用极大似然解码器、线性码的校验子解码器、BCH码的PGZ解码器_极大似然技术 编码-CSDN博客
- FO-like Transformation in QROM & Oracle Cloning-CSDN博客
- [Mac77] MacWilliams F J. The Theory of Error-Correcting Codes[J]. Elsevier Science Publishers BV google schola, 1977, 2: 39-47.
- [BMT78] E. Berlekamp, R. McEliece and H. van Tilborg, “On the inherent intractability of certain coding problems (Corresp.),” in IEEE Transactions on Information Theory, vol. 24, no. 3, pp. 384-386, May 1978, doi: 10.1109/TIT.1978.1055873.
- [Can89] Cantor D G. On arithmetical algorithms over finite fields[J]. Journal of Combinatorial Theory, Series A, 1989, 50(2): 285-300.
- [VG96] Von zur Gathen J, Gerhard J. Arithmetic and factorization of polynomial over F 2[C]//Proceedings of the 1996 international symposium on Symbolic and algebraic computation. 1996: 1-9.
- [AIK07] Applebaum B, Ishai Y, Kushilevitz E. Cryptography with constant input locality[C]//Annual International Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2007: 92-110.
- [GM10] Gao S, Mateer T. Additive fast Fourier transforms over finite fields[J]. IEEE Transactions on Information Theory, 2010, 56(12): 6265-6272.
- [HHK17] Hofheinz D, Hövelmanns K, Kiltz E. A modular analysis of the Fujisaki-Okamoto transformation[C]//Theory of Cryptography Conference. Cham: Springer International Publishing, 2017: 341-371.
- [MAB+22] Melchor C A, Aragon N, Bettaieb S, et al. Hamming quasi-cyclic (HQC). NIST PQC Round 4, 2022.
HQC
[MAB+22](该团队与 BIKE 基本重叠)设计的 HQC 是基于编码的 KEM 方案,具有一些理想的性质:基于 structured codes 上的校验子译码问题,可以证明其 IND-CPA 安全;不需要假设使用的 structured codes 与随机码不可区分;可以给出解码失败率(DFR)的上界,从而利用 FO 能够(可证明地)提升为 IND-CCA 安全。
HQC 也使用 QC-code 以减少通信,其定义和表示请看 BIKE。HQC 采取的矩阵/多项式记号的行/列和 BIKE 有区别,两者是互换的,不再赘述。
HQC 使用两种编码:可高效解码的系统编码(正确性),QC 随机码(安全性)。
HQC 的构造,我看着不太像 McEliece 或者 Niederreiter 方案,反倒是和 MLWE-based PKE 很类似(或者说是 ElGamal-like 框架)。
SD 问题
[BMT78] 证明了,汉明距离下的校验子译码问题(Syndrome Decoding)属于 NP-complete,[AIK07] 给出了从 search 到 decision 的归约(两者多项式等价)。
虽然 QC-codes 并没有一般的复杂性结果,但人们一般认为它是困难的;存在一些攻击利用了 QC 性质,但是其对复杂度的影响很小。
在 HQC 中仅使用码率 1 / 2 , 1 / 3 1/2,1/3 1/2,1/3 的 QC-codes,为了避免某些平凡的区分器,需要对校验矩阵 H H H 的奇偶性做出一些限制(纯技术性的),
HQC 依赖的困难性假设是:
以及
此外,HQC 使用的可高效译码的系统码是 Reed-Muller 和 Reed-Solomon 的级联码,其维度必然是合数。为了减少环 R = F 2 [ X ] / ( X n − 1 ) \mathcal R=\mathbb F_2[X]/(X^n-1) R=F2[X]/(Xn−1) 的结构,需要设置 n n n 为使得 2 m o d n 2 \mod n 2modn 是本原元的素数。因此,需要使用截断方法;由于损失了信息,所以译码问题的难度不会下降。
IND-CPA PKE
HQC 使用两个编码,
- 可高效解码的 [ n , k ] [n,k] [n,k]-线性码 C \mathcal C C,生成矩阵 G ∈ F 2 k × n G \in \mathbb F_2^{k \times n} G∈F2k×n,能够纠正至少 δ \delta δ 个错误
- 随机的 [ 2 n , n ] [2n,n] [2n,n]-双循环码,校验矩阵 ( 1 , h ) ∈ R 2 (1,h) \in \mathcal R^2 (1,h)∈R2
PKE 的构造如下:
HQC 采用 Reed-Muller 和 Reed-Solomon 的级联码作为码 C \mathcal C C,因此需要修正为 G ∈ F 2 n 1 n 2 G \in \mathbb F_2^{n_1n_2} G∈F2n1n2,满足 n 1 n 2 ≤ n n_1n_2 \le n n1n2≤n。密文中的 v v v 丢弃了前 l = n − n 1 n 2 l=n-n_1n_2 l=n−n1n2 个比特,记为 c = ( u , v ( l ) ) c=(u,v^{(l)}) c=(u,v(l))。为了减少空间开销, s k sk sk 和 h h h 分别用 s e e d 1 , s e e d 2 seed1,seed2 seed1,seed2 来记录。
容易验证,为了正确解密,需要满足:
H
W
(
x
⋅
r
2
−
y
⋅
r
1
+
e
)
≤
δ
HW(x \cdot r_2 - y \cdot r_1 + e) \le \delta
HW(x⋅r2−y⋅r1+e)≤δ
[MAB+22] 给出了上述错误分布的理论推导(特别复杂),在启发式假设下其各个系数是独立同分布的伯努利。仿真实验表明错误会比理论分析更加集中,因此实际 DFR 会比理论推导的上界更小。
容易看出,密钥安全基于 ( 1 , h ) ∈ R 2 (1,h) \in \mathcal R^2 (1,h)∈R2 指定的 search-QCSD 问题,消息安全则基于截断 l l l 比特的 decision-QCSD 问题。
IND-CCA KEM
HQC 采用 [HHK17] 中的 Q U ⊥ QU^\perp QU⊥ 将上述 IND-CPA PKE 加强为 IND-CCA KEM。事实上, F O ⊥ FO^\perp FO⊥ 本身就是 QROM 下安全的,可以省略密文中的保长哈希。为了消除 multi-ciphertext attack,还在生成随机带的哈希中添加了公开的随机盐。
KEM 的构造如下:
其中的 H , K , G H,K,G H,K,G 都使用 SHAKE256 实例化,固定其输出长度 512 比特,添加了 domain seperation tag 以成为独立的 RO。
RS & RM
HQC 使用的码 C \mathcal C C 是由 Reed-Solomon 和 Reed-Muller 级联得到的。级联码定义如下:
HQC 使用 G F ( 2 8 ) GF(2^8) GF(28) 上的 Reed-Solomon 作为外码,使用 G F ( 2 ) GF(2) GF(2) 上的 [ 128 , 8 , 64 ] [128,8,64] [128,8,64] Reed-Muller 的重复码作为内码。确切地说,
- 消息 m ∈ G F ( 2 8 ) k e m \in GF(2^8)^{k_e} m∈GF(28)ke 首先被 Reed-Solomon 编码,获得空间 G F ( 2 8 ) n e GF(2^8)^{n_e} GF(28)ne 中的码字;
- 然后该码字的每个 G F ( 2 8 ) GF(2^8) GF(28) 上系数被拍平为 G F ( 2 ) 8 GF(2)^8 GF(2)8 上向量,分别用 Reed-Muller 编码;
- 最后把获得的码字重复 3 , 5 3,5 3,5 次,以提高纠错能力(重复 r r r 次,则最小距离乘以 r r r)。
Reed-Solomon 码是极大距离可分的(maximum distance separable, MDS),达到了 Singleton Bound(即 d m i n = n − k + 1 d_{min}=n-k+1 dmin=n−k+1),具有很高的码率。它的解码器类似于 BCH 的 PGZ 算法,也是根据 FFT-form 构造线性方程组以及 error location polynomial 来解码的,其中利用了 Additive FFT 加速后者的求根。Reed-Muller 码的码率很低,但是其解码速度很快。
HQC 使用截断的 RS 码,参数如下:
HQC 使用重复的 RM 码,参数如下:
[MAB+22] 花费大量篇幅描述了 RS 和 RM 的解码器,看不懂 (;′⌒`)。他们给出了该级联码的 DFR 上界,从而可以证明 IND-CCA 安全。
三个安全级别所使用的级联码参数为:
Additive FFT
原始的 FFT 算法,计算的是多项式 f f f 在单位根群 ( ζ n ) (\zeta_n) (ζn) 上的求值,单位根群是由本原单位根 ζ n \zeta_n ζn 生成的乘法循环群。[Can89] 提出了 Additive FFT 的概念,它计算 f ∈ G F ( p m ) [ X ] f \in GF(p^m)[X] f∈GF(pm)[X] 在某个加法子群 G ⊆ G F ( p m ) G \subseteq GF(p^m) G⊆GF(pm) 上的求值,复杂度为 O ( m p m ) O(mp^m) O(mpm) 次域 G F ( p m ) GF(p^m) GF(pm) 上的乘法和 O ( m 2 p m ) O(m^2p^m) O(m2pm) 次域 G F ( p m ) GF(p^m) GF(pm) 上的加法,但是要求具有 m = p k m=p^k m=pk 的形式,并且要 4 n ≤ m p m 4n \le mp^m 4n≤mpm,这里 n : = deg f n:=\deg f n:=degf。[VG96] 扩展了 [Can89] 的算法,可以用于任意的 m m m,其复杂度为 O ( n log 2 n ) O(n\log^2 n) O(nlog2n) 次域 G F ( p m ) GF(p^m) GF(pm) 上的乘法和加法,只需满足 p ≤ n ≤ p m p \le n \le p^m p≤n≤pm。
[GM10] 使用多项式 Taylor 展开,提出了复杂度为
O
(
n
log
n
)
O(n \log n)
O(nlogn) 次域
G
F
(
2
m
)
GF(2^m)
GF(2m) 上乘法、
O
(
n
log
2
n
)
O(n \log^2 n)
O(nlog2n) 次域
G
F
(
p
m
)
GF(p^m)
GF(pm) 上加法的算法;特别地,对于特征
p
=
2
p=2
p=2,可以进一步获得复杂度为
O
(
n
log
n
)
O(n \log n)
O(nlogn) 次域
G
F
(
2
m
)
GF(2^m)
GF(2m) 上乘法和加法的算法。一般地,
G
F
(
2
m
)
GF(2^m)
GF(2m) 上乘法(word-level Shift + XOR)的开销是加法(word-level XOR)的
2
m
−
1
2m-1
2m−1 倍。同时在现代计算机中,Shift 和 XOR 的开销和 int
上的加法、乘法开销很接近。
令 F \mathbb F F 是包含至少 2 m 2^m 2m 个元素的特征 2 2 2 域,令 β 1 , ⋯ , β m ∈ F \beta_1,\cdots,\beta_m \in \mathbb F β1,⋯,βm∈F 是 F 2 \mathbb F_2 F2-线性独立的元素,它们张成一个子空间 B = ⟨ β 1 , ⋯ , β m ⟩ B = \langle \beta_1,\cdots,\beta_m \rangle B=⟨β1,⋯,βm⟩,以坐标 ( a 1 , ⋯ , a m ) ∈ F 2 (a_1,\cdots,a_m) \in \mathbb F_2 (a1,⋯,am)∈F2 的二进制合成 i ∈ [ 2 m ] i \in [2^m] i∈[2m] 诱导其中元素的排序。
给定某次数小于
n
=
2
m
n=2^m
n=2m 的多项式
f
(
x
)
f(x)
f(x),想要快速计算它在加法子群
B
B
B 上的求值,
F
F
T
(
f
,
m
,
B
)
:
=
(
f
(
B
[
0
]
)
,
f
(
B
[
1
]
)
,
⋯
,
f
(
[
B
[
n
−
1
]
]
)
)
FFT(f,m,B) := \left(f(B[0]),f(B[1]),\cdots,f([B[n-1]])\right)
FFT(f,m,B):=(f(B[0]),f(B[1]),⋯,f([B[n−1]]))
[GM10] 定义
g
(
x
)
=
f
(
β
m
⋅
x
)
g(x)=f(\beta_m\cdot x)
g(x)=f(βm⋅x) 以及
γ
i
=
β
i
⋅
β
m
−
1
\gamma_i=\beta_i \cdot \beta_m^{-1}
γi=βi⋅βm−1,于是将上述问题划分为子群及其陪集上的两个问题:
F
F
T
(
f
,
m
,
B
)
=
(
F
F
T
(
g
,
m
−
1
,
G
)
,
F
F
T
(
g
,
m
−
1
,
G
+
1
)
)
FFT(f,m,B) = (FFT(g,m-1,G), FFT(g,m-1,G+1))
FFT(f,m,B)=(FFT(g,m−1,G),FFT(g,m−1,G+1))
其中
B
⋅
β
m
−
1
=
G
∪
(
G
+
1
)
B \cdot \beta_m^{-1} = G \cup (G+1)
B⋅βm−1=G∪(G+1),以及
G
=
⟨
γ
1
,
⋯
,
γ
m
−
1
⟩
G=\langle \gamma_1,\cdots,\gamma_{m-1} \rangle
G=⟨γ1,⋯,γm−1⟩。注意
G
+
1
G+1
G+1 不是群,因此还需继续处理。[GM10] 将
g
(
x
)
g(x)
g(x) 关于
(
x
2
−
x
)
(x^2-x)
(x2−x) 做泰勒展开,将
g
(
x
)
g(x)
g(x) 分解为
g
0
(
x
)
,
g
1
(
x
)
g_0(x),g_1(x)
g0(x),g1(x) 的某种表示,最后把
F
F
T
(
g
,
m
−
1
,
G
+
1
)
FFT(g,m-1,G+1)
FFT(g,m−1,G+1) 进一步转换为
F
F
T
(
g
0
,
m
−
1
,
D
)
FFT(g_0,m-1,D)
FFT(g0,m−1,D) 和
F
F
T
(
g
1
,
m
−
1
,
D
)
FFT(g_1,m-1,D)
FFT(g1,m−1,D),其中
D
D
D 是某一个加法群。
这样,就把问题 F F T ( f , m , B ) FFT(f,m,B) FFT(f,m,B) 拆解为了三个子问题: F F T ( g , m − 1 , G ) FFT(g,m-1,G) FFT(g,m−1,G), F F T ( g 0 , m − 1 , D ) FFT(g_0,m-1,D) FFT(g0,m−1,D) 和 F F T ( g 1 , m − 1 , D ) FFT(g_1,m-1,D) FFT(g1,m−1,D),它们的规模是原问题的一半。[GM10] 给出了如下的复杂度分析,单位是 F \mathbb F F 上的乘法、加法。
如果 m m m 也是 2 2 2 的幂次,[GM10] 给出了优化的算法,渐进地降低了 A ( n ) A(n) A(n) 一个对数因子。
代码实现
NIST PQC Round 4 提供了 HQC 的优化实现,使用 gpreftools 测试结果如下:
不知为何,没有显示 KeyGen、Enc、Dec 节点。但是可以看到,Karatzuba 算法的开销占比很大。事实上,HQC 中的乘法操作数之一是稀疏的,因此存在更快的算法;但是为了防止侧信道攻击,他们只给出了用于稠密乘法的 Karatzuba 算法的 AVX2 实现。
不过在标准实现中,HQC 直接调用了 NTL
和 gf2x
库,两者本身就是 AVX 实现的,但是并不考虑安全性。