参考文献:
- Lyubashevsky V, Peikert C, Regev O. On ideal lattices and learning with errors over rings[J]. Journal of the ACM (JACM), 2013, 60(6): 1-35.
- Lu X, Liu Y, Zhang Z, et al. LAC: Practical ring-LWE based public-key encryption with byte-level modulus[J]. Cryptology ePrint Archive, 2018.
- Lu X, Liu Y, Jia D, et al. LAC: Lattice-based cryptosystems[J]. NIST PQC Round, 2019, 2: 4.
- Fujisaki E, Okamoto T. How to enhance the security of public-key encryption at minimum cost[C]//Public Key Cryptography: Second International Workshop on Practice and Theory in Public Key Cryptography, PKC’99 Kamakura, Japan, March 1–3, 1999 Proceedings. Berlin, Heidelberg: Springer Berlin Heidelberg, 1999: 53-68.
- Fujioka A, Suzuki K, Xagawa K, et al. Practical and post-quantum authenticated key exchange from one-way secure key encapsulation mechanism[C]//Proceedings of the 8th ACM SIGSAC symposium on Information, computer and communications security. 2013: 83-94.
文章目录
- LAC
- Byte-Level Modulus
- CBD
- Error & ECC
- Cryptosystems
- CPA PKE
- CCA KEM
- KE
- AKE
LAC
目前几乎所有的基于 RLWE/MLWE 问题的后量子密码都遵循 LPR10
中的“类ElGamal密文”的形式。设计实用化密码算法的关键在于:寻找合适的参数、使用合适的加速算法、编写高效的代码实现。
LAC 是中科院信工所路献辉老师主持设计的 PQC KEM 方案,基于 RLWE 问题。LAC 的结构与 Newhope 几乎完全一样,除了使用字节规模的小素数,并使用大块的纠错码来纠错。与 Newhope 一样,LAC 也进入了 NIST 的第二轮征集,但它们都没有进入第三轮。
Byte-Level Modulus
出于紧凑性考虑,LAC 选取了激进的字节水平模数。由于现代计算机处理数据的最小单位是字节,因此选取远小于 256 256 256 的模数将几乎不会带来更多的性能提升。
LAC 考虑了三种模数:
-
二的幂次模数(power-of-two modulus)。例如 q = 256 q=256 q=256,这种选择可以充分利用单个字节的性质,在运算时可以自然地进位和取模。但是它并不是素数,导致环 R q R_q Rq 在 LAC 选择的 RLWE 的维度 n = 512 / 1024 n=512/1024 n=512/1024 下不是域。虽然没有证据表明这种选择不安全,但本着避免潜在弱点的原则,我们不使用它。
-
最大分裂模数(max-split modulus)。例如 q = 257 q=257 q=257,它满足 256 ∣ q − 1 256 \mid q-1 256∣q−1,因此在 G F ( q ) GF(q) GF(q) 中存在 256 256 256 次本原单位根,从而“反循环NTT”可以支持 log 128 = 7 \log{128}=7 log128=7 层迭代。根据环同构以及中国剩余定理,容易看出,
x n + 1 = ∏ i = 1 128 ( x n / 128 + ξ i ) x^n+1 = \prod_{i=1}^{128}(x^{n/128}+\xi_i) xn+1=i=1∏128(xn/128+ξi)
其中 ξ i ∈ G F ( q ) \xi_i \in GF(q) ξi∈GF(q) 是所有不同的 128 128 128 次单位根。使用不完全NTT算法,迭代 7 7 7 层蝴蝶,将 a , b ∈ R q a,b \in R_q a,b∈Rq 分解为 128 128 128 个低次的多项式。因为
R q ≅ R q / ( x n / 128 + ξ 1 ) × ⋯ × R q / ( x n / 128 + ξ 128 ) R_q \cong R_q/(x^{n/128}+\xi_1) \times \cdots \times R_q/(x^{n/128}+\xi_{128}) Rq≅Rq/(xn/128+ξ1)×⋯×Rq/(xn/128+ξ128)
所以两个多项式 a , b a,b a,b 的乘积就等价于分解后的 128 128 128 个低次多项式分别相乘。 -
最小分裂模数(min-split modulus)。例如 q = 251 q=251 q=251,它是小于 256 256 256 的最大素数,可以使得元素的字节表示最为紧凑。我们发现在这个模数下,多项式 x n + 1 ∈ Z q [ x ] x^n+1 \in Z_q[x] xn+1∈Zq[x] 只有两个因式,
x n + 1 = ( x n / 2 + 91 x n / 4 + 250 ) ( x n / 2 + 160 x n / 4 + 250 ) x^n+1 = (x^{n/2}+91x^{n/4}+250)(x^{n/2}+160x^{n/4}+250) xn+1=(xn/2+91xn/4+250)(xn/2+160xn/4+250)
因此这无法使用NTT算法来加速,只能使用 Schoolbook 多项式乘法。
LAC 认为结构越少越好,因此选择了 q = 251 q=251 q=251 作为环 R q = Z q [ X ] / ( X n + 1 ) R_q = \mathbb Z_q[X]/(X^n+1) Rq=Zq[X]/(Xn+1) 的模数,其中 n = 512 , 1024 n=512,1024 n=512,1024。
CBD
与 Newhope 一样,由于中心二项分布(centered binomial distribution, CBD)比高精度离散高斯分布的采样效率高得多,且只有签名算法依赖于离散高斯分布来获得安全性。因此密钥封装方案 LAC 选取了 CBD 作为错误分布。
因为密码安全性依赖于噪声和模数的比率,并且模数 q = 251 q=251 q=251 足够小,此时噪声规模选取为 k = 1 , 1 / 2 k=1,1/2 k=1,1/2 就足够了。
环 R q R_q Rq 上的 CBD 分布 χ = Ψ k n \chi = \Psi_k^n χ=Ψkn 的采样方法就是:独立采样 n n n 次 Ψ k \Psi_k Ψk,
- 对于
k
=
1
k=1
k=1,
- 采样随机比特 b , b ′ ∈ { 0 , 1 } b,b' \in \{0,1\} b,b′∈{0,1},输出 b − b ′ ∈ { − 1 , 0 , 1 } ⊂ Z q b-b' \in \{-1,0,1\} \subset \mathbb Z_q b−b′∈{−1,0,1}⊂Zq
- 其中 ± 1 \pm 1 ±1 出现的概率都为 1 / 4 1/4 1/4, 0 0 0 出现的概率为 1 / 2 1/2 1/2
- 对于
k
=
1
/
2
k=1/2
k=1/2,
- 采样随机比特 a , a ′ ← R Ψ 1 a,a' \leftarrow_R \Psi_1 a,a′←RΨ1,输出 a ⋅ a ′ ∈ { − 1 , 0 , 1 } ⊂ Z q a \cdot a' \in \{-1,0,1\} \subset \mathbb Z_q a⋅a′∈{−1,0,1}⊂Zq
- 其中 ± 1 \pm 1 ±1 出现的概率都为 1 / 8 1/8 1/8, 0 0 0 出现的概率为 3 / 4 3/4 3/4
为了抵御“高汉明重量攻击”,LAC 在第二轮 NIST PQC 文档中,设置了固定汉明重量的 CBD,记为 Ψ k n , h \Psi_k^{n,h} Ψkn,h,其中 0 < h < n / 2 0<h<n/2 0<h<n/2 是偶数。
Error & ECC
LAC 使用类 ElGamal 加密框架,明文按照 Regev 的MSB 编码方式,这里的明文是被 ECC 编码的消息码字 m ^ ∈ { 0 , 1 } l v \hat m \in \{0,1\}^{l_v} m^∈{0,1}lv
加密为:
c
1
←
a
r
+
e
1
c
2
←
(
b
r
+
e
2
)
l
v
+
E
n
c
o
d
e
(
m
^
)
\begin{aligned} c_1 &\leftarrow ar+e_1\\ c_2 &\leftarrow (br+e_2)_{l_v}+Encode(\hat m) \end{aligned}
c1c2←ar+e1←(br+e2)lv+Encode(m^)
解密为:
m
^
′
=
D
e
c
o
d
e
(
c
2
−
(
c
1
s
)
l
v
)
\hat m' = Decode\left(c_2 - (c_1 s)_{l_v}\right)
m^′=Decode(c2−(c1s)lv)
代入
b
=
a
s
+
e
b=as+e
b=as+e,经过计算得到:
c
2
−
(
c
1
s
)
l
v
=
(
e
r
−
e
1
s
)
l
v
+
e
2
+
E
n
c
o
d
e
(
m
^
)
\begin{aligned} c_2 - (c_1 s)_{l_v} = (er-e_1s)_{l_v} + e_2 + Encode(\hat m) \end{aligned}
c2−(c1s)lv=(er−e1s)lv+e2+Encode(m^)
如果第
i
i
i 比特解密正确,那么需要累积噪声
w
:
=
(
e
r
−
e
1
s
)
l
v
+
e
2
w:=(er-e_1s)_{l_v} + e_2
w:=(er−e1s)lv+e2 的第
i
i
i 个系数满足
∣
w
i
∣
<
⌊
q
/
4
⌉
|w_i| < \lfloor q/4 \rceil
∣wi∣<⌊q/4⌉。因为
s
,
e
,
r
,
e
1
,
e
2
←
R
Ψ
k
n
s,e,r,e_1,e_2 \leftarrow_R \Psi_k^n
s,e,r,e1,e2←RΨkn,其中
Ψ
k
\Psi_k
Ψk 的标准差
σ
=
k
/
2
\sigma = \sqrt{k/2}
σ=k/2 很小,均值为
μ
=
0
\mu=0
μ=0。根据中心极限法则以及分布的加和、分布的乘积,噪声主要是
e
r
er
er 和
e
1
s
e_1s
e1s 两项,多项式乘积的每一系数包含
n
n
n 项加和,因此
w
i
w_i
wi 是中心高斯分布,其标准差为:
n
⋅
σ
2
⋅
σ
2
+
n
⋅
σ
2
⋅
σ
2
=
σ
2
2
n
\sqrt{n \cdot \sigma^2 \cdot \sigma^2 + n \cdot \sigma^2 \cdot \sigma^2} = \sigma^2\sqrt{2n}
n⋅σ2⋅σ2+n⋅σ2⋅σ2=σ22n
使用高斯误差函数
erf
(
⋅
)
\text{erf}(\cdot)
erf(⋅) 来估计错误率(error rate)。因为累积分布为
Pr
(
−
B
≤
x
≤
B
)
=
erf
(
B
2
σ
)
\text{Pr}\left( -B \le x \le B \right) = \text{erf}(\dfrac{B}{\sqrt{2}\sigma})
Pr(−B≤x≤B)=erf(2σB),所以错误率为:
δ
≈
1
−
erf
(
⌊
q
/
4
⌉
2
(
σ
2
2
n
)
)
\delta \approx 1 - \text{erf}\left( \dfrac{\lfloor q/4 \rceil}{\sqrt{2}(\sigma^2\sqrt{2n})} \right)
δ≈1−erf(2(σ22n)⌊q/4⌉)
实际上,LAC 还对公钥第二分量 b b b、密文第一分量 c 1 c_1 c1、密文第二分量 c 2 c_2 c2,进行了压缩(就是“模切换”, d d d 比特离散化),因此噪声更加复杂。
如果使用了可以纠正至多
l
t
l_t
lt 位错的 ECC,那么解密失败率(decryption error rate)降低为:
Δ
≈
∑
j
=
l
t
+
1
l
v
(
l
v
j
)
⋅
δ
j
⋅
(
1
−
δ
)
l
v
−
j
\Delta \approx \sum_{j=l_t+1}^{l_v} {l_v \choose j} \cdot \delta^j \cdot (1-\delta)^{l_v-j}
Δ≈j=lt+1∑lv(jlv)⋅δj⋅(1−δ)lv−j
上式假设各个系数是独立的,但是环乘法的各个系数并不独立;不过,它们之间的依赖关系很弱,因此影响不大。
LAC 使用了 ( l n = 511 , l m = 340 , l d = 41 ) (l_n=511,l_m=340,l_d=41) (ln=511,lm=340,ld=41) 的 G F ( 2 ) GF(2) GF(2) 上 BCH 纠错码,可以纠 l t = 20 l_t = 20 lt=20 位错:
-
对于 n = 512 n=512 n=512,BCH 可将 δ = 2 − 13 \delta=2^{-13} δ=2−13 降低为 Δ = 2 − 154 \Delta=2^{-154} Δ=2−154
-
对于 n = 1024 n=1024 n=1024,如果使用设计距离 l d l_d ld 过大的 ECC,那么性能惩罚严重。因此 LAC 混合使用 BCH 以及 D2/D4 编码(Newhope 中的重复码):先将 m m m 编码为 m ^ = E C C E n c ( m ) \hat m = ECCEnc(m) m^=ECCEnc(m),然后重复两次 MSB 编码 ( E n c o d e ( m ^ ) , E n c o d e ( m ^ ) ) (Encode(\hat m),Encode(\hat m)) (Encode(m^),Encode(m^))
另外需要注意的是,需要把 BCH 实现为常数时间,以抵御“计时攻击”。
Cryptosystems
LAC 包括四个方案:IND-CPA 安全的 PKE、IND-CCA 安全的 KEM、被动安全的 KE,安全的 AKE。
- 基于 RLWE 问题,构造出 IND-CPA 安全的公钥加密方案( public key encryption scheme, PKE)
- 利用 FO 转换,得到 IND-CCA 安全的密钥封装协议(key encapsulation mechanism, KEM)
- 直接把 CPA PKE、CCA KEM 自然地转化为被动安全的密钥交换协议(key exchange protocol, KE)
- 利用 FSXY 转换,得到安全的身份认证密钥交换协议(authenticated key exchange protocol, AKE)
CPA PKE
对于不同的安全级别(分别相当于 AES128
,AES192
,AES256
),LAC 的参数如下:
CCA KEM