v0.0.1

ECDSA(Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法)

ECDSA是 基于椭圆曲线(Weierstrass 曲线)密码学(ECC)的一种 数字签名算法

Tips:

基于椭圆曲线(Weierstrass 曲线)意味着 支持: secp系列(secp256k1...), Brainpool系列(brainpoolP256r1...), NIST P 系列(secp256r1...)

关键特点: 需要随机数Nonce

签名和验签流程:

假设 A和B两个用户, A 签名信息 B验证信息

通信双方A和B, 已知信息有:

- 椭圆曲线
- 基点 G
- G 的阶 n
- 要签名的消息 m
A 签名:

1. A 生成自己的公钥私钥


(其中HA是 A的公钥是一个坐标点有xy, KA是A的私钥, G为基点)

2. 在

中选择另一个随机私钥k(nonce) (n为基点G的阶)

3. 计算第2步的随机私钥对应的公钥,

, 取公钥坐标点R的x坐标得到 “r”
(R为结果的坐标点, k为第2步的随机数, G为基点)
若 r=0, 则的回到第2步重新选择一个 k, 并 重新计算

4. 计算 "s",


(k-1 为第2步的随机数的模逆表示, m需要签名的信息, r第3步得到, KA是A的私钥, n为基点G的阶)
若 s=0, 则的回到第2步重新选择一个 k, 并 重新计算

5. 发送将 A 的公钥 HA, 消息 m, 签名数据 rs , 发送给 B

k-1 表示在模 n 下的乘法逆元。 乘法逆元

B 验证签名:

1. 计算v1


(s-1 s在模 n 下的乘法逆元, 消息 m, n为基点G的阶)

2. 计算v2


(s-1 s在模 n 下的乘法逆元, r 为A发送的签名数据 , n为基点G的阶)

3. 计算P

得到的P坐标的x 如果等于r 则签名有效

(v1, v2 1,2步得到, HA为A的公钥)

Secp256k1 — 生成签名

使用私钥签名消息,使用公钥进行验证

公钥:
私钥:

签名Hash数据:

签名数据hash:
自定义Nonce
Signature
 
   R
   S
Msg Hash
ECDSA签名
DER 编码

Secp256k1 — 验证签名

使用私钥签名消息,使用公钥进行验证

公钥:

签名数据Hash:

Signature
 
   R
   S