NTTRU:兼容 NTT 算法的 NTRU-based KEM 方案

news2024/11/25 0:22:28

参考文献:

  1. [CT65] Cooley J W, Tukey J W. An algorithm for the machine calculation of complex Fourier series[J]. Mathematics of computation, 1965, 19(90): 297-301.
  2. [Mont85] Montgomery P L. Modular multiplication without trial division[J]. Mathematics of computation, 1985, 44(170): 519-521.
  3. [KAK96] Koc C K, Acar T, Kaliski B S. Analyzing and comparing Montgomery multiplication algorithms[J]. IEEE micro, 1996, 16(3): 26-33.
  4. [HPS98] Hoffstein J, Pipher J, Silverman J H. NTRU: A ring-based public key cryptosystem[C]//International algorithmic number theory symposium. Berlin, Heidelberg: Springer Berlin Heidelberg, 1998: 267-288.
  5. [HS00] Hoffstein J, Silverman J. Optimizations for NTRU[J]. Public-Key Cryptography and Computational Number Theory, De Gruyter Proceedings in Mathematics, 2000: 77-88.
  6. [Ber01] Bernstein D J. Multidigit multiplication for mathematicians[J]. Advances in Applied Mathematics, 2001: 1-19.
  7. [Dent03] Dent A W. A designer’s guide to KEMs[C]//IMA International Conference on Cryptography and Coding. Berlin, Heidelberg: Springer Berlin Heidelberg, 2003: 133-151.
  8. [SS11] Stehlé D, Steinfeld R. Making NTRU as secure as worst-case problems over ideal lattices[C]//Advances in Cryptology–EUROCRYPT 2011: 30th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Tallinn, Estonia, May 15-19, 2011. Proceedings 30. Springer Berlin Heidelberg, 2011: 27-47.
  9. [BGV12] Zvika Brakerski, Craig Gentry, and Vinod Vaikuntanathan. (leveled) fully homomorphic encryption without bootstrapping. In ITCS, pages 309–325, 2012.
  10. [FO13] Fujisaki E, Okamoto T. Secure integration of asymmetric and symmetric encryption schemes[J]. Journal of cryptology, 2013, 26: 80-101.
  11. [APS15] Martin R Albrecht, Rachel Player, and Sam Scott. On the concrete hardness of Learning with Errors. Journal of Mathematical Cryptology, 9(3):169–203, 2015.
  12. [ABD16] Martin R. Albrecht, Shi Bai, and Léo Ducas. A subfield lattice attack on overstretched NTRU assumptions - cryptanalysis of some FHE and graded encoding schemes. In CRYPTO, pages 153–178, 2016.
  13. [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.
  14. [ACD+18] Albrecht M R, Curtis B R, Deo A, et al. Estimate all the {LWE, NTRU} schemes![C]//Security and Cryptography for Networks: 11th International Conference, SCN 2018, Amalfi, Italy, September 5–7, 2018, Proceedings 11. Springer International Publishing, 2018: 351-367.
  15. [Sei18] Seiler G. Faster AVX2 optimized NTT multiplication for Ring-LWE lattice cryptography[J]. Cryptology ePrint Archive, 2018.
  16. [LS19] Lyubashevsky V, Seiler G. NTTRU: Truly Fast NTRU Using NTT[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2019: 180-201.
  17. NTRU 加密方案
  18. FFT/NTT:以 CRT 的视角
  19. Multi-precision Montgomery
  20. PKE 安全性的提升方式:Naor-Yung、Fischlin、Fujisaki-Okamoto

文章目录

  • NTRU Using NTT
    • Background
    • Factorization of Cyclotomic Ring
    • OW-CPA NTRU
    • Decryption Error and Message Space
    • IND-CCA2 KEM
  • AVX2 optimized Implementation
    • NTT with Montgomery
    • NTT Vectorization
    • Base Rings
    • Binomial Sampling
    • Symmetric Primitives
    • Vectorized Packing

NTRU Using NTT

Background

[LS19] 给出了支持 NTT 的 NTRU 变体。他们给出了 AVX2 优化的算法实现,计算效率比 NIST-PQC 所接受的 NTRU 方案要高得多(Gen: 8X, Encap: 5X, Decap: 8X),并且也比其他的 KEM 方案明显更快。

[ACD+18] 使用 [APS15] 的 LWE estimator,评估了提交给 NIST-PQC 的所有 LWE-based、NTRU-based 的 PKE、KEM、Sign 的安全性。对于 128 比特的安全性,环的维度应当介于 700 到 800 之间。然而,radix-2 NTT 仅能处理维度是二的幂次的分圆环,这导致了安全级别的跳跃。NTRU-HRSS 采用了 701 维度的环,NTRU-Prime 采用了 761 维度的环,两者都无法兼容 NTT 算法。而基于 RLWE 的那些方案,可以采取 [BGV12] 的 Generalized LWE 假设将它划分为 3 个维度 256 的小环,从而可以使用 radix-2 NTT 算法。

NTRU-based 相较于 RLWE-based 的优势,

  1. 公钥:
    • RLWE 的公钥形如 ( a , b = a s + e ) ∈ R q 2 (a,b=as+e) \in R_q^2 (a,b=as+e)Rq2,包含两个环元素
    • NTRU 的公钥形如 h = p ⋅ g / f ∈ R q h=p\cdot g/f \in R_q h=pg/fRq,规模更小
    • 假如 RLWE 采取 XOF + seed 的策略,需要付出额外的计算开销(一般而言,XOF/SHAKE 的速度比 NTT 慢得多)
  2. 密文:
    • RLWE 的密文形如 ( c 0 = a ⋅ r + e 0 , c 1 = b ⋅ r + e 1 + E C C ( m ) ) ∈ R q 2 (c_0=a\cdot r+e_0,c_1=b\cdot r+e_1+ECC(m)) \in R_q^2 (c0=ar+e0,c1=br+e1+ECC(m))Rq2,包含两个环元素
    • NTRU 的密文形如 c = h ⋅ r + m ∈ R q c=h \cdot r+m \in R_q c=hr+mRq,规模更小
    • 假如 RLWE 采取 Compress 技术,实际上密文规模甚至会略小于 NTRU 的,当然这也需要付出不菲的计算开销。不过假如需要给出 “密文是正确形式” 的 ZKP(用途:MPC、可验证加密、群签名),那么 NTRU 密文的 proof 会小得多
  3. 采样:
    • RLWE 公钥中的 a ∈ R q a \in R_q aRq 需要在环 Z q \mathbb Z_q Zq 上均匀采样,然而 radix-2 NTT 限制了 q q q 不是二的幂次,因此需要拒绝采样保证均匀性
    • NTRU 公钥中的 h ∈ R q h \in R_q hRq 的均匀性,来自于两个小多项式的商 g / f g/f g/f,因此对 q q q 没有上述限制

NTRU-based 的缺点:在某些应用中(FHE、可验证加密、群签名)需要模数和噪声规模之间的 gap 足够大。但是 [ABD16] 指出,对于 “过度拉伸”(overstretched)的 NTRU 问题,子域攻击(subfield attack)相当的奏效。并且 NTRU 假设总是比 (R/M)LWE 假设更强(或者采取 [SS11] 的可证明安全变体),并且不同的安全级别下的 NTT 实现无法复用。

所以 NTRU 的参数应当仔细考虑,先要保证方案的安全性,考虑效率才有意义。

Factorization of Cyclotomic Ring

我们考虑 m = 2 k 3 l ,    k , l ≥ 1 m=2^k3^l,\,\, k,l\ge 1 m=2k3l,k,l1 的特殊分圆多项式环,维度 n = ϕ ( m ) = 2 k 3 l − 1 = m / 3 n=\phi(m)=2^k3^{l-1}=m/3 n=ϕ(m)=2k3l1=m/3,此时的分圆多项式形如:
Φ m ( x ) = x n − x n / 2 + 1 \Phi_m(x) = x^{n} - x^{n/2} + 1 Φm(x)=xnxn/2+1
我们考虑 X 2 − X + 1 X^2-X+1 X2X+1 在代数闭包上的分解 ( X − α 0 ) ⋅ ( X − α 1 ) (X-\alpha_0)\cdot(X-\alpha_1) (Xα0)(Xα1),这要求 α 0 + α 1 = 1 \alpha_0+\alpha_1=1 α0+α1=1 以及 α 0 α 1 = 1 \alpha_0\alpha_1=1 α0α1=1,我们设置 α 0 = ζ 6 \alpha_0=\zeta_6 α0=ζ6 α 1 = 1 − ζ 6 = ζ 6 5 \alpha_1=1-\zeta_6=\zeta_6^5 α1=1ζ6=ζ65,它们都是 6 6 6 次本原单位根。

只要工作域 F \mathbb F F 上存在 ζ 6 \zeta_6 ζ6,那么就有如下的环同构:
F [ x ] / ( Φ m ( x ) ) ≅ F [ x ] / ( x n / 2 − ζ 6 ) × F [ x ] / ( x n / 2 − ζ 6 5 ) \mathbb F[x]/(\Phi_m(x)) \cong \mathbb F[x]/(x^{n/2}-\zeta_6) \times\mathbb F[x]/(x^{n/2}-\zeta_6^5) F[x]/(Φm(x))F[x]/(xn/2ζ6)×F[x]/(xn/2ζ65)
给定 f ( x ) = ∑ i f i x i ∈ F [ x ] / ( Φ m ( x ) ) f(x)=\sum_i f_i x^i \in \mathbb F[x]/(\Phi_m(x)) f(x)=ifixiF[x]/(Φm(x)),具体的映射为:
f 0 ( x ) = ∑ i = 0 m / p − 1 ( f i + ζ 6 ⋅ f i + n / 2 ) ⋅ x i f 1 ( x ) = ∑ i = 0 m / p − 1 ( f i + f i + n / 2 − ζ 6 ⋅ f i + n / 2 ) ⋅ x i \begin{aligned} f_0(x) &= \sum_{i=0}^{m/p-1} \left(f_{i} + \zeta_6\cdot f_{i+n/2}\right) \cdot x^i\\ f_1(x) &= \sum_{i=0}^{m/p-1} \left(f_{i} + f_{i+n/2}- \zeta_6\cdot f_{i+n/2}\right) \cdot x^i\\ \end{aligned} f0(x)f1(x)=i=0m/p1(fi+ζ6fi+n/2)xi=i=0m/p1(fi+fi+n/2ζ6fi+n/2)xi
这个蝴蝶的开销是:一次数乘、两次加法、一次减法,基本上和 CT 蝴蝶(一次数乘、一次加法、一次减法)的效率一样。接下来,分别对两个小的卷积环执行 FFT/NTT 即可。

[LS19] 选取的参数:

  • 分园整数环 F [ X ] / ( X 768 − X 384 + 1 ) \mathbb F[X]/(X^{768}-X^{384}+1) F[X]/(X768X384+1),对应的次数 m = 2 8 × 3 2 = 2304 m=2^8\times3^2=2304 m=28×32=2304,维度 n = m / 3 = 768 n=m/3=768 n=m/3=768
  • 素域 F = Z 7681 \mathbb F=\mathbb Z_{7681} F=Z7681,对应的素数 q = 1 + 2 9 × 3 × 5 q=1+2^9\times 3\times 5 q=1+29×3×5,它含有 ζ 6 \zeta_{6} ζ6 ζ 768 ∈ { ζ 6 1 / 128 } \zeta_{768} \in \{\zeta_6^{1/128}\} ζ768{ζ61/128}
  • 特别地 7681 = 2 13 − 2 9 + 1 7681=2^{13}-2^9+1 7681=21329+1,导致存在高效的专用模约简算法(相比通用的 Barrett 算法还要更快一点)

因此,有以下的环同构:
Z 7681 [ X ] / ( X 768 − X 384 + 1 ) ≅ Z 7681 [ X ] / ( X 384 − ζ 6 ) × Z 7681 [ X ] / ( X 384 − ζ 6 5 ) Z 7681 [ X ] / ( X 384 − ζ 6 ) ≅ ∏ j = 0 128 Z 7681 [ X ] / ( X 3 − ζ 768 1 + j ⋅ 128 ) Z 7681 [ X ] / ( X 384 − ζ 6 5 ) ≅ ∏ j = 0 128 Z 7681 [ X ] / ( X 3 − ζ 768 5 + j ⋅ 128 ) \begin{aligned} \mathbb Z_{7681}[X]/(X^{768}-X^{384}+1) &\cong \mathbb Z_{7681}[X]/(X^{384}-\zeta_6) \times Z_{7681}[X]/(X^{384}-\zeta_6^5)\\ \mathbb Z_{7681}[X]/(X^{384}-\zeta_6) &\cong \prod_{j=0}^{128} \mathbb Z_{7681}[X]/(X^{3}-\zeta_{768}^{1+j\cdot128})\\ \mathbb Z_{7681}[X]/(X^{384}-\zeta_6^5) &\cong \prod_{j=0}^{128} \mathbb Z_{7681}[X]/(X^{3}-\zeta_{768}^{5+j\cdot128})\\ \end{aligned} Z7681[X]/(X768X384+1)Z7681[X]/(X384ζ6)Z7681[X]/(X384ζ65)Z7681[X]/(X384ζ6)×Z7681[X]/(X384ζ65)j=0128Z7681[X]/(X3ζ7681+j128)j=0128Z7681[X]/(X3ζ7685+j128)
第一个同构花费 1 1 1 层蝴蝶,其开销接近于 CT 蝴蝶。另外两个同构花费 7 7 7 层蝴蝶,每一层的都是 CT 蝴蝶。共计 8 8 8 层迭代,由于 Z 7681 \mathbb Z_{7681} Z7681 中不存在 ζ 2304 \zeta_{2304} ζ2304,所以最终的 deg ⁡ = 3 \deg=3 deg=3 的那些 Base Rings 无法继续分解。

InvNTT 可以直接复用 NTT,不过要注意 “比特串翻转” 导致的系数置换。或者采取 GS 蝴蝶,那就不必考虑这些置换,效率可能会更高一些。

OW-CPA NTRU

定义 modular binomial distribution 简记为 β k \beta_k βk,它的生成过程是:

  1. 均匀采样 a 1 , ⋯   , a k ,    b 1 , ⋯   , b k ← { 0 , 1 } a_1,\cdots,a_k,\,\, b_1,\cdots,b_k \gets \{0,1\} a1,,ak,b1,,bk{0,1}
  2. 输出 ∑ i a i − ∑ j b j ( m o d ± 3 ) \sum_i a_i - \sum_j b_j \pmod{^\pm3} iaijbj(mod±3)

[LS19] 采取了 β 2 \beta_2 β2 分布,本当 [ 1 , 4 , 6 , 4 , 1 ] [1,4,6,4,1] [1,4,6,4,1],模掉 3 3 3 之后,
Pr ⁡ [ − 1 ] = Pr ⁡ [ 1 ] = 5 16 ,    Pr ⁡ [ 0 ] = 6 16 \Pr[-1] = \Pr[1] = \dfrac{5}{16},\,\, \Pr[0] = \dfrac{6}{16} Pr[1]=Pr[1]=165,Pr[0]=166
如果存在 “随机性恢复”(randomness-recovering)算法 r ← R e c ( m , c , p k ) r \gets Rec(m,c,pk) rRec(m,c,pk),使得 c = E n c ( p k , m ; r ) c=Enc(pk,m;r) c=Enc(pk,m;r),我们称这个 PKE 方案是消息可验证的(message-verifiable)

简单采用 [HPS98] [HS00] 所描述的 NTRU 方案,只不过代数结构从:卷积环 Z [ X ] / ( X N − 1 ) \mathbb Z[X]/(X^N-1) Z[X]/(XN1),其中的 N N N 是素数(无法使用 FFT/NTT),替换为了:分圆环 Z [ X ] / ( Φ 2304 ( X ) ) \mathbb Z[X]/(\Phi_{2304}(X)) Z[X]/(Φ2304(X)),从而支持 FFT/NTT 算法。

在这里插入图片描述

我们额外要求 NTRU 方案的随机性恢复性质:这将使得 IND-CCA2 的归约更加紧致(仅用于此)。由于 c = h r + m c=hr+m c=hr+m,因此有
R e c ( m , c , h ) : = ( c − m ) ⋅ h − 1 ∈ R q Rec(m,c,h) := (c-m) \cdot h^{-1} \in R_q Rec(m,c,h):=(cm)h1Rq
这要求公钥 h = 3 g / f h=3g/f h=3g/f 也是可逆的。可逆性检查,就是要求 NTT 域的全部系数都是可逆的(非零)。因为 h h h 是均匀的,所以 256 256 256 Z q 3 \mathbb Z_q^3 Zq3 上系数当中存在零的概率仅为 Pr ⁡ ≤ 1 − 256 / q 3 ≈ 1 − 2 − 30 \Pr \le 1-256/q^3 \approx 1-2^{-30} Pr1256/q31230,我们完全可以在 PKE 中忽略这个检查,并不对 PKE 方案有实质影响。

Decryption Error and Message Space

OW-CPA PKE 的消息空间、随机带空间:
M = R = { f ∈ { − 1 , 0 , 1 } 768 } ⊆ Z [ X ] / ( Φ 2304 ( X ) ) M=R=\{f \in \{-1,0,1\}^{768}\} \subseteq \mathbb Z[X]/(\Phi_{2304}(X)) M=R={f{1,0,1}768}Z[X]/(Φ2304(X))
它们的分布记为 D M , D R D_M, D_R DM,DR,解密失败率:
Pr ⁡ ( s k , p k ) ← G e n , m ← D M , r ← D R [ D e c ( s k , E n c ( p k , m ; r ) ) ≠ m ] = ϵ \underset{(sk,pk)\gets Gen, m\gets D_M, r\gets D_R}{\Pr}[Dec(sk, Enc(pk,m;r)) \neq m] = \epsilon (sk,pk)Gen,mDM,rDRPr[Dec(sk,Enc(pk,m;r))=m]=ϵ
由于仅当 f c = 3 ( g r + f ′ m ) + m fc=3(gr+f'm)+m fc=3(gr+fm)+m 的绝对值越过了 q / 2 q/2 q/2,此时 Z q \mathbb Z_q Zq 无法正确模拟 Z \mathbb Z Z,出现解密错误。NIST-POC 接受的 NTRU-HRSS 和 NTRU-Prime,在它们的参数设置下,没有解密错误。[LS19] 分析了 g , r , f ′ , m g,r,f',m g,r,f,m 全都服从 β 2 \beta_2 β2 时的解密失败率:在上述 NTTRU 的参数下,错误率为 ϵ ≈ 2 − 1230 \epsilon \approx 2^{-1230} ϵ21230

但是明文空间的规模 ∣ M ∣ = 3 768 |M|=3^{768} M=3768 过于巨大。对于随机选取的 ( s k , p k ) (sk,pk) (sk,pk),存在某消息出现解密失败的概率 Pr ⁡ ≤ ϵ ⋅ ∣ M ∣ ≈ 2 − 13 \Pr \le \epsilon \cdot|M|\approx 2^{-13} PrϵM213 相当的大,这可能会导致有效的解密失败攻击(decryption-error attacks)

[LS19] 提出一种转换方法,把消息空间约简到 M ′ = { 0 , 1 } 256 M'=\{0,1\}^{256} M={0,1}256,使得 ϵ ⋅ ∣ M ∣ ≪ 2 − 128 \epsilon \cdot|M| \ll 2^{-128} ϵM2128,从而足够抵御上述攻击,达到 128 比特安全性。

在这里插入图片描述

代价是额外的 XOF 和 Hash 的计算,以及密文规模扩大了 256 256 256 比特(对称密文 u = E ( m ′ ) u=E(m') u=E(m) 部分)。可以证明,如果存在敌手访问 μ \mu μ H D M H_{D_M} HDM 之后以优势 δ \delta δ 打破 C P A ′ CPA' CPA 的安全性,那么就存在另一个敌手以优势 δ − ( μ + 1 ) / ∣ M ′ ∣ \delta-(\mu+1)/|M'| δ(μ+1)/∣M 打破 C P A CPA CPA 的安全性,
 OW-CPA big  ≤  OW-CPA small  \text{ OW-CPA big }\le\text{ OW-CPA small }  OW-CPA big  OW-CPA small 

IND-CCA2 KEM

采用 [FO13] [Den02] 的标准提升技术,可以将上述的 OW-CPA PKE 方案,转化为 IND-CCA2 KEM 方案。

在这里插入图片描述

归约流程是,

  1. 将 OW-CPA “usual” scheme 归约到 OW-CPA “message-verifiable” scheme。如果存在敌手以优势 δ \delta δ 打破后者,那么就存在另一个敌手以优势 δ \delta δ 打破前者。这里用到了算法 R e c ( ⋅ ) Rec(\cdot) Rec() 检验消息,使得归约没有损失。
  2. 将 OW-CPA “message-verifiable” scheme 归约到 IND-CCA2 KEM。如果存在敌手以优势 δ \delta δ 打破后者,那么就存在另一个敌手以优势 f ( δ ) − ϵ ⋅ ∣ M ∣ f(\delta)-\epsilon \cdot |M| f(δ)ϵM 打破前者,其中的 f f f 是线性依赖于 RO 查询次数的损失函数。

归约链:
 OW-CPA usual  ≤  OW-CPA message-verifiable  ≤  IND-CCA2 KEM \text{ OW-CPA usual }\le\text{ OW-CPA message-verifiable }\le\text{ IND-CCA2 KEM}  OW-CPA usual  OW-CPA message-verifiable  IND-CCA2 KEM

AVX2 optimized Implementation

NTT with Montgomery

Hensel remainder:给定模数 q ∈ Z + q \in \mathbb Z^+ qZ+ 和字大小 β ∈ Z + \beta \in \mathbb Z^+ βZ+,满足 gcd ⁡ ( q , β ) = 1 \gcd(q,\beta)=1 gcd(q,β)=1 以及 q < β / 2 q<\beta/2 q<β/2。任意的整数 a ∈ Z a \in \mathbb Z aZ,可以表示为 a = m q + r β a=mq+r\beta a=mq+rβ,如果限制 m ∈ [ − β / 2 , β / 2 ) m \in [-\beta/2, \beta/2) m[β/2,β/2),那么 r r r 是唯一的。

Montgomery reduction algorithm,记为 M o n t ( a , b ) = a b β − 1 ( m o d q ) Mont(a,b) = ab\beta^{-1}\pmod q Mont(a,b)=abβ1(modq)

  1. 输入 a , b ∈ [ − β / 2 , β / 2 ) a,b \in [-\beta/2,\beta/2) a,b[β/2,β/2)
  2. 计算 t : = a ⋅ b ∈ Z t:=a\cdot b \in \mathbb Z t:=abZ,它需要 O ( β 2 ) O(\beta^2) O(β2) 的存储
  3. 计算 u : = ( t + ( t ⋅ q ′ ( m o d β ) ) ⋅ q ) / β u:=(t+(t\cdot q' \pmod{\beta})\cdot q)/\beta u:=(t+(tq(modβ))q)/β,其中 q ′ : = − q − 1 ( m o d β ) q':=-q^{-1}\pmod\beta q:=q1(modβ) 是常数
  4. 输出 u ∈ [ 0 , 2 q ) u \in [0,2q) u[0,2q),它满足 u ≡ ( a ⋅ b ) ⋅ β − 1 ( m o d q ) u\equiv(a\cdot b)\cdot \beta^{-1}\pmod q u(ab)β1(modq)

我们选取 β = 2 16 \beta=2^{16} β=216(计算机的半精度),它大于 q = 7681 q=7681 q=7681 的两倍,并且和它互素。同时,step 3 中的关于 β \beta β取模、除法,被简化为了 AND、Shift

AVX2 提供了半精度乘法运算符,给定两个 16 16 16 比特整数 a , b a,b a,b(半精度数),乘积是单精度数(一个字 32 32 32 比特)

  • m u l h i ( a , b ) = a b ≫ 16 mulhi(a,b) = ab\gg16 mulhi(a,b)=ab16,带符号乘法的高半字
  • m u l l o ( a , b ) = a b ( m o d 2 16 ) mullo(a,b) = ab\pmod{2^{16}} mullo(a,b)=ab(mod216),(无符号/带符号)乘法的低半字

因此, M o n t ( a , b ) Mont(a,b) Mont(a,b) 可以优化为:

  1. 计算 t 1 : = m u l h i ( a , b ) t_1:=mulhi(a,b) t1:=mulhi(a,b),原始 t t t 的上半字
  2. 计算 t 2 : = m u l l o ( a , b ) t_2:=mullo(a,b) t2:=mullo(a,b),原始 t t t 的下半字
  3. 计算 t 2 ′ : = m u l l o ( t 2 , q ′ ) t_2':=mullo(t_2,q') t2:=mullo(t2,q),此处得到了 t ⋅ q ′ ( m o d β ) t\cdot q' \pmod{\beta} tq(modβ)
  4. 计算 u : = t 1 + m u l h i ( t 2 ′ , q ) u:= t_1+mulhi(t_2',q) u:=t1+mulhi(t2,q),两者的上半字加和

这导致了更加稠密的 AVX2 向量化(相较于单精度存储),并且节约了一些运算。

现在我们将这个模乘算法,整合到 NTT 算法中,

  1. 由于 NTT 蝴蝶中的全部乘法,都是本原根(常数 ζ \zeta ζ)和系数(变量 f f f)的乘法,因此可以预计算如下的常数:
    ζ ′ = ζ ⋅ β ( m o d q ) \zeta'=\zeta \cdot \beta \pmod q ζ=ζβ(modq)
    那么 M o n t ( f , ζ ′ ) = f ⋅ ζ ( m o d q ) Mont(f,\zeta') = f \cdot \zeta \pmod q Mont(f,ζ)=fζ(modq),这正是我们预期的模乘结果。

  2. [Sei18] 给出的另一个重要的优化是,继续再预计算如下的常数:
    ζ ′ ′ = ζ ′ ⋅ q ′ ( m o d β ) \zeta''=\zeta'\cdot q' \pmod \beta ζ′′=ζq(modβ)
    常数特化 M o n t c o n s t ( f , ζ ′ ) Mont_{const}(f,\zeta') Montconst(f,ζ) 算法步骤为,

    1. 计算 t 1 : = m u l h i ( f , ζ ′ ) t_1:=mulhi(f,\zeta') t1:=mulhi(f,ζ),半精度数
    2. 计算 t 2 : = m u l l o ( f , ζ ′ ′ ) t_2:=mullo(f,\zeta'') t2:=mullo(f,ζ′′),半精度数
    3. 计算 u : = t 1 + m u l h i ( t 2 , q ) u:= t_1+mulhi(t_2,q) u:=t1+mulhi(t2,q),半精度数
  3. 利用预计算的 ζ ′ , ζ ′ ′ \zeta',\zeta'' ζ,ζ′′,以及 M o n t c o n s t ( f , ζ ′ ) Mont_{const}(f,\zeta') Montconst(f,ζ),可以计算出正确的 NTT/InvNTT 结果。

对于蝴蝶中的模加运算,可以采取一般性的 Barrett 算法(需要一些乘法)。不过鉴于 q = 7681 q=7681 q=7681稀疏比特串表示,[Seil18] 给出了专用的模约减算法(不需要乘法),

在这里插入图片描述

NTT Vectorization

对于某一层的蝴蝶(包含若干个多项式,各自分解为长度一半的小多项式),[LS19] 采取了如下的系数打包

  1. 如果这些多项式长度是 32 32 32 的倍数(上/下阙的长度是 16 16 16 的倍数),那么将多项式的每连续 16 16 16 个半精度系数,拉取到单个 AVX256 寄存器中
  2. 如果这些多项式长度小于等于 16 16 16,就需要利用 shuffle 指令,将多个多项式的上/下阙交错在单个 AVX256 寄存器中

由于 m u l l o , m u l h i mullo, mulhi mullo,mulhi 的计算延迟是 5 5 5-cycles, a d d , s u b add, sub add,sub 的计算延迟是 1 1 1-cycle,从而优化版本的 Montgomery 的延迟是 11 11 11-cycles。为了提高利用率(乱序执行的效果不一定好),[LS19] 手动安排了 6 6 6 个 AVX256 寄存器(加载了 96 96 96 个半精度系数),它们的蝴蝶运算中的乘法是相互独立的,可以填满 CPU 流水线。

为了减少 Load 和 Store 操作(现代处理器的存储墙),[LS19] 采取了层融合技术:长度 768 768 768 的多项式迭代 3 3 3 层分解为 8 8 8 个长度 96 96 96 的多项式。对于每个长度 96 96 96 的多项式(打包在 6 6 6 个 AVX256 寄存器内),持续执行 5 5 5 层 radix-2 NTT(而非只分解一层,store 结果,再 load 下一个多项式),得到 32 32 32 个长度 3 3 3 的最终的分解结果。然后再移动到下一个多项式。

Base Rings

现在我们考虑 Base Ring 上的运算,卷积环 Z q [ X ] / ( X 3 − ζ ) \mathbb Z_q[X]/(X^3-\zeta) Zq[X]/(X3ζ)

两个元素 f = ∑ i f i ,    g = ∑ j g j f=\sum_i f_i,\,\, g=\sum_j g_j f=ifi,g=jgj 的乘积 h = f g h=fg h=fg,写成矩阵形式:
h = f ⋅ g = f ⋅ g 0 + f x ⋅ g 1 + f x 2 ⋅ g 2 = [ f 0 ζ f 2 ζ f 1 f 1 f 0 ζ f 2 f 2 f 1 f 0 ] ⋅ [ g 0 g 1 g 2 ] = [ h 0 h 1 h 2 ] \begin{aligned} h = f \cdot g &= f\cdot g_0 + fx\cdot g_1 + fx^2\cdot g_2\\ &= \begin{bmatrix} f_0 & \zeta f_2 & \zeta f_1\\ f_1 & f_0 & \zeta f_2\\ f_2 & f_1 & f_0\\ \end{bmatrix} \cdot \begin{bmatrix} g_0\\g_1\\g_2 \end{bmatrix} = \begin{bmatrix} h_0\\h_1\\h_2 \end{bmatrix} \end{aligned} h=fg=fg0+fxg1+fx2g2= f0f1f2ζf2f0f1ζf1ζf2f0 g0g1g2 = h0h1h2
使用 Montgomery 算法来计算模乘,

  1. 本原根 ζ \zeta ζ 是常数,被预计算为 ζ ′ = ζ ⋅ β ( m o d q ) \zeta'=\zeta \cdot \beta \pmod q ζ=ζβ(modq),那么 M o n t c o n s t ( f , ζ ′ ) = f ⋅ ζ Mont_{const}(f, \zeta') = f \cdot \zeta Montconst(f,ζ)=fζ 的结果是预期的
  2. 每一个系数 f i f_i fi 都要和各个 g j g_j gj 模乘,因此可以先计算每一个 f i ′ = f i ⋅ q ′ ( m o d β ) f_i'=f_i\cdot q' \pmod \beta fi=fiq(modβ),在 M o n t ( f i , g j ) Mont(f_i,g_j) Mont(fi,gj) 中复用
  3. 模乘 M o n t ( f i , g j ) Mont(f_i,g_j) Mont(fi,gj) 的结果是 f i g j ⋅ β − 1 ( m o d q ) f_ig_j\cdot \beta^{-1} \pmod q figjβ1(modq),而非预期的 f i g j f_ig_j figj,因此需要追踪记录这个因子 β − 1 ( m o d q ) \beta^{-1} \pmod q β1(modq) 的变化。在 InvNTT 结束时,和本来的因子 1 / 256 ( m o d q ) 1/256 \pmod q 1/256(modq) 合并,通过 M o n t Mont Mont 消除它们。

而对于除法 h = g / f h=g/f h=g/f,需要对 Rotation Matrix 求逆:先计算伴随矩阵,然后除以行列式。易知这个逆阵(如果存在的话)也是 Rotation Matrix,

  1. 计算伴随矩阵:简单地计算第一列的余子式
    f 0 ′ = f 0 2 − ζ f 1 f 2 f 1 ′ = ζ f 2 2 − f 0 f 1 f 2 ′ = f 1 2 − f 0 f 2 \begin{aligned} f_0' &= f_0^2 - \zeta f_1f_2\\ f_1' &= \zeta f_2^2 - f_0f_1\\ f_2' &= f_1^2 - f_0f_2 \end{aligned} f0f1f2=f02ζf1f2=ζf22f0f1=f12f0f2
    伴随矩阵 f ∗ = f 0 ′ + f 1 ′ X + f 2 ′ X 2 f^*=f_0'+f_1'X+f_2'X^2 f=f0+f1X+f2X2

  2. 计算行列式的逆:简单地计算行列式,可以简化为
    d = f 0 f 0 ′ + ζ ( f 1 f 2 ′ + f 2 f 1 ′ ) d = f_0f_0' + \zeta(f_1f_2' + f_2f_1') d=f0f0+ζ(f1f2+f2f1)
    然后计算 d − 1 = d q − 2 d^{-1}=d^{q-2} d1=dq2,利用快速幂算法

  3. 最后得到 f − 1 = d − 1 f ∗ f^{-1}=d^{-1}f^* f1=d1f,其中的所有模乘运算都采取 M o n t ( f , g ) Mont(f,g) Mont(f,g) M o n t c o n s t ( f , ζ ′ ) Mont_{const}(f,\zeta') Montconst(f,ζ) 来计算

由于 M o n t ( f , g ) Mont(f,g) Mont(f,g) 会引入一些因子 ( β − 1 ) v (\beta^{-1})^v (β1)v,我们需要追踪它们,结果是:

  • 公钥 h = 3 g / f h=3g/f h=3g/f 的因子为 β \beta β
  • 密文 h r hr hr 的因子恰好为 1 1 1,于是可以直接和 m m m 相加
  • 解密 f c fc fc 的因子为 β − 1 \beta^{-1} β1,在 InvNTT 的结尾我们计算 M o n t ( m , β ⋅ ( β ⋅ 25 6 − 1 ) ( m o d q ) ) Mont(m, \beta\cdot(\beta\cdot256^{-1}) \pmod q) Mont(m,β(β2561)(modq)) 消掉它们

也使用 AVX2 实现这些 Base Ring 上的运算。那么环 Z 7681 [ X ] / ( X 768 − X 384 + 1 ) \mathbb Z_{7681}[X]/(X^{768}-X^{384}+1) Z7681[X]/(X768X384+1) 上的多项式运算:NTT,InvNTT,小环 Z 7681 [ X ] / ( X 3 − ζ ) \mathbb Z_{7681}[X]/(X^3-\zeta) Z7681[X]/(X3ζ) 上的乘法、除法,它们的计算速度都是极快的。这导致效率瓶颈,反而是 Sample、Hash、XOF、Pack/Unpack 这些运算。

Binomial Sampling

为了快速采样 β 2 = ( a 1 + a 2 ) − ( b 1 + b 2 ) ( m o d ± 3 ) \beta_2=(a_1+a_2)-(b_1+b_2)\pmod{^\pm3} β2=(a1+a2)(b1+b2)(mod±3),[LS19] 采取查表的方法。构造如下的 LUT,它是长度为 16 16 16 的向量:

( a 1 a 2 b 1 b 2 ) 2 (a_1a_2b_1b_2)_2 (a1a2b1b2)2 β 2 \beta_2 β2
0 = 0000 0=0000 0=0000 0 0 0
1 = 0001 1=0001 1=0001 − 1 -1 1
2 = 0010 2=0010 2=0010 − 1 -1 1
3 = 0011 3=0011 3=0011 1 1 1
14 = 1110 14=1110 14=1110 1 1 1
15 = 1111 15=1111 15=1111 0 0 0

由于 β 2 \beta_2 β2 取值 { − 1 , 0 , 1 } \{-1,0,1\} {1,0,1} 只花费 2 2 2 比特,因此上述的 LUT 可以被存储为一个字 T T T,采样算法就是:产生均匀的四比特 i = ( a 1 a 2 b 1 b 2 ) 2 i=(a_1a_2b_1b_2)_2 i=(a1a2b1b2)2,然后简单的 shift,
β 2 [ a 1 , a 2 , b 2 , b 2 ] = ( T ≫ ( 2 i ) ) [ 0 ] \beta_2[a_1,a_2,b_2,b_2] = \left(T \gg (2i)\right)[0] β2[a1,a2,b2,b2]=(T(2i))[0]
考虑到表格的对称性 β 2 [ i ] = − β 2 [ 15 − i ] \beta_2[i]=-\beta_2[15-i] β2[i]=β2[15i],实际上 LUT 可以被存储为半个字( 16 16 16 比特),从而一个 AVX256 寄存器中可以填入 16 16 16 张表,以 16 16 16 路并行的方式快速采样。不过 AVX2 不支持半精度整数的移位,所以还需要把 LUT 重排一下。

Symmetric Primitives

为了生成 f , g , r f,g,r f,g,r,我们使用 XOF 对某个 seed 做扩展,然后调用上述的 Binomial Sampler 执行各个系数的采样。但是 SHAKE 的速度很慢(相对于 NTT 而言),所以 [LS19] 选用了 CTR-mode AES 作为 XOF

在 KEM 的封装算法中,需要计算两个哈希 r ← H D R ( m ) r \gets H_{D_R}(m) rHDR(m) k ← H K ( m ) k \gets H_{K}(m) kHK(m),[LS19] 使用 SHA512 合并地计算出 512 512 512 比特的摘要,然后各自设置 r , k ∈ { 0 , 1 } 256 r,k \in \{0,1\}^{256} r,k{0,1}256 是它的各一半。

Vectorized Packing

由于 q = 7681 ≈ 2 13 q=7681 \approx 2^{13} q=7681213,因此我们将多项式的每 8 8 8 个系数(本来占据 16 16 16 字节),打包到连续的 13 13 13 字节,减少通信开销。这个打包过程也是极慢的,如果不进行 AVX2 优化,它甚至比 SHA3 的速度还要慢。

鉴于 AVX256 寄存器是连续读取,[LS19] 间隔 16 16 16 提取 8 8 8 个系数(而非连续的 8 8 8 个系数),将它们打包在一起。于是可以将 16 × 8 16 \times 8 16×8 个系数,连续读取到 8 8 8 个 AVX256 寄存器中(每个寄存器加载连续的 16 16 16 个系数),然后并行地打包,得到 16 16 16 个长度 13 13 13 字节的打包结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1206800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

⛳面试题-简述并分析ThreadLocalMap的key为什么是弱引用

⛳目录 简述 ThreadLocalMap 的 key 为弱引用的原因&#xff1a;分析&#xff1a;注意 &#xff1a; ThreadLocalMap 是 Java 中与 ThreadLocal 相关的一个重要类&#xff0c;用于在每个线程中存储和访问线程本地变量。在 ThreadLocalMap 中&#xff0c;key 为弱引用的主要原因…

ModuleNotFoundError_ No module named ‘Crypto‘

当要使用 python 进行加密数据的时候报错了 from Crypto.Util.Padding import pad, unpad from Crypto.Cipher import AES报错 File "F:\huisu.py", line 1, in <module>from Crypto.Util.Padding import pad, unpad ModuleNotFoundError: No module named Cr…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的&#xff0c;但是一测试发现只有200M&#xff0c;把电信叼了过来&#xff0c; 一测试发现宽带没问题&#xff0c;网线正常&#xff0c;网卡正常&#xff0c;只有可能是路由器的问题了&#xff0c;尴尬了&#xff0c;赶紧给满意好评放他走。回头好好研究一…

企业年报API:打开企业经营大数据的新视角

引言 随着数字化转型的深入推进&#xff0c;企业年报API作为企业信息化建设中的重要组成部分&#xff0c;受到了越来越多企业和机构的关注和重视。而且&#xff0c;随着中国经济的快速发展&#xff0c;企业年报也成为投资者、监管机构以及相关利益方了解企业经营状况的重要途径…

数据库管理-第116期 Oracle Exadata 06-ESS-下(202301114)

数据库管理-第116期 Oracle Exadata 06-ESS-下&#xff08;202301114&#xff09; 距离上一次正儿八经的技术分享又过了整整一周了&#xff0c;距离上一期Exadata专题文章也过了11天了&#xff0c;今天一鼓作气把ESS写完&#xff0c;毕竟明天又要飞北京了。 1 Smart Scan 其…

H5三网魔幻手游【众神传奇】win服务端+GM授权后台+架设教程

搭建资源下载地址&#xff1a;H5三网魔幻手游【众神传奇】win服务端GM授权后台架设教程-海盗空间

安全好用性价比高的远程协同运维软件有吗?

据悉不少IT专业人员认为&#xff0c;远程运维风险性更高&#xff0c;更容易给企业带来更大的风险。所以不少运维人员都在求一款安全好用性价比高的远程协同运维软件&#xff0c;因为下班需要&#xff0c;因为碰到IT难题时候需要&#xff0c;因为驻场需要。那你知道市面上安全好…

macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导

导读Asahi Linux 是一个致力于为 Apple Silicon 设备带来 Linux 支持的项目&#xff0c;日前有用户反馈称&#xff0c;若在相关设备上安装了 macOS 13.6-14&#xff0c;再安装 Asahi Linux &#xff0c;就会导致系统引导失败&#xff0c;出现“黑屏”情况。 目前 Asahi Linux 项…

程序猿的护城河是什么

文章目录 什么类型的程序员容易被淘汰&#xff1f;T型人才往底层学抛弃焦虑&#xff0c;无所畏惧地往前冲。多看多想多实践 什么类型的程序员容易被淘汰&#xff1f; 微信前首席技术负责人张绍文说过&#xff1a; “坦白说&#xff0c;现在很多移动开发工程师更像是 API工程师…

uniapp运行到安卓模拟器一直在“同步手机端程序文件完成“界面解决办法

如果你是用的模拟器是android studio创建的模拟器&#xff0c;那么你需要新创建一个android11 x86架构的模拟器&#xff1a; 创建完成后&#xff0c;启动模拟器&#xff1a; 然后在hbuilder中重新运行到这个模拟器就可以了&#xff1a; 运行结果&#xff1a; 如果你是用安…

三相无刷直流电机预驱动芯片GC4939,采用QFN28封装,内置过温保护,过压监测,同步整流等功能

三相无刷直流电机预驱动芯片GC4939。它可以驱动 N 型功率 MOSFET&#xff0c; 最高电源到 36V。芯片状态切换逻辑受三个 相位差为 120的霍尔输入确定。 芯片集成固定衰减时间的脉冲调制来控 制电流并且抑制励磁涌流&#xff1b;堵转保护时间可 调&#xff1b;过温保护&#xff…

探索数据湖和大数据在亚马逊云服务云存储服务上的威力

文章作者&#xff1a;Libai 引言 在当今数字化的环境中&#xff0c;组织生成的数据量正以前所未有的速度增长。数据量的激增催生了对高效存储和管理解决方案的需求。数据湖和亚马逊云服务云存储服务上的大数据是一个强大的组合&#xff0c;使组织能够充分发挥其数据的潜力。 亚…

【ArcGIS Pro微课1000例】0031:las点云提取(根据范围裁剪点云)

本文讲解ArcGIS Pro3.0中,las点云数据的提取(根据范围裁剪点云)方法。 文章目录 一、加载数据二、工具介绍三、点云裁剪一、加载数据 打开ArcGIS Pro,新建地图,加载配套实验数据包中的0031.rar中的点云数据point.las与范围bound.shp,如下图所示: 二、工具介绍 名称:提…

振南技术干货集:研发版本乱到“妈不认”? Git!(5)

注解目录 1、关于 Git 1.1Git 今生 (Git 和 Linux 的生父都是 Linus&#xff0c;振南给你讲讲当初关于 Git 的爱恨情愁&#xff0c;其背后其实是开源与闭源两左阵营的明争暗斗。) 1.2Git的爆发 (Git 超越时代的分布式思想。振南再给你讲讲旧金山三个年轻人创办 GitHub&…

StackExchange.Redis 高并发下timeout超时问题如何解决?

查看服务端程序负载还行&#xff0c;根据打印的连接看到一知半懂&#xff0c;按GitHub的issue提示&#xff0c;这2个Busy的数量不能比Min的大&#xff0c;即要提示Min的数值; 的各个字段&#xff1a; Timeout performing EXEC (1000ms): 表示在执行一个事务&#xff08;MULTI..…

史上最强AI芯片!英伟达H200震撼来袭!141 GB 超大显存,Llama2推理性能翻倍,老黄赢麻了!

原创 作者 | 王二狗英伟达又一次打了所有人措手不及&#xff01; 就在昨晚&#xff0c;老黄发布了新一代史上最强 AI芯片 NVIDIA HGX™ H200 。 141 GB 超大显存&#xff01;带宽增加 2.4 倍 H200 拥有141GB 显存&#xff01;相比之前的 H100和A100&#xff0c;容量几乎翻倍&…

css实现元素四周阴影

前言 首先确定的是需要使用box-shadow这一属性 语法如下&#xff1a; box-shadow: h-shadow v-shadow blur spread color inset; h-shadow&#xff1a;表示水平方向上的阴影偏移量&#xff0c;必须指明&#xff0c;可以是正数、负数、0&#xff0c;如果为正数左方有阴影&…

Cesium 展示——根据鼠标移动,线实体也跟着移动

文章目录 需求分析需求 如图所示,点击第一个点后鼠标移动,实现线实体跟着鼠标移动而移动 分析 创建初始化点实体和线实体更改线实体的坐标let centerPoint; // 用于存储圆心位置 let lineEntity;//存储绘制的线条 const that = this; this.handler

【工具使用】卸载VS(Visual Studio)

目录 方法一&#xff1a;使用TotalUninstaller工具方法二&#xff1a;官网的卸载方法 方法一&#xff1a;使用TotalUninstaller工具 下载地址&#xff1a;https://github.com/Microsoft/VisualStudioUninstaller/releases 1.点击下载地址&#xff0c;选择TotalUninstaller进行…

单独设置echarts图例样式

参考&#xff1a;echarts-legend legend: [{data: [{name: 正常,icon: rect}],itemWidth: 16,itemHeight: 4,top: 6%,left: 35%,textStyle: {color: #626C78,fontSize: 14}},{data: [{name: 异常,icon: rect}],itemWidth: 16,itemHeight: 4,top: 6%,left: 50%,textStyle: {col…