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是否成立,若成立则验证通过;否则验证不通过;

猜你喜欢

转载自blog.csdn.net/qq_33657251/article/details/84639429