针对单签名的格攻击:如何修改b1和c1常量以适配更小的信息泄露场景?
针对单签名的格攻击:如何修改b1和c1常量以适配更小的信息泄露场景?
嘿,我正好研究过这个单签名下的Schnorr私钥恢复问题!先给你理清楚核心逻辑:当咱们只有一次有效签名,但知道私钥x和签名用的随机数k的高位有连续的0(也就是泄露了部分高位信息),就能结合这两个泄露点,用格攻击还原完整私钥。
回到你问的b1和c1调整——这俩参数其实就是用来量化私钥和随机数的信息泄露程度的,默认场景可能是假设高位有较多位为0,现在要适配“更小的泄露”(比如高位0的位数更少,或者说泄露的高位信息更少),得这么来:
- 第一步先明确泄露的具体情况:比如假设私钥
x的高t1位是0,那x的实际有效范围就是0 ≤ x < 2^(n - t1)(n是私钥总位数,比如常见的256位)。这时候把b1设为2^t1,这样私钥就能写成x = b1 * x0,其中x0是范围更小的未知值(0 ≤ x0 < 2^(n - 2t1)),这样x0的位数就少了,能放进格攻击的搜索范围里。同样,如果随机数k的高t2位是0,就把c1设为2^t2,k = c1 * k0。 - 如果你的泄露不是连续的高位0,而是高位有固定的掩码(比如某些位已知是0或1),那
b1和c1得对应调整,把x和k表示成b1*x0 + d1、c1*k0 + d2的形式——这里d1、d2是已知的固定值,x0、k0是范围足够小的未知部分,这样才能让格的短向量搜索能找到它们。 - 实操的时候,先把Schnorr签名的核心方程写出来:
s = k + x*e mod q(s是签名值,e是消息哈希后的结果,q是椭圆曲线的阶)。把调整后的x = b1*x0、k = c1*k0代入方程,就能得到s = c1*k0 + b1*x0*e mod q,再整理成整数方程:c1*k0 + b1*e*x0 - q*m = s(m是某个整数)——这就是格攻击的基础线性约束。调整b1和c1的关键,就是让x0和k0的范围足够小,使得格中的最短向量刚好对应真实的x0和k0。
举个实际的例子:原来的场景可能是私钥和随机数各有64位高位为0,对应b1=2^64、c1=2^64。如果现在你的泄露只有32位高位为0,那直接把b1和c1改成2^32就行——这时候x0和k0的范围会变大一点,但只要格基约减算法(比如LLL或者BKZ)能覆盖这个范围,就能成功恢复私钥。
备注:内容来源于stack exchange,提问作者user2284570
相关产品推荐
相关产品推荐

