SM2椭圆曲线加密算法学习笔记

此文章用于记录笔者对于SM2椭圆曲线加密算法的学习

前置知识

ElGamal离散对数密码体制

  1. 公钥密钥生成

    • Alice首先构造一条椭圆曲线 ,在曲线上选择一点 作为生成元, 的阶(且 必须为质数)。此时构成了一个循环群

    • Alice选择一个私钥 ,生成公钥

    • Alice将公钥组 发送给Bob

  2. 加密过程

    • Bob收到信息后,将明文编码为 为曲线上一点,并选择一个随机数 的阶)

    • Bob计算点 即两段密文,计算方法如下

    • Bob把 发给Alice

  3. 解密过程

    • Alice收到密文后,为了获得 ,只需要 ,因为

    • 将M解码即可

SM2官方文档

标准文档链接:国家商业密码标准

总则

  1. 规定了椭圆曲线的系统参数以及验证方法
  2. 规定了椭圆曲线公钥的验证方法
  3. 附录中给出了椭圆曲线示例

第二部分 数字签名算法

签名算法流程

(一)置M' = ZA || M M为待签名数据 ZA为A的可辨识标识、部分椭圆曲线系统参数和用户A的公钥的Hash值

(二)计算e = Hash(M') 并将其转化为整数

(三)用随机数发生器生成随机数k (k>1 k< n-1) n 椭圆曲线的阶数 可以通过G计算出

(四)计算椭圆曲线点(x1,y1) = [k]G,并将其转化为整数 G为椭圆上一点 [k]G指椭圆乘法k倍G

(五)计算r= (e + x1)mod n,若r=0或r+k=n返回(三)

(六)计算s= ((1+da) ^(-1) * (k-r*da))mod n,若s=0则返回(三) da为用户A的私钥

(七)将r、s数据类型转化成字节串,消息M的签名为(r,s)

验签算法流程

(一)验证r>1 r<n-1

(二)验证s>1 s<n-1

(三)置M' = ZA || M

(四)计算e = Hash(M') 并将其转化为整数

(五)将r s数据类型转换为整数 计算 t= (r+s)mod n ,若t=0则验证不通过

(六)计算椭圆曲线点(x1,y1) = [s]G + [t]Pa Pa为A的公钥

(七) 将x1的数据类型转换成整数,计算R=(e+x1)mod n,验证R=r,成立则验证通过

第三部分 密钥交换协议

密钥交换流程

第四部分 公钥加密算法

加密算法流程

(一)用随机数发生器产生随机数k (k>1 k<n-1)

(二)计算椭圆曲线点C1=[k]G=(x1,y1),并将其转换为比特串(A的私钥生成公钥)

(三)计算椭圆曲线点S=[h]Pb,若S是无穷远点,则报错并退出 h为n的余因子

(四)计算椭圆曲线点[k]Pb=(x2,y2),并将其转换为比特串(A的私钥乘B的公钥)

(五)计算t=KDF(x2||y2,klen),若t为全0比特串,则返回(一) KDF为密钥派生函数

(六)计算C2=M⊕t

(七)计算C3=Hash(x2||M||y2)

(八)输出密文C=C1||C3||C2

解密算法流程

(一)从C中取出比特串C1,将其转换为椭圆曲线上的点,验证C1是否满足椭圆曲线方程

(二)计算椭圆曲线点S=[h]Pb,若S是无穷远点,则报错并退出

(三)计算[db]C1=(x2,y2),并将其转换为比特串 db B的公钥

(四)计算t=KDF(x2||y2,klen),若t为全0比特串,则返回(一) KDF为密钥派生函数

(五)从C中取出比特串C2,计算M=C2⊕t

(六)计算u=Hash(x2||M||y2),从C中取出比特串C3,若u不等于C3,则报错并退出

(七)输出明文M

第五部分 参数定义

给出了SM2使用素数域256位椭圆曲线参数