后量子签名:Hash-and-Sign(下篇)

书接上回

整数格上离散高斯采样

无论是 [Klein00] 还是 [DP16],它们的采样算法都需要以 S a m p l e Z Sample\mathbb Z SampleZ 作为最底层的部件。由于 S a m p l e Z Sample\mathbb Z SampleZ 是在截尾了的区间 [ c − t ( n ) ⋅ s , c + t ( n ) ⋅ s ] [c-t(n) \cdot s, c+t(n) \cdot s] [ct(n)s,c+t(n)s] 上执行拒绝采样算法生成与 D Z , s , c D_{\mathbb Z,s,c} DZ,s,c 统计接近的近似分布,因此各种采样算法,要么需要高精度的 ρ s ( x ) \rho_s(x) ρs(x) 计算器(或者说 e x p ( x ) exp(x) exp(x) 计算器),要么需要一张巨大的高精度的高斯密度分布表(或者 e x p ( x ) exp(x) exp(x) 预计算表),在代码实现时会遇到开销过大、存在侧信道攻击等问题。在实用化格签名的设计中,安全且高效的整数格 Z \mathbb Z Z 上的离散高斯采样算法,也是一个关键部分。

二进制离散高斯采样器

[BLISS] 首先考虑了整数格 Z \mathbb Z Z 上的特殊离散高斯分布 D σ 0 D_{\sigma_0} Dσ0,它的标准差为 σ 0 = 1 / ( 2 ln ⁡ 2 ) \sigma_0 = \sqrt{1/(2\ln 2)} σ0=1/(2ln2) ,此时的高斯函数为
ρ σ 0 ( x ) = e x p ( − x 2 2 σ 0 2 ) = 2 − x 2 \rho_{\sigma_0}(x) = exp(-\dfrac{x^2}{2\sigma_0^2}) = 2^{-x^2} ρσ0(x)=exp(2σ02x2)=2x2
我们考虑半高斯分布 D σ + : = { x ← D σ ∣ x ≥ 0 } D_{\sigma}^+ := \{x \leftarrow D_{\sigma} \mid x \ge 0\} Dσ+:={ xDσx0},它的密度函数为 ρ σ ( x ) / ρ σ ( Z + ) \rho_\sigma(x)/\rho_\sigma(\mathbb Z^+) ρσ(x)/ρσ(Z+)。那么可以计算出 D σ 0 + D_{\sigma_0}^+ Dσ0+ 的归一化因子为
ρ σ 0 ( Z + ) = ∑ i = 0 ∞ 2 − i 2 = 1.1001 0000 ⏟ 2 i − 2 1 i ⏞ 2 i − 1 0 ⋯ 010 ⋯ \rho_{\sigma_0}(\mathbb Z^+) = \sum_{i=0}^\infty 2^{-i^2} = 1.1001\overbrace{\underbrace{0000}_{2i-2}\underset{i}{1}}^{2i-1}0\cdots010\cdots ρσ0(Z+)=i=02i2=1.10012i2 0000i1 2i10010
所以对于这个特殊的分布 D σ 0 + D_{\sigma_0}^+ Dσ0+,它的拒绝采样算法只需要无偏的伯努利掷硬币 B 1 / 2 \mathcal B_{1/2} B1/2,也就是单比特均匀分布 U 1 \mathcal U_1 U1。基采样器 B a s e S a m p l e BaseSample BaseSample 的描述如下:

  1. 掷硬币 b ← U 1 b \leftarrow \mathcal U_1 bU1,如果 b = 0 b=0 b=0 则输出 i = 0 i=0 i=0,否则继续执行后续步骤
  2. 对于 i = 1 , 2 , ⋯   , ∞ i=1,2,\cdots,\infty i=1,2,,,依次执行
    1. 掷硬币 [ b 1 , ⋯   , b 2 i − 1 ] ← U 2 i − 1 [b_1,\cdots,b_{2i-1}] \leftarrow \mathcal U_{2i-1} [b1,,b2i1]U2i1
    2. 如果 [ b 1 , ⋯   , b 2 i − 2 ] ≠ 0 ⃗ [b_1,\cdots,b_{2i-2}] \neq \vec 0 [b1,,b2i2]=0 ,此时这些硬币的累计概率已经越过了 ρ σ 0 ( Z + ) \rho_{\sigma_0}(\mathbb Z^+) ρσ0(Z+),程序返回 step 1 重新执行
    3. 如果 [ b 1 , ⋯   , b 2 i − 2 ] = 0 ⃗ [b_1,\cdots,b_{2i-2}] = \vec 0 [b1,,b2i2]=0 ,当 b 2 i − 1 = 0 b_{2i-1}=0 b2i1=0 时输出 i i i,否则进入下一轮循环

对比算法 B a s e S a m p l e BaseSample BaseSample 中掷硬币的概率以及归一化因子 ρ σ 0 ( Z + ) \rho_{\sigma_0}(\mathbb Z^+) ρσ0(Z+),容易看出这个采样算法的输出结果恰好就是 D σ 0 + D_{\sigma_0}^+ Dσ0+(统计距离为零),并且掷无偏的伯努利硬币是十分容易的(均匀分布)。回顾下 [GPV08] 的 S a m p l e Z Sample\mathbb Z SampleZ 的输出分布与 D σ D_\sigma Dσ 的统计距离非零,而且需要先计算高斯函数 p = ρ s ( x − c ) p=\rho_s(x-c) p=ρs(xc) 再按照伯努利分布 B p \mathcal B_p Bp 掷硬币。这个特殊的采样算法 B a s e S a m p l e BaseSample BaseSample 可以被特别高效地实现,额外掷一个硬币 s ← U s \leftarrow \mathcal U sU 作为高斯样本的符号位,并以 1 2 \dfrac{1}{2} 21 的概率拒绝 ( − 1 ) s x = 0 (-1)^sx=0 (1)sx=0 的样本(确保中心 0 0 0 的密度函数只计算了一次),那么就得到了离散高斯分布 D σ 0 D_{\sigma_0} Dσ0 的二进制采样器。

使用这个二进制采样器,[BLISS] 通过拒绝采样技术,将 D σ 0 D_{\sigma_0} Dσ0 提升到任意的离散高斯分布 D k σ 0 , ∀ k ∈ Z + D_{k\sigma_0},\forall k \in \mathbb Z^+ Dkσ0,kZ+。我们令 z = k x + y ∈ Z z=kx+y \in \mathbb Z z=kx+yZ,其中 x ← D σ 0 x \leftarrow D_{\sigma_0} xDσ0,并用 y ∈ { 0 , 1 , ⋯   , k − 1 } y \in \{0,1,\cdots,k-1\} y{ 0,1,,k1} 来填充空隙,那么
ρ k σ 0 ( z ) = exp ⁡ ( − ( k x + y ) 2 2 ( k σ 0 ) 2 ) = exp ⁡ ( − x 2 2 σ 0 2 − y ( 2 k x + y ) 2 ( k σ 0 ) 2 ) = ρ σ 0 ( x ) ⋅ exp ⁡ ( − y ( 2 k x + y ) 2 ( k σ 0 ) 2 ) \begin{aligned} \rho_{k\sigma_0}(z) &= \exp\left(-\dfrac{(kx+y)^2}{2(k\sigma_0)^2}\right)\\ &= \exp\left(- \dfrac{x^2}{2\sigma_0^2} - \dfrac{y(2kx+y)}{2(k\sigma_0)^2}\right)\\ &= \rho_{\sigma_0}(x) \cdot \exp\left(-\dfrac{y(2kx+y)}{2(k\sigma_0)^2}\right) \end{aligned} ρkσ0(z)=exp(2(kσ0)2(kx+y)2)=exp(2σ02x22(kσ0)2y(2kx+y))=ρσ0(x)exp(2(kσ0)2y(2kx+y))
因此,我们均匀采样 y ← U ( [ k ] ) y \leftarrow \mathcal U([k]) yU([k]),使用基采样器获得 x ← D σ 0 x \leftarrow D_{\sigma_0} xDσ0,计算出 z = k x + y z=kx+y z=kx+y,然后按照概率 p = exp ⁡ ( − y ( 2 k x + y ) 2 ( k σ 0 ) 2 ) p=\exp\left(-\frac{y(2kx+y)}{2(k\sigma_0)^2}\right) p=exp(2(kσ0)2y(2kx+y)) z z z 执行拒绝采样。实际上我们按照伯努利分布 B p \mathcal B_p Bp 来采样 b ∈ { 0 , 1 } b \in \{0,1\} b{ 0,1},如果 b = 1 b=1 b=1 则输出 z z z,否则拒绝此样本,并重新启动采样程序。

伯努利采样器

接下来的一个问题就是如何高精度地采样伯努利分布 B p \mathcal B_p Bp,其中 p p p 是指数函数。一种常规方法是实时计算高精度的 exp ⁡ ( − t ) \exp(-t) exp(t) 函数,另一种方法是预计算一张高精度的 exp ⁡ ( − t ) \exp(-t) exp(t) 表格。然而前者将消耗巨大的计算资源,而后者将带来巨大的存储开销。

[BLISS] 观察到伯努利分布实际上有一些组合性质:
B a ⋅ b = B a ∧ B b ,     B a + b − a ⋅ b = B a ∨ B b \mathcal B_{a \cdot b} = \mathcal B_a \wedge \mathcal B_b,\,\,\, \mathcal B_{a+b-a \cdot b} = \mathcal B_a \vee \mathcal B_b Bab=BaBb,Ba+bab=BaBb
因此对于 t = ∑ i 2 i t i t = \sum_i 2^it_i t=i2iti,其中 t i ∈ { 0 , 1 } t_i \in \{0,1\} ti{ 0,1},令 f f f 是某固定常数,则有
B exp ⁡ ( − t / f ) = B exp ⁡ ( − ∑ i 2 i t i / f ) = B ∏ t i = 1 exp ⁡ ( − 2 i / f ) = ⋀ t i = 1 B exp ⁡ ( − 2 i / f ) \mathcal B_{\exp(-t/f)} = \mathcal B_{\exp(-\sum_i 2^it_i/f)} = \mathcal B_{\prod_{t_i=1}\exp(-2^i/f)} = \bigwedge_{t_i=1} \mathcal B_{\exp(-2^i/f)} Bexp(t/f)=Bexp(i2iti/f)=Bti=1exp(2i/f)=ti=1Bexp(2i/f)
假设 t t t 的精度是 l l l 比特,我们预计算 exp ⁡ ( − 2 i / f ) , ∀ i = 0 , 1 , ⋯   , l − 1 \exp(-2^i/f),\forall i=0,1,\cdots,l-1 exp(2i/f),i=0,1,,l1 的表格(存储规模仅是精度的对数级别)。将输入值 t t t 做二进制分解,然后对于每个 t i t_i ti 依次采样 b i ← B exp ⁡ ( − 2 i / R ) b_i \leftarrow \mathcal B_{\exp(-2^i/R)} biBexp(2i/R),输出 b = ⋀ t i = 1 b i b=\bigwedge_{t_i=1}b_i b=ti=1bi。对于 AND 逻辑,只要有一项是逻辑 0 0 0,那么它们的 AND 就是逻辑 0 0 0,因此可以提前终止。然而为了抵御计时攻击,我们应当给出一个常数时间的采样程序,因此应当对每个 i = 0 , ⋯   , l − 1 i=0,\cdots,l-1 i=0,,l1 都执行 b i ← B exp ⁡ ( − 2 i / f ) b_i \leftarrow \mathcal B_{\exp(-2^i/f)} biBexp(2i/f),而非仅仅只对 t i = 1 t_i=1 ti=1 的那些位置采样,也不应该提前结束 AND 逻辑运算。

与 [BLISS] 的查表策略不同,[ZSS19] 使用了另一个策略:直接计算指数函数。对于 σ 0 = 1 / ( 2 ln ⁡ 2 ) \sigma_0=\sqrt{1/(2\ln 2)} σ0=1/(2ln2) ,简记 t = y ( 2 k x + y ) t=y(2kx+y) t=y(2kx+y),则 [BLISS] 的拒绝概率 p = exp ⁡ ( − y ( 2 k x + y ) 2 ( k σ 0 ) 2 ) = 2 − t / k 2 p=\exp\left(-\frac{y(2kx+y)}{2(k\sigma_0)^2}\right)=2^{-t/k^2} p=exp(2(kσ0)2y(2kx+y))=2t/k2,其中 a = t / k 2 ∈ R a=t/k^2 \in \mathbb R a=t/k2R 可以写成 a = s + r a=s + r a=s+r 的形式,其中 s ∈ Z s \in \mathbb Z sZ r ∈ [ 0 , 1 ) r \in [0,1) r[0,1),于是概率 p p p 可以分解为两部分
p = 2 − t / k 2 = 2 − s ⋅ 2 − r p = 2^{-t/k^2} = 2^{-s} \cdot 2^{-r} p=2t/k2=2s2r
由于计算机中浮点数以二进制表示,因此 2 − s 2^{-s} 2s 是可以精确表示的。额外的问题就是如何高精度地计算 2 − r , r ∈ [ 0 , 1 ) 2^{-r},r \in [0,1) 2r,r[0,1) 了,[ZSS19] 使用了超越函数的多项式逼近技术(transcendental function polynomial approximation),利用数学工具箱计算出一个大约 10 10 10 次的多项式 P ( x ) ∈ Q [ x ] P(x) \in \mathbb Q[x] P(x)Q[x],使得 P ( r ) ≈ 2 − r , r ∈ [ 0 , 1 ) P(r) \approx 2^{-r}, r \in [0,1) P(r)2r,r[0,1),于是计算出拒绝概率的高精度近似 p = 2 − s ⋅ P ( r ) p=2^{-s} \cdot P(r) p=2sP(r)。由于多项式 P ( x ) P(x) P(x) 的求值运算仅仅需要常数次浮点数的乘法和加法,因此它的运行时间是个很小的常数。

对比一下,[BLISS] 的伯努利采样器预先做一张 exp ⁡ ( − 2 i / f ) , f = k 2 / ln ⁡ 2 \exp(-2^i/f), f=k^2/\ln2 exp(2i/f),f=k2/ln2 查找表,然后在线阶段通过查表来生成多个伯努利变量,最后组合出服从参数 p = exp ⁡ ( − t / f ) p=\exp(-t/f) p=exp(t/f) 的伯努利分布的随机变量。而 [ZSS19] 却是利用上述的近似多项式 P ( r ) ≈ 2 − r P(r) \approx 2^{-r} P(r)2r,直接计算出拒绝概率 p = 2 − t / k 2 p=2^{-t/k^2} p=2t/k2,然后产生合适精度的随机浮点数 r d ← U ( [ 0 , 1 ) ) rd \leftarrow \mathcal U([0,1)) rdU([0,1)),与 p p p 比较大小后直接输出一个服从分布 B p \mathcal B_p Bp 的随机变量。[ZSS19] 给出的这个伯努利分布的采样器具有紧凑、高效、常数时间运行等等优势。

以 Falcon 为例

可证明安全 NTRU 密码方案

NTRU 问题在 [HPS98] 中被提出,它基于环结构,当前格密码中它能达到最小载荷。但是基于 NTRU 构造的密码方案都没有证明安全,在之后的十多年里 NTRU 密码方案一直处在 “打破-修复” 的循环中。[SS11] 给出了第一个可证明安全的 NTRU 加密方案以及签名方案。

定义多项式环 R : = Z [ x ] / ϕ \mathcal R:=\mathbb Z[x]/\phi R:=Z[x]/ϕ,其中 ϕ = x n + 1 \phi = x^n+1 ϕ=xn+1 n n n 是二的幂次。它的任意理想 I I I,若将多项式系数映射为向量,可将 I I I 视为 Z n \mathbb Z^n Zn 的满秩子格。若元素 a ∈ I a \in I aI,那么 x a ∈ I xa \in I xaI,并且 ϕ \phi ϕ 是反循环多项式,所以容易证明 λ 1 ( I ) = ⋯ = λ n ( I ) \lambda_1(I) =\cdots= \lambda_n(I) λ1(I)==λn(I),SIVP 问题与 SVP 问题一样难。另一种更好的嵌入方式是:令 ξ \xi ξ 2 n 2n 2n 次本原单位根,从 I I I Z n \mathbb Z^n Zn 的典型嵌入定义为 σ i : P ↦ P ( ξ 2 i + 1 ) \sigma_i: P \mapsto P(\xi^{ {2i+1}}) σi:PP(ξ2i+1)

定义 R q ∗ \mathcal R_q^* Rq R q \mathcal R_q Rq 中所有可逆元素组成的乘法群, D σ D_\sigma Dσ R \mathcal R R 上的离散高斯分布。采样 f , g ← D σ f,g \leftarrow D_\sigma f,gDσ 使得 f , g ∈ R q ∗ f,g \in \mathcal R_q^* f,gRq,计算 h = g / f h=g/f h=g/f,则 NTRU 加密方案以 f , g f,g f,g 为私钥,以 h h h 为公钥。[SS11] 证明了,当 f , g f,g f,g 拥有足够高的熵( σ \sigma σ 足够大),那么 h h h 的分布与 R q ∗ \mathcal R_q^* Rq 上均匀分布统计不可区分,从而加密方案是安全的。

经 [SS11] 修正后的 NTRU 加密方案为:

  1. K e y G e n ( 1 λ ) KeyGen(1^\lambda) KeyGen(1λ):固定 p ∈ R p \in \mathcal R pR 是与素数 q q q 互素的短多项式(例如 p = 2 p=2 p=2),采样 f ′ , g ← D σ f',g \leftarrow D_\sigma f,gDσ,设置 f : = p f ′ + 1 f:=pf'+1 f:=pf+1(使得 f ( m o d p ) = 1 f \pmod p=1 f(modp)=1,可简化加解密计算),如果 f , g ∉ R q ∗ f,g \notin \mathcal R_q^* f,g/Rq 则重新采样,私钥为 ( f , g ) (f,g) (f,g) 公钥为 h : = p g / f ∈ R q ∗ h:=pg/f \in \mathcal R_q^* h:=pg/fRq
  2. E n c ( h , M ∈ R p ) Enc(h,M \in \mathcal R_p) Enc(h,MRp):采样短多项式 s , e ∈ R s,e \in \mathcal R s,eR,计算密文 C : = h s + p e + M ( m o d q ) C:=hs+pe+M \pmod q C:=hs+pe+M(modq)
  3. D e c ( ( f , g ) , C ) Dec((f,g),C) Dec((f,g),C):计算 f C ( m o d q ) = p g s + f p e + f M ∈ R fC \pmod q = pgs+fpe+fM \in \mathcal R fC(modq)=pgs+fpe+fMR(因为 p , f , g , s , e , M p,f,g,s,e,M p,f,g,s,e,M 都很短,其结果不会取模),然后继续取模 p g s + f p e + f M ( m o d p ) ≡ f M pgs+fpe+fM \pmod p \equiv fM pgs+fpe+fM(modp)fM,再乘以 f − 1 ( m o d p ) f^{-1} \pmod p f1(modp) 即可得到 M M M(选取特殊的 f ( m o d p ) = 1 f \pmod p=1 f(modp)=1 此步骤可省略)

NTRU 签名方案的公私钥是加密方案公私钥的维度扩展,
s k = [ f g F G ] ,    p k = [ 1 h 0 q ] sk=\begin{bmatrix} f&g\\ F&G \end{bmatrix},\,\, pk=\begin{bmatrix} 1&h\\ 0&q \end{bmatrix} sk=[fFgG],pk=[10hq]
其中 f G − g F = q fG-gF=q fGgF=q,这可以通过先求解方程 f G 1 − g F 1 = 1 fG_1-gF_1=1 fG1gF1=1,然后设置 ( F q , G q ) = q ⋅ ( F 1 , G 1 ) (F_q,G_q)=q\cdot(F_1,G_1) (Fq,Gq)=q(F1,G1),再利用 Babai 最近平面算法进行长度约减得到 ( F , G ) ≈ ( F q , G q ) − ( q F 1 / f ) ⋅ ( f , g ) (F,G)\approx(F_q,G_q)-(qF_1/f) \cdot(f,g) (F,G)(Fq,Gq)(qF1/f)(f,g)

对于签名方案,除了公钥 h h h 携带私钥信息,每一次的签名也会透露私钥信息。[GPV08] 的原像可采样函数使得输出分布与秘密值相互独立,使得签名不会泄露私钥信息。[SS11] 基于上述的 NTRU 公私钥对,给出了一个 PSF 的实例化。

  1. G e n ( 1 n ) Gen(1^n) Gen(1n):运行 NTRU 秘钥生成算法,获得 f , g , F , G , h f,g,F,G,h f,g,F,G,h,由 h h h 指定 f h ( z 1 , z 2 ) : = h z 1 − z 2 ∈ R q f_h(z_1,z_2):=hz_1-z_2 \in \mathcal R_q fh(z1,z2):=hz1z2Rq,定义域为 D n : = { z ∈ R 2 : ∥ z ∥ ≤ s 2 n } D_n:=\{z \in \mathcal R^2: \|z\| \le s\sqrt{2n}\} Dn:={ zR2:zs2n },它的 Kernel 是格 L ⊥ ( h ) : = { ( z 1 , z 2 ) ∈ R 2 : z 2 ≡ h z 1 ( m o d q ) } ⊆ Z 2 n L^\perp(h):=\{(z_1,z_2) \in \mathcal R^2: z_2 \equiv hz_1 \pmod q\} \subseteq \mathbb Z^{2n} L(h):={(z1,z2)R2:z2hz1(modq)}Z2n,陷门 s k sk sk 是它的一组短基。
  2. S a m p l e D o m ( ) SampleDom() SampleDom():高斯采样 z ← D s z \leftarrow D_s zDs,当 ∥ z ∥ > 2 n s \|z\| > \sqrt{2n}s z>2n s 时拒绝样本
  3. S a m p l e P r e ( s k , t ) SamplePre(sk,t) SamplePre(sk,t):明显 c = ( 1 , h − t ) c=(1,h-t) c=(1,ht) f h ( c ) = t f_h(c)=t fh(c)=t 的解,利用 s k sk sk 从高斯分布 D L ⊥ ( h ) , s , c D_{L^\perp(h),s,c} DL(h),s,c 中采样获得 v v v,输出短向量 z = c − v z=c-v z=cv

然后采用 GPV 框架,在 RO 模型下容易将上述的 PSF 实例转化为一个 Hash-and-Sign 签名方案。

Falcon 签名方案

[Falcon] 基本上便是组合了上述技术:使用 [GPV08] 的原像可采样函数来实现 [SS11] 的可证明安全 NTRU 签名方案,在 PSF 中的陷门采样算法采用了 [DP16] 的快速傅里 Klein 算法,而 Klein 算法最底层的整数格离散高斯采样算法则使用了类似 [BLISS] 的基半高斯分布提升技术以及 [ZSS19] 的多项式逼近技术。

为了进一步减小签名规模,[Falcon] 提出了一种高斯分布变量的压缩方案:对于随机变量 s ← D Z , σ s \leftarrow D_{\mathbb Z,\sigma} sDZ,σ,选择合适的 d d d,做唯一分解 s = b ( s 1 2 d + s 0 ) s=b(s_12^d+s_0) s=b(s12d+s0),其中 b b b 是符号位, s 1 , s 2 ≥ 0 s_1,s_2 \ge 0 s1,s20 是整数,高斯函数为
ρ σ ( s ) = exp ⁡ ( − s 2 2 σ 2 ) = exp ⁡ ( − s 1 2 + s 1 s 0 / 2 d − 1 + s 0 2 / 2 d 2 ( σ / 2 d ) 2 ) \rho_\sigma(s) = \exp\left(\dfrac{-s^2}{2\sigma^2}\right) = \exp\left(-\dfrac{s_1^2+s_1s_0/2^{d-1}+s_0^2/2^d}{2(\sigma/2^d)^2}\right) ρσ(s)=exp(2σ2s2)=exp(2(σ/2d)2s12+s1s0/2d1+s02/2d)
可以看出 s 0 s_0 s0 较为接近均匀分布,而 s 1 s_1 s1 则较为接近高斯分布。我们不压缩符号位 b b b 和低阶比特 s 0 s_0 s0,使用 Huffman 编码压缩高阶比特 s 1 s_1 s1([Falcon] 使用了近似的 Unary code)。对于签名值的每个系数分别使用上述方法压缩,当遇到压缩后签名依然过长时重新执行签名算法。

省略细节,[Falcon] 签名方案如下:

  1. K e y G e n ( 1 λ ) KeyGen(1^\lambda) KeyGen(1λ):调用 NTRU 生成器(存在某高效算法)获得 f , g , F , G , h f,g,F,G,h f,g,F,G,h,设置
    P = [ − h I n q I n O n ] ,    B = [ g − f G − F ] ,    B − 1 = [ − F / q f / q − G / q g / q ] P=\begin{bmatrix} -h&I_n\\ qI_n&O_n \end{bmatrix},\,\, B=\begin{bmatrix} g&-f\\ G&-F \end{bmatrix},\,\, B^{-1}=\begin{bmatrix} -F/q&f/q\\ -G/q&g/q \end{bmatrix} P=[hqInInOn],B=[gGfF],B1=[F/qG/qf/qg/q]
    将矩阵中的环元素视为 Z q n × n \mathbb Z_q^{n \times n} Zqn×n 的反循环子矩阵(行矢),可以验证 P , B P,B P,B 生成同一个格,将长格基 P P P 作为公钥,将短格基 B B B 作为私钥。转换到 FFT 域上 B ^ : = F F T ( B ) \hat B := FFT(B) B^:=FFT(B),计算 G : = B ^ B ^ † G := \hat B \hat B^\dagger G:=B^B^,调用 F F L D L † ( G ) FFLDL^\dagger(G) FFLDL(G) 将它做树状分解 T T T,并将树叶 T . l e a f T.leaf T.leaf 的数值 D D D 替换为 σ / D \sigma/\sqrt{D} σ/D (归一化,使得陷门采样结果是球状高斯)。最终,私钥为 ( B ^ , T ) (\hat B,T) (B^,T),公钥为 h h h

  2. S i g n ( m , ( B ^ , T ) ) Sign(m,(\hat B,T)) Sign(m,(B^,T)):均匀采样 r ← { 0 , 1 } l r \leftarrow \{0,1\}^l r{ 0,1}l,计算 c : = H ( r ∥ m ) c:=H(r\|m) c:=H(rm),原像为 t : = ( c , 0 ) B − 1 t:=(c,0)B^{-1} t:=(c,0)B1。执行陷门采样算法 z : = F F S a m p l e ( t , T ) z:=FFSample(t,T) z:=FFSample(t,T),计算 s : = ( t − z ) B ^ s:=(t-z)\hat B s:=(tz)B^,使得它足够短 ∥ s ∥ 2 ≤ β 2 \|s\|^2 \le \beta^2 s2β2。做逆变换 ( s 1 , s 2 ) : = I F F T ( s ) (s_1,s_2):=IFFT(s) (s1,s2):=IFFT(s),因为它们满足 s 1 + s 2 h ≡ c ( m o d x n + 1 , q ) s_1+s_2h \equiv c \pmod{x^n+1,q} s1+s2hc(modxn+1,q),因此只需将 ( r , s 2 ) (r,s_2) (r,s2) 作为签名值。执行高斯分布的压缩操作 s : = C o m p r e s s ( s 2 ) s:=Compress(s_2) s:=Compress(s2),输出 ( r , s ) (r,s) (r,s)

  3. V e r i f y ( m , ( r , s ) , P ) Verify(m,(r,s),P) Verify(m,(r,s),P):计算 c : = H ( r ∥ m ) c:=H(r\|m) c:=H(rm),解压缩 s 2 : = D e c o m p r e s s ( s ) s_2:=Decompress(s) s2:=Decompress(s),计算 s 1 : = c − s 2 h ( m o d q ) s_1:=c-s_2h \pmod q s1:=cs2h(modq),当 ∥ ( s 1 , s 2 ) ∥ 2 ≤ β 2 \|(s_1,s_2)\|^2 \le \beta^2 (s1,s2)2β2 时接受,否则拒绝

不同的 m m m 取值会导致不同的 c c c 和不同的 s s s,执行 C o m p r e s s Compress Compress 所需的能耗和时间会有差异。如果某场景下需要对消息和签名值保密,那么就不应该使用压缩算法,确保不泄露更多侧信道信息。

猜你喜欢

转载自blog.csdn.net/weixin_44885334/article/details/131282862