ECDSA
曲线的定义
曲线方程
G 基点,是椭圆曲线上的一个坐标点 N 表示椭圆曲线的阶,N * G 为椭圆曲线上无穷远的一个点 p 是一个素数,方程式最后的 mod (p)决定了椭圆曲线的 x, y 都在这个素数域内 [1 - n-1],并且都为整数。将方程式变为有限域 D 表示椭圆曲线的私钥,为 [1 - p] D * G 得到的坐标点就是 私钥D 对应的公钥,公钥是一个坐标。如果是02,03开头,表示是压缩公钥,共33个字节(包含02,03),压缩公钥只有x,没有y。如果是04开头,表示非压缩公钥(共65字节,包含04),非压缩公钥为04+x+y。所以如果有了非压缩公钥,根据x y能反推出来在哪条曲线上
签名
每次签名的时候,都会产生一个随机数 k,可以理解为临时私钥。随机数k不能重复,而且要足够随机,否则会有私钥泄漏风险。历史上 sp3层出现过重复使用k导致私钥泄漏事件。
用 k * G 算出一个坐标,然后 mod N,记录新坐标的横坐标为 r
签名过程:
k * G 算出的点,得到的点的横坐标 mod(n)就是 r 签名为: k对n的模逆运算 * (hash(m) + D * r)
验签过程:
u1 = s对n的模逆运算 * hash(m) u2 = s对n的模逆运算 * r v = u1 * G + u2 * p 如果 v 的横坐标等于 r,则签名有效 在签名过程中,随机数k的保存至关重要
最后更新于