整数格上离散高斯采样
无论是 [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] [c−t(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)=2−x2
我们考虑半高斯分布
D
σ
+
:
=
{
x
←
D
σ
∣
x
≥
0
}
D_{\sigma}^+ := \{x \leftarrow D_{\sigma} \mid x \ge 0\}
Dσ+:={x←Dσ∣x≥0},它的密度函数为
ρ
σ
(
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=0∑∞2−i2=1.10012i−2
0000i1
2i−10⋯010⋯
所以对于这个特殊的分布
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 的描述如下:
- 掷硬币 b ← U 1 b \leftarrow \mathcal U_1 b←U1,如果 b = 0 b=0 b=0 则输出 i = 0 i=0 i=0,否则继续执行后续步骤
- 对于
i
=
1
,
2
,
⋯
,
∞
i=1,2,\cdots,\infty
i=1,2,⋯,∞,依次执行
- 掷硬币 [ b 1 , ⋯ , b 2 i − 1 ] ← U 2 i − 1 [b_1,\cdots,b_{2i-1}] \leftarrow \mathcal U_{2i-1} [b1,⋯,b2i−1]←U2i−1
- 如果 [ b 1 , ⋯ , b 2 i − 2 ] ≠ 0 ⃗ [b_1,\cdots,b_{2i-2}] \neq \vec 0 [b1,⋯,b2i−2]=0,此时这些硬币的累计概率已经越过了 ρ σ 0 ( Z + ) \rho_{\sigma_0}(\mathbb Z^+) ρσ0(Z+),程序返回 step 1 重新执行
- 如果 [ b 1 , ⋯ , b 2 i − 2 ] = 0 ⃗ [b_1,\cdots,b_{2i-2}] = \vec 0 [b1,⋯,b2i−2]=0,当 b 2 i − 1 = 0 b_{2i-1}=0 b2i−1=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(x−c) 再按照伯努利分布 B p \mathcal B_p Bp 掷硬币。这个特殊的采样算法 B a s e S a m p l e BaseSample BaseSample 可以被特别高效地实现,额外掷一个硬币 s ← U s \leftarrow \mathcal U s←U 作为高斯样本的符号位,并以 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,∀k∈Z+。我们令
z
=
k
x
+
y
∈
Z
z=kx+y \in \mathbb Z
z=kx+y∈Z,其中
x
←
D
σ
0
x \leftarrow D_{\sigma_0}
x←Dσ0,并用
y
∈
{
0
,
1
,
⋯
,
k
−
1
}
y \in \{0,1,\cdots,k-1\}
y∈{0,1,⋯,k−1} 来填充空隙,那么
ρ
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σ02x2−2(kσ0)2y(2kx+y))=ρσ0(x)⋅exp(−2(kσ0)2y(2kx+y))
因此,我们均匀采样
y
←
U
(
[
k
]
)
y \leftarrow \mathcal U([k])
y←U([k]),使用基采样器获得
x
←
D
σ
0
x \leftarrow D_{\sigma_0}
x←Dσ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
Ba⋅b=Ba∧Bb,Ba+b−a⋅b=Ba∨Bb
因此对于
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)=B∏ti=1exp(−2i/f)=ti=1⋀Bexp(−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,⋯,l−1 的表格(存储规模仅是精度的对数级别)。将输入值
t
t
t 做二进制分解,然后对于每个
t
i
t_i
ti 依次采样
b
i
←
B
exp
(
−
2
i
/
R
)
b_i \leftarrow \mathcal B_{\exp(-2^i/R)}
bi←Bexp(−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,⋯,l−1 都执行
b
i
←
B
exp
(
−
2
i
/
f
)
b_i \leftarrow \mathcal B_{\exp(-2^i/f)}
bi←Bexp(−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))=2−t/k2,其中
a
=
t
/
k
2
∈
R
a=t/k^2 \in \mathbb R
a=t/k2∈R 可以写成
a
=
s
+
r
a=s + r
a=s+r 的形式,其中
s
∈
Z
s \in \mathbb Z
s∈Z,
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=2−t/k2=2−s⋅2−r
由于计算机中浮点数以二进制表示,因此
2
−
s
2^{-s}
2−s 是可以精确表示的。额外的问题就是如何高精度地计算
2
−
r
,
r
∈
[
0
,
1
)
2^{-r},r \in [0,1)
2−r,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)≈2−r,r∈[0,1),于是计算出拒绝概率的高精度近似
p
=
2
−
s
⋅
P
(
r
)
p=2^{-s} \cdot P(r)
p=2−s⋅P(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)≈2−r,直接计算出拒绝概率 p = 2 − t / k 2 p=2^{-t/k^2} p=2−t/k2,然后产生合适精度的随机浮点数 r d ← U ( [ 0 , 1 ) ) rd \leftarrow \mathcal U([0,1)) rd←U([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 a∈I,那么 x a ∈ I xa \in I xa∈I,并且 ϕ \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:P↦P(ξ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,g←Dσ 使得 f , g ∈ R q ∗ f,g \in \mathcal R_q^* f,g∈Rq∗,计算 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 加密方案为:
- K e y G e n ( 1 λ ) KeyGen(1^\lambda) KeyGen(1λ):固定 p ∈ R p \in \mathcal R p∈R 是与素数 q q q 互素的短多项式(例如 p = 2 p=2 p=2),采样 f ′ , g ← D σ f',g \leftarrow D_\sigma f′,g←Dσ,设置 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/f∈Rq∗
- E n c ( h , M ∈ R p ) Enc(h,M \in \mathcal R_p) Enc(h,M∈Rp):采样短多项式 s , e ∈ R s,e \in \mathcal R s,e∈R,计算密文 C : = h s + p e + M ( m o d q ) C:=hs+pe+M \pmod q C:=hs+pe+M(modq)
- 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+fM∈R(因为 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 f−1(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
fG−gF=q,这可以通过先求解方程
f
G
1
−
g
F
1
=
1
fG_1-gF_1=1
fG1−gF1=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 的实例化。
- 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):=hz1−z2∈Rq,定义域为 D n : = { z ∈ R 2 : ∥ z ∥ ≤ s 2 n } D_n:=\{z \in \mathcal R^2: \|z\| \le s\sqrt{2n}\} Dn:={z∈R2:∥z∥≤s2n},它的 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:z2≡hz1(modq)}⊆Z2n,陷门 s k sk sk 是它的一组短基。
- S a m p l e D o m ( ) SampleDom() SampleDom():高斯采样 z ← D s z \leftarrow D_s z←Ds,当 ∥ z ∥ > 2 n s \|z\| > \sqrt{2n}s ∥z∥>2ns 时拒绝样本
- 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,h−t) 是 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=c−v
然后采用 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}
s←DZ,σ,选择合适的
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,s2≥0 是整数,高斯函数为
ρ
σ
(
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σ2−s2)=exp(−2(σ/2d)2s12+s1s0/2d−1+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] 签名方案如下:
-
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=[gG−f−F],B−1=[−F/q−G/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 -
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(r∥m),原像为 t : = ( c , 0 ) B − 1 t:=(c,0)B^{-1} t:=(c,0)B−1。执行陷门采样算法 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:=(t−z)B^,使得它足够短 ∥ s ∥ 2 ≤ β 2 \|s\|^2 \le \beta^2 ∥s∥2≤β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+s2h≡c(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)
-
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(r∥m),解压缩 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:=c−s2h(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 所需的能耗和时间会有差异。如果某场景下需要对消息和签名值保密,那么就不应该使用压缩算法,确保不泄露更多侧信道信息。