提示:Kyber中的NTT(Number Theoretic Transforms)
NTT(Number Theoretic Transforms)(一)
前言
数论变换(number-theoretic transform, NTT)是离散傅里叶变换(DFT)在数论基础上的实现;快速数论变换(fast number-theoretic transform, FNTT)是 快速傅里叶变换(FFT)在数论基础上的实现。针对具有代数结构的格密码算法,其中的多项式乘法为主要的核心算子,目前多数具有代数结构的格密码算法均通过NTT进行多项式乘法加速。本文以NIST公布的标准算法Kyber为例,以此介绍NTT算法的实现原理。
一、中国剩余定理(CRT)
Kyber中的多项式乘法均取自多项式环 R q = Z q / ( x n + 1 ) R_q=\Z_q/(x^{n}+1) Rq=Zq/(xn+1),其中第三轮的Kyber中 q = 3329 = 2 8 + 1 q=3329=2^8+1 q=3329=28+1, n = 256 n=256 n=256。由于 256 ∣ ∣ ( q − 1 ) 256||(q-1) 256∣∣(q−1),所以有限域 Z q \Z_q Zq中存在256次本原单位根,但不存在512次本原单位根,因此 ( x n + 1 ) m o d q (x^{n}+1)\ mod\ q (xn+1) mod q可分解为128个二次多项式。令 ζ = 17 ζ=17 ζ=17为该256次本原单位根,因此 ζ , ζ 3 , ζ 5 , ⋯ , ζ 255 ζ,ζ^3,ζ^5,⋯,ζ^{255} ζ,ζ3,ζ5,⋯,ζ255便为 Z q \Z_q Zq中所有的256次单位根,固有如下式子:
x n + 1 = ( x 2 − ζ ) ( x 2 − ζ 3 ) ⋯ ( x 2 − ζ 255 ) m o d q x^n+1=(x^2-ζ)(x^2-ζ^3 )⋯(x^2-ζ^{255})\ mod \ q xn+1=(x2−ζ)(x2−ζ3)⋯(x2−ζ255) mod q于是由中国剩余定理有: Z q / ( x 256 + 1 ) = Z q / ∏ i = 0 127 ( x 2 − ζ 2 i + 1 ) ≅ Z q / ( x 2 − ζ ) ⨂ ⋯ ⨂ Z q / ( x 2 − ζ 255 ) \Z_q/(x^{256}+1)=\Z_q/\prod \limits_{i=0}^{127}(x^2-ζ^{2i+1}) ≅\Z_q/(x^2-ζ)⨂⋯⨂Z_q/(x^2-ζ^{255}) Zq/(x256+1)=Zq/i=0∏127(x2−ζ2i+1)≅Zq/(x2−ζ)⨂⋯⨂Zq/(x2−ζ255) 具体的分解过程可通过平方差公式得到更详细的分解过程,首先 Z q / ( x 256 + 1 ) \Z_q/(x^{256} +1) Zq/(x256+1),由于 ζ 256 = 1 \zeta^{256}=1 ζ256=1,所以 ζ 128 = − 1 \zeta^{128}=-1 ζ128=−1,于是有 Z q / ( x 256 + 1 ) = Z q / ( x 256 − ζ 128 ) \Z_q/(x^{256}+1)=\Z_q/(x^{256}-\zeta^{128}) Zq/(x256+1)=Zq/(x256−ζ128),由平方差公式便有
Z q / ( x 256 − ζ 128 ) ≅ Z q / ( x 2 − ζ 64 ) ⊗ Z q / ( x 2 − ζ 192 ) \Z_q/(x^{256}-ζ^{128})≅\Z_q/(x^2-ζ^{64})\otimes\Z_q/(x^2-ζ^{192}) Zq/(x256−ζ128)≅Zq/(x2−ζ64)⊗Zq/(x2−ζ192)其中 Z q / ( x 2 − ζ 192 ) \Z_q/(x^2-ζ^{192}) Zq/(x2−ζ192)是由 x 2 + ζ 64 = x 2 − ζ 128 ⋅ ζ 64 x^2+ζ^{64}=x^2-ζ^{128}\cdot ζ^{64} x2+ζ64=x2−ζ128⋅ζ64得来。由此继续向下利用平方差公式进行分解,直到最后的
Z q / ( x 2 − ζ 2 b r v ( 0 ) + 1 ) ⊗ Z q / ( x 2 − ζ 2 b r v ( 1 ) + 1 ) ⊗ ⋯ ⊗ Z q / ( x 2 − ζ 2 b r v ( 127 ) + 1 ) \Z_q/(x^2-\zeta^{2brv(0)+1})\otimes\Z_q/(x^2-\zeta^{2brv(1)+1})\otimes⋯\otimes\Z_q/(x^2-\zeta^{2brv(127)+1}) Zq/(x2−ζ2brv(0)+1)⊗Zq/(x2−ζ2brv(1)+1)⊗⋯⊗Zq/(x2−ζ2brv(127)+1) 便不可再分。其中 b r v ( i ) brv(i) brv(i)表示为 i i i的 log n − 1 \log n-1 logn−1位二进制表示比特翻转,即Kyber文档中的 b r 7 ( i ) br_7 (i) br7(i)。比特翻转的顺序结果是由于每次对第二个加的式子使用平方差公式时均需要乘上 ζ 128 \zeta^{128} ζ128使其变成满足平方差公式的形式。详见下图(图片来源于知乎)。
故Kyber中多项式可表示为:
( f m o d ( x 2 − ζ ) , f m o d ( x 2 − ζ 2 b r v ( 1 ) + 1 ) , ⋯ , f m o d ( x 2 − ζ 2 b r v ( 127 ) + 1 ) ) (f\ mod\ (x^2-ζ), f\ mod\ (x^2-ζ^{2brv(1)+1}),⋯, f\ mod\ (x^2-ζ^{2brv(127)+1})) (f mod (x2−ζ),f mod (x2−ζ2brv(1)+1),⋯,f mod (x2−ζ2brv(127)+1))
所以f(x)的NTT表示为:
N T T ( f ) = f ^ ( x ) = f ^ 0 + f ^ 1 x + ⋯ + f ^ 255 x 255 NTT(f)=\hat f(x)=\hat f _0+\hat f _1 x+⋯+\hat f _{255} x^{255} NTT(f)=f^(x)=f^0+f^1x+⋯+f^255x255
其中:
f ^ 2 i = ∑ j = 0 127 f 2 j ⋅ ζ ( 2 b r v ( i ) + 1 ) j ; \hat f_{2i}=\sum\limits_{j=0}\limits^{127}f_{2j}\cdot \zeta^{(2brv(i)+1)j}; f^2i=j=0∑127f2j⋅ζ(2brv(i)+1)j; f ^ 2 i + 1 = ∑ j = 0 127 f 2 j + 1 ⋅ ζ ( 2 b r v ( i ) + 1 ) j . \hat f_{2i+1}=\sum\limits_{j=0}\limits^{127}f_{2j+1}\cdot \zeta^{(2brv(i)+1)j}. f^2i+1=j=0∑127f2j+1⋅ζ(2brv(i)+1)j.也可表示为:
N T T ( f ) = f ^ ( x ) = ( f ^ 0 + f ^ 1 x , f ^ 2 + f ^ 3 x , ⋯ , f ^ 254 + f ^ 255 x ) . NTT(f)=\hat f (x)=(\hat f_0+\hat f_1 x,\hat f_2+\hat f_3 x,⋯,\hat f _{254}+\hat f_{255}x). NTT(f)=f^(x)=(f^0+f^1x,f^2+f^3x,⋯,f^254+f^255x).
于是 h ( x ) = f ( x ) ⋅ g ( x ) h(x)=f(x)\cdot g(x) h(x)=f(x)⋅g(x)利用NTT计算便为:
h ^ ( x ) = f ^ ( x ) ⋅ g ^ ( x ) = ( h ^ 0 + h ^ 1 x , h ^ 2 + h ^ 3 x , ⋯ , h ^ 254 + h ^ 255 x ) . \hat h(x)=\hat f(x)\cdot \hat g(x)=(\hat h_0+\hat h_1 x,\hat h_2+\hat h_3 x,⋯,\hat h_{254}+\hat h_{255}x). h^(x)=f^(x)⋅g^(x)=(h^0+h^1x,h^2+h^3x,⋯,h^254+h^255x).其中:
h ^ 2 i + h ^ 2 i + 1 x = ( f ^ 2 i + f ^ 2 i + 1 x ) ⋅ ( g ^ 2 i + g ^ 2 i + 1 x ) m o d x 2 − ζ 2 i + 1 \hat h_{2i}+\hat h_{2i+1} x=(\hat f_{2i}+\hat f_{2i+1}x)\cdot(\hat g_{2i}+\hat g_{2i+1} x) \ mod\ x^2-ζ^{2i+1} h^2i+h^2i+1x=(f^2i+f^2i+1x)⋅(g^2i+g^2i+1x) mod x2−ζ2i+1故
h ^ 2 i = f ^ 2 i ⋅ g ^ 2 i + f ^ 2 i + 1 ⋅ g ^ 2 i + 1 ⋅ ζ 2 i + 1 ; \hat h_{2i}=\hat f_{2i}\cdot \hat g_{2i}+\hat f_{2i+1}\cdot \hat g_{2i+1}\cdot \zeta^{2i+1}; h^2i=f^2i⋅g^2i+f^2i+1⋅g^2i+1⋅ζ2i+1; h ^ 2 i + 1 = f ^ 2 i ⋅ g ^ 2 i + 1 + f ^ 2 i + 1 ⋅ g ^ 2 i . \hat h_{2i+1}=\hat f_{2i}\cdot \hat g_{2i+1}+\hat f_{2i+1}\cdot \hat g_{2i}. h^2i+1=f^2i⋅g^2i+1+f^2i+1⋅g^2i.那么如何快速的计算 f ^ 2 i \hat f_{2i} f^2i和 f ^ 2 i + 1 \hat f_{2i+1} f^2i+1以及其逆变换呢?这可以从快速傅里叶变换(FFT)中得到启发。
二、离散傅里叶变换(DFT)
n − 1 n-1 n−1次多项式有两种表述方式,一种便是由 n n n个系数直接写出,另一种便是利用插值多项式原理, n n n个不同变量的函数值唯一决定了一个多项式。即 f ( x ) f(x) f(x)可以表示为 f 0 + f 1 x + ⋯ + f n − 1 x n − 1 f_0+f_1 x+⋯+f_{n-1} x^{n-1} f0+f1x+⋯+fn−1xn−1,也可表述为满足 n n n个函数值对 ( x 0 , f ( x 0 ) ) , ⋯ , ( x n − 1 , f ( x n − 1 ) ) (x_0,f(x_0)),⋯,(x_{n-1},f(x_{n-1})) (x0,f(x0)),⋯,(xn−1,f(xn−1))的 n − 1 n-1 n−1多项式,其中 x i ≠ x j x_i\neq x_j xi=xj, i ≠ j i\neq j