一、密钥生成
- 选取合适的椭圆曲线参数{q,a,b,Gx,Gy,n};
- 用随机数发生器产生整数d ∈ [1,n−2];
- 计算点P = (xP,yP) = [d]G;
- 如果P是无穷远点O,goto step 2;
- 输出密钥对(d,P),其中d为私钥,P为公钥。
二、签名
- 以签名者A为例,计算 ZA=H256(ENTLA ∥ IDA ∥ a ∥ b ∥ xG ∥ yG ∥ xA ∥ yA),其中ENTLA是IDA的比特长度转换而成的两个字节;
- M' = ZA || M,其中M为待签名消息;
- e = H256(M');
- 用随机数发生器产生随机数k ∈[1,n-1];
- 计算椭圆曲线点(x1,y1)=[k]G;
- 计算r=(e + x1) mod n,若r=0或r+k=n则返回step 4;
- 计算s = ((k − r * dA) / (1 + dA)) mod n,若s=0则返回step 4;
- 输出签名(r,s);
三、验签
- ZA=H256(ENTLA ∥ IDA ∥ a ∥ b ∥ xG ∥ yG ∥ xA ∥ yA)
- M′ =ZA ∥ M;
- e = H256(M');
- 计算t = (r ′ + s ′ ) mod n, 若t = 0,则验证不通过;
- 计算椭圆曲线点(x1 , y1 ) = [s']G + [t]PA;
- 计算R = (e + x1 ) mod n,检验R = r是否成立,若成立则验证通过;否则验证不通过;