1 引入
基于 An improved compression technique for signatures based on learning with errors 一文的简化版本,介绍此类签名方案的基本框架:
![]()
1.1 密钥生成
KeyGen():
-
生成一个大小为 k×ℓ 的矩阵 A,其中每个元素在多项式环 Rq=Zq[X]/(Xn+1) 上,其中 q=223−213+1, n=256
-
从随机分布中抽取两个秘密密钥向量 s1 和 s2,这些向量的系数属于环 Rq,且大小不超过 η(一个小的上限)
-
计算公钥的第二部分 t=As1+s2
-
输出密钥对 pk=(A,t), sk=(A,t,s1,s2)
1.2 签名
Sign(sk,M):接受私钥 sk、消息 M 作为输入
-
初始化 z=⊥,当 z=⊥ 时重复下述签名过程,直到生成有效的签名
-
生成掩码向量 y:签名者从集合 Sγ1−1ℓ 中随机生成一个多项式向量 y,其中 y 的每个系数的大小小于 γ1。γ1 需要足够大,以确保签名不会泄露秘密密钥,但也足够小,使得签名不会被轻易伪造
-
计算 w1:计算 Ay,将 Ay 的每个系数拆分为高位和低位部分,依照 w=w1⋅2γ2+w0 提取其高位部分 w1,其中 ∣w0∣≤γ2
-
生成挑战值 c:挑战值 c 由消息 M 和 w1 的哈希值生成,其中 c 是环 Rq 中的多项式,具有 60 个 ±1 的系数,其他系数为 0。这样做是为了确保 c 的范数较小,且来自于一个大于 2256 的域
-
计算初始签名值 z:若直接输出 z,则会泄露秘密密钥。因此,使用拒绝采样来确保安全性
-
拒绝采样和低位校验:(1)设置参数 β,其值为 cs1 的最大可能系数。由于 c 只有 60 个 ±1 的系数,且 s1 的最大系数为 η,因此有 β≤60η;(2)检查 Ay−cs2 的低位部分。如果 z 的任何系数大于 γ1−β,或是 Az−ct 低位部分的任何系数大于 γ2−β,则拒绝签名并重新开始签名过程
-
输出签名 σ=(z,c)
1.3 验签
Verify(pk,M,σ):接受公钥 pk、消息 M 和签名 σ 作为输入
-
计算 w1′:Az−ct 实际上等于 Ay−cs2,这是因为将 z=y+cs1 代入得到 Az−ct=A(y+cs1)−ct=Ay+Acs1−ct=Ay+c(As1−t)=Ay−cs2
-
验证:(1)z 的所有系数是否小于 γ1−β;(2)c 是否等于 H(M∣∣w1′)
2 Dilithium 方案
与 1 的方案对比:公钥大小减少了约 2.5 倍,但签名大小有一个增加 150 字节左右的 tradeoff,这一改动主要涉及方案的第 6 步,这样并不公开完整的 t,而是只有 t 的高位部分 t1;即公钥中只包含其高位部分 t1,而低位部分 t0 保留在私钥中
![]()
2.1 密钥生成
KeyGen():
-
生成两个 256 位的随机数 ρ,K
-
从随机分布中抽取两个秘密密钥向量 s1 和 s2,这些向量的系数属于环 Rq,且大小不超过 η
-
矩阵扩展:将种子 ρ 扩展成一个大小为 k×ℓ 的矩阵 A,其中每个元素在多项式环 Rq=Zq[X]/(Xn+1) 上,其中 q=223−213+1, n=256。但为了更快的实现考虑,矩阵 A 实际上是以系数在 Zq256 中的矩阵格式输出并存储的
-
计算 t=As1+s2
-
将 t 分解为高位 t1 和低位 t0 两个部分。本方案中公钥的第二部分为 t1 而非 t,使得此时的公钥只需要 ⌈logq⌉−d 字节,而非 ⌈logq⌉ 字节
-
将 ρ 和 t1 打包并使用 SHAKE-256 哈希,得到 384 位的 tr,用于签名时的消息摘要
-
输出密钥对 pk=(ρ,t1), sk=(ρ,K,tr,s1,s2,t0)
2.2 签名
Sign(sk,M):
-
由种子 ρ 生成矩阵 A
-
将 tr 和消息 M 打包并使用 SHAKE-256 哈希,得到 384 位的消息摘要 μ
-
初始化 κ=0,(z,h)=⊥,当 (z,h)=⊥ 时重复下述签名过程并累加计数器 κ,直到生成有效签名
-
生成掩码向量 y:扩展 K∥μ∥κ 生成多项式向量 y,其中 y∈Sγ1−1ℓ。由于签名可能需要重复尝试多次,每次尝试时附加的计数器 κ 可以确保相同消息的多次签名尝试会输出不同的随机数
-
计算 w=Ay
-
计算 w1:将 w 的每个系数拆分为高位和低位部分,依照 w=w1⋅2γ2+w0 提取其高位部分 w1,其中 ∣w0∣≤γ2
-
生成挑战值 c:挑战值 c 由消息 M 和 w1 的哈希值生成,c 是环 Rq 中的多项式,具有 60 个 ±1 的系数,其他系数为 0
-
计算初始签名值 z
-
将 w−cs2 分解为高位 r1 和低位 r0,以进一步检查签名的有效性
-
拒绝采样、高低位校验:(1)设置参数 β,其值为 cs1 的最大可能系数。由于 c 只有 60 个 ±1 的系数,且 s1 的最大系数为 η,因此有 β≤60η;(2)检查 Ay−cs2 的低位部分;(3)检查 Ay−cs2 的高位部分。如果 z 的任何系数大于 γ1−β、 Ay−cs2 低位部分的任何系数大于 γ2−β、Ay−cs2 高位部分不为 w1 中的任意一项成立,则拒绝此签名
-
生成附加提示 h 用于验证,确保验证者可以正确恢复出高位信息。由于公钥只包含高位部分 t1,验证时无法直接计算 Az−ct 的完整值,而是只能计算 Az−ct1⋅2d=Az−ct+ct0。为了弥补这一点,签名者需要发送提示 h,告知验证者 ct0 导致进位的位置,从而能够正确恢复 Az−ct 的高位部分。此时,如果 ct0 的任何系数大于 γ2,或是提示 h 中的 1 的数目超出限制 ω,则同样拒绝此签名
-
输出签名 σ=(z,h,c)
2.3 验签
Verify(pk,M,σ):
-
由种子 ρ 生成矩阵 A
-
将 ρ 和 t1 打包并使用 SHAKE-256 哈希后,整体再和 M 哈希得到 384 位的消息摘要 μ
-
计算 w1′:使用提示 h 恢复 Az−ct1 的高位部分 w1′。验证者计算 Az−ct1⋅2d,这只包含 Az 和 ct1 的高位部分,并使用 h 中包含的进位信息恢复 w1′
-
验证:(1)z 的所有系数是否小于 γ1−β;(2)c 是否等于 H(M∣∣w1′);(3)提示 h 中的 1 的数目是否超出限制 ω
![]()
参考
[1] CRYSTALS-Dilithium: A Lattice-Based Digital Signature Scheme
[2] An improved compression technique for signatures based on learning with errors