SM2椭圆曲线公钥签名算法

一、密钥生成

  1. 选取合适的椭圆曲线参数{q,a,b,Gx,Gy,n};
  2. 用随机数发生器产生整数d ∈ [1,n−2];
  3. 计算点P = (xP,yP) = [d]G;
  4. 如果P是无穷远点O,goto step 2;
  5. 输出密钥对(d,P),其中d为私钥,P为公钥。

二、签名

  1. 以签名者A为例,计算 ZA=H256(ENTLA ∥ IDA ∥ a ∥ b ∥ xG ∥ yG ∥ xA ∥ yA),其中ENTLA是IDA的比特长度转换而成的两个字节;
  2. M' = ZA || M,其中M为待签名消息;
  3. e = H256(M');
  4. 用随机数发生器产生随机数k ∈[1,n-1];
  5. 计算椭圆曲线点(x1,y1)=[k]G;
  6. 计算r=(e + x1) mod n,若r=0或r+k=n则返回step 4;
  7. 计算s = ((k − r * dA) / (1 + dA)) mod n,若s=0则返回step 4;
  8. 输出签名(r,s);

三、验签

  1. ZA=H256(ENTLA ∥ IDA ∥ a ∥ b ∥ xG ∥ yG ∥ xA ∥ yA)
  2. M′ =ZA ∥ M;
  3. e = H256(M');
  4. 计算t = (r ′ + s ′ ) mod n, 若t = 0,则验证不通过;
  5. 计算椭圆曲线点(x1 , y1 ) = [s']G + [t]PA;
  6. 计算R = (e + x1 ) mod n,检验R = r是否成立,若成立则验证通过;否则验证不通过;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值