ECDSA
Last Update:
ECDSA
ECDSA又叫做椭圆曲线数字签名算法,有点类似于ECC。一般是选定一个曲线E,然后找一个曲线上点P,曲线所处有限域p内选取私钥a,一个质数q,计算Q=aP,公钥为E,P,Q,p,q,私钥为a
每次签名都要选取一个随机数k,对要签名的数据先hash计算,计算kP=(x,y),签名的第一部分r=x mod q(若r=0则继续选随机数),第二部分$t=k^{-1} mod n$,伪造签名的关键在于私钥a和随机数k,只要知道这两个中任何一个就可以求出另一个,从而伪造签名
ECDSA攻击原理
最基础的一种ECDSA的漏洞模型所随机数k的复用,由于私钥a具有身份标识作用,所以私钥在一段时间内不会更换,如果对两次或以上的签名使用了同一随机数k,就会导致私钥a的泄露,导致签名被伪造。
如果k1和k2之间存在比例关系,那也可以使用这种方法
参数定义
椭圆曲线:由参数组(a,b,p,G,n,h)定义,其中G为基点,n为基点阶数
私钥:随机整数d(1<=d<n)
公钥:Q=d*G
步骤:
1.对m计算哈希值h=Hash(m)
2.生成随机数k
3.计算kG=(x,y),取横坐标r=x mod n
4.计算签名s=k^-1^(h+rd) mod n
5.输出签名(r,s)
过程
现有椭圆曲线
- y^2^≡x^3^+ax+b mod p
- n*G=O
- Q
a=da*G - e=hash(m)
- k*G=(x1,y1)
- r=x1 mod n
- s=k^-1^(e+rd
a) mod n
r和s是数字签名
验证签名: - u1=es^-1^ mod n
- u2=rs^-1^ mod n
- u1G+u2Q
a - =es^-1^*G+rs^-1^(d
A*G) - =(e+rd
a)s^-1^*G - =k*G=(x1,y1)
- check if r=x1 mod n
即先选择一个椭圆曲线和一个基点G,再随机选择一个私钥d,计算公钥(Q=dG)
再选择一个随机数k(确保每次签名不同),使用椭圆曲线计算点R=kG,得到R为x的坐标,记为r
s的公式就和DSA是一样的,即s=k^(-1)(H(m)+dr) mod q,H(m) 是消息的哈希值,n 是椭圆曲线的阶,(r,s)就为签名。
常见题型:
1.随机数k的复用:
使用两次相同的k,我们可以通过方程求解私钥即上述攻击
代码实现:
1 | |
2.弱椭圆曲线参数
使用非标准或者低阶椭圆曲线,使得ECDLP可以求解,或者使用异常曲线(Smart曲线,阶等于域大小p)
方法:使用Pohlig-Hellman算法分解阶数n的素因子,简化离散对数计算
1.分解曲线阶n的素因子;n=p1^e1^·p2^e2^…
2.对每个子群pi^ei^求解d mod pi^ei^
3,用中国剩余定理合并得到完整的d
1 | |
3.签名伪造
未验证公钥是否在曲线上:攻击者可提交不在曲线上的恶意公钥。
未检查签名参数范围:如允许r=0或s=0
我们可以构造公钥Q不在原曲线但满足验证公式
例如:Q=(r^-1^·h)·G+(r^-1^·s)·Q
生成签名(r,s)后,再构造新签名(r,-s mod n),由于椭圆曲线对称点x横坐标相同,所以新签名也有效
1 | |
4.已知部分k
若已经k的高位或低位,或者k与时间有关可以用时间戳
用LLL算法,可以恢复完整的k
例如:假如给出k的低8bit,(k=已知部分+x)
代码:
1 | |
5.Ocacle攻击
签名Oracle:允许提交任意消息获取签名。
攻击方法:通过多次交互获取足够信息,构造私钥。
这种题目一般为远程题。提供在线签名服务,我们需要提交特定构造的信息,如哈希可控的消息,收集多个签名,再分析是否存在k复用或者k有线性关系的情况,恢复私钥
6.特殊曲线攻击(如NIST P-256)
后门曲线:某些标准曲线参数可能隐藏数学弱点。
攻击方法:利用特定数学性质(如移动点攻击)。