SM2椭圆曲线公钥密码算法

目录

1. 摘要

2. SM2系统参数

3. SM2数字签名算法

3.1 数字签名生成算法

3.2 数字签名验证算法

4. SM2密钥交换协议

4.1. 密钥派生函数

4.2 密钥交换协议

5. SM2公钥加密算法

5.1 加密算法

5.2 解密算法

6. 参考文献


1. 摘要

        SM2椭圆曲线公钥密码算法(elliptic curve cryptography,ECC),简称 SM2算法,是我国公钥密码算法标准(2010年12月首次公开发布,2012年成为中国商用密码标准,2016年成为中国国家密码标准),本文详细描述了SM2算法的主要内容,包括数字签名算法、密钥交换协议和公钥加密算法。

2. SM2系统参数

        SM2系统参数为有限域上的椭圆曲线及相关参数,包括:有限域F_{q}的规模q;定义椭圆曲线E\left (F _{q} \right )方程(y^{2}=x^{3}+ax+b)的2个元素a,b\in F_{q}E\left (F _{q} \right )上的基点G=\left (x _{G}, y_{G}\right )\left ( G\neq O \right )x_{G}y_{G}F_{q}中的2个元素;G的阶n及其他可选项(如n的余因子h等)。

3. SM2数字签名算法

        作为签名者的用户A的密钥对包括私钥d_{A}和公钥P_{A}=\left [ d_{A} \right ]G=\left ( x_{A},y_{A} \right ),用户A具有entlen_{A}位长的标识ID_{A},记ENTL_{A}是整数entlen_{A}转换而来的2B数据,签名者和验证者都用SM3密码杂凑算法计算A的杂凑值Z_{A}=SM3\left ( ENTL_{A}||ID_{A}||a||b||x_{G}||y_{G}||x_{A}||y_{A} \right )

3.1 数字签名生成算法

               签名者用其私钥生成消息M的数字签名,具体步骤如下:

        (1)计算\overline{M}=Z_{A}||M,其中Z_{A}为A的杂凑值;

        (2)计算e=H_{v}\left ( \overline{M} \right ),并将e转换为整数,其中H_{v}为密码杂凑函数;

        (3)生成随机数k\in \left [ 1,n-1 \right ],其中为椭圆曲线基点G的阶;

        (4)计算椭圆曲线上的点\left (x_{1},y_{1} \right )=k\left [ G \right ],并将x_{1}转换为整数;

        (5)计算r=\left ( e+x_{1} \right )mod\, n,若r=0r+k=n则返回步骤(3);

        (6)计算s=\left (\frac{k-r\cdot d_{A}}{1+d_{A}} \right )mod\, n,若s=0则返回步骤(3);

        (7)将rs转换为字节串,\left ( r,s \right )即为消息M的签名。

3.2 数字签名验证算法

        用{M}'\left ( {r}' ,{s}'\right )表示验证者B接收到的A的消息及签名,签名验证步骤如下:

        (1)检验{r}'\in \left [ 1,n-1 \right ]是否成立,若不成立则验证不通过;

        (2)检验{s}'\in \left [ 1,n-1 \right ]是否成立,若不成立则验证不通过;

        (3)计算{\overline{M}}'=Z_{A}||{M}',其中Z_{A}为A的杂凑值;

        (4)计算{e}'=H_{v}\left ( {\overline{M} }'\right ),并将{e}'转换为整数,其中H_{v}为密码杂凑函数;

        (5)将{r}'{s}'转换为整数,计算t=\left ( {r}'+{s}' \right )mod\, n,若t=0,验证不通过;

        (6)计算椭圆曲线上的点\left ({ x_{1}}',{y_{1}}' \right )=\left [ {s}' \right ]G+\left [ t \right ]P_{A}

        (7)将{x_{1}}'转换为整数,计算R=\left ( {e}' +{x_{1}}'\right )mod\, n,检验R={r}'是否成立,若成立则验证通过;否则验证不通过。

4. SM2密钥交换协议

        用户A和B进行密钥协商,用户A的密钥对包括其私钥d_{A}和公钥P_{A}=\left [ d_{A} \right ]G=\left ( x_{A},y_{A} \right ),用户B的密钥对包括其私钥d_{B}和公钥P_{B}=\left [ d_{B} \right ]G=\left ( x_{B},y_{B} \right );用户A具有entlen_{A}位长的标识ID_{A},记ENTL_{A}是由整数entlen_{A}转换而来的2B数据,用户B具有entlen_{B}位长的标识ID_{B},记ENTL_{B}是由整数entlen_{B}转换而来的2B数据;A和B都用SM3密码杂凑算法计算双方的杂凑值Z_{A}=SM3\left ( ENTL_{A}||ID_{A}||a||b||x_{G}||y_{G}||x_{A}||y_{A} \right )Z_{A}=SM3\left ( ENTL_{A}||ID_{A}||a||b||x_{G}||y_{G}||x_{A}||y_{A} \right )

4.1. 密钥派生函数

        SM2密钥交换协议中使用的密钥派生函数KDF\left ( Z,klen \right )的输入为比特串Z(共享的秘密)、整数klen(输出的密钥数据位长),输出位长为klen的密钥数据比特串K,具体如下:

        (1)初始化1个由32b数据构成的计数器ct=0x00000001

        (2)计算Ha_{i}=H_{v}\left ( Z||\left (ct+i \right )\right )0\leqslant i< \left \lceil \frac{klen}{v} \right \rceilH_{v}为密码杂凑函数;

        (3)计算Ha!_{\left \lceil klen/v \right \rceil},若klen/v的值为整数,则Ha!_{\left \lceil klen/v \right \rceil}=Ha_{\left \lceil klen/v \right \rceil},否则Ha!_{\left \lceil klen/v \right \rceil}Ha_{\left \lceil klen/v \right \rceil}最左边的\left ( klen-\left ( v\times \left \lfloor klen/v \right \rfloor \right ) \right )比特数据;

        (4)K=Ha_{1}||Ha_{2}||\cdots ||Ha_{\left \lceil klen/v \right \rceil-1}||Ha!_{\left \lceil klen/v \right \rceil}K即为根据共享秘密派生出的密钥数据。

4.2 密钥交换协议

        记w=\left \lceil \left ( \left \lceil lb\left ( n \right ) \right \rceil/2 \right ) \right \rceil-1

  •  用户A

        (1)生成随机数r_{A}\in \left [ 1,n-1 \right ]

        (2)计算R_{A}=\left [ r_{A} \right ]G=\left ( x_{1},y_{1} \right )

        (3)将R_{A}发送给用户B。

  • 用户B

        (1)生成随机数r_{B}\in \left [ 1,n-1 \right ]

        (2)计算R_{B}=\left [ r_{B} \right ]G=\left ( x_{2},y_{2} \right )

        (3)从R_{B}中提取出元素x_{2},将其转换为整数,计算\overline{x_{2}}=2^{w}+\left ( x_{2}\&\left ( 2^{w}-1 \right ) \right )

        (4)计算t_{B}=\left ( d_{B}+\overline{x_{2}}\cdot r_{B} \right )mod\, n

        (5)验证R_{A}是否满足椭圆曲线方程,若不满足则协商失败;否则从R_{A}中提取出元素x_{1},将其转换为整数,计算\overline{x_{1}}=2^{w}+\left ( x_{1}\&\left ( 2^{w}-1 \right ) \right )

        (6)计算V=\left [ h\cdot t_{B} \right ]\left ( P_{A}+\left [ \overline{x_{1}} \right ] R_{A}\right )=\left ( x_{V},y_{V} \right ),若V为无穷远点则协商失败;否则将x_{V}y_{V}转换为比特串;

        (7)计算K_{B}=KDF\left ( x_{V}||y_{V}||Z_{A}||Z_{B},klen \right )

        (8)(选项)将R_{A}的坐标x_{1}y_{1}R_{B}的坐标x_{2}y_{2}转换为比特串,计算S_{B}=Hash\left ( 0x02||y_{V}||Hash\left ( x_{V}||Z_{A}||Z_{B}||x_{1}||y_{1}||x_{2}||y_{2} \right ) \right )

        (9)将将R_{B},(选项S_{B})发送给用户A。

  • 用户A

        (4)从R_{A}中提取出元素x_{1},将其转换为整数,计算\overline{x_{1}}=2^{w}+\left ( x_{1}\&\left ( 2^{w}-1 \right ) \right )

        (5)计算t_{A}=\left ( d_{A}+\overline{x_{1}}\cdot r_{A} \right )mod\, n

        (6)验证R_{B}是否满足椭圆曲线方程,若不满足则协商失败;否则从R_{B}中提取出元素x_{2},将其转换为整数,计算\overline{x_{2}}=2^{w}+\left ( x_{2}\&\left ( 2^{w}-1 \right ) \right )

        (7)计算U=\left [ h\cdot t_{A} \right ]\left ( P_{B}+\left [ \overline{x_{2}} \right ] R_{B}\right )=\left ( x_{U},y_{U} \right ),若V为无穷远点则协商失败;否则将x_{V}y_{V}转换为比特串;

        (8)计算K_{A}=KDF\left ( x_{U}||y_{U}||Z_{A}||Z_{B},klen \right )

        (9)(选项)将R_{A}的坐标x_{1}y_{1}R_{B}的坐标x_{2}y_{2}转换为比特串,计算S_{1}=Hash\left ( 0x02||y_{U}||Hash\left ( x_{U}||Z_{A}||Z_{B}||x_{1}||y_{1}||x_{2}||y_{2} \right ) \right ),检验S_{1}=S_{B}是否成立,若等式不成立,则从B到A的密钥确认失败;

        (10)(选项)计算S_{A}=Hash\left ( 0x03||y_{U}||Hash\left ( x_{U}||Z_{A}||Z_{B}||x_{1}||y_{1}||x_{2}||y_{2} \right ) \right ),并将S_{A}发送给用户B。

  • 用户B

        (10)(选项)计算S_{2}=Hash\left ( 0x03||y_{V}||Hash\left ( x_{V}||Z_{A}||Z_{B}||x_{1}||y_{1}||x_{2}||y_{2} \right ) \right ),检验S_{2}=S_{A}是否成立,若等式不成立,则从A到B的密钥确认失败。

5. SM2公钥加密算法

        设待加密消息M的位长为klen,A为加密者,B为解密者。

5.1 加密算法

        (1)生成随机数k\in \left [ 1,n-1 \right ]

        (2)计算C_{1}=\left [ k \right ]G=\left ( x_{1},y_{1} \right ),将C_{1}转换为比特串;

        (3)计算S=\left [ h \right ]P_{B},若S为无穷远点,则报错并退出;

        (4)计算\left [ k \right ]P_{B}=\left ( x_{2},y_{2} \right ),将坐标x_{2}y_{2}转换为比特串;

        (5)计算t=KDF\left ( x_{2}||y_{2},klen \right ),若t为全0比特串,则返回步骤(1);

        (6)计算C_{2}=M\oplus t

        (7)计算C_{3}=Hash\left ( x_{2}||M||y_{2} \right )

        (8)输出密文C=C_{1}||C_{3}||C_{2}

5.2 解密算法

        设用户B接收到的数据为C{}'

        (1)从{C}'中提取出比特串{C_{1}}',将{C_{1}}'转换为椭圆曲线上的点,验证{C_{1}}'是否满足椭圆曲线方程,若不满足,则报错并退出;

        (2)计算{S}'=\left [ h \right ]{C_{1}}',若{S}'为无穷远点,则报错并退出;

        (3)计算\left [ d_{B} \right ]{C_{1}}'=\left ( {x_{2}}',{y_{2} }'\right ),将坐标{x_{2}}'{y_{2}}'转换为比特串;

        (4)计算{t}'=KDF\left ( {x_{2}}'|{|y_{2}}',klen \right ),若{t}'为全0比特串,则报错并退出;

        (5)从{C}'中提取比特串{C_{2}}',计算{M}'={C_{2}}'\oplus {t}'

        (6)计算u=Hash\left ( {x_{2}}'||{M}'||{y_{2}}' \right ),从{C}'中提取比特串{C_{3}}',若u\neq {C_{3}}'则报错并退出;

        (7)输出明文{M}'

6. 参考文献

[1]汪朝晖,张振峰. SM2椭圆曲线公钥密码算法综述 [J]. 信息安全研究, 2016, 2 (11): 972-982.

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,用于实现数字签名、密钥交换和数据加密等功能。相比于RSA算法SM2算法基于椭圆曲线上点群离散对数难题,具有更高的密码强度。\[1\] 关于SM2算法的移植,目前已经在我国的密码应用领域得到广泛应用。国家密码管理局于2011年发布了《关于做好公钥密码算法升级工作的通知》,要求在建和拟建公钥密码基础设施电子认证系统和密钥管理系统中使用SM2算法。同时,自2011年7月1日起,投入运行并使用公钥密码的信息系统也应使用SM2算法。\[2\] SM2算法的移植工作主要包括将算法应用到相应的系统和设备中,并确保其安全性和性能。移植过程中需要考虑算法实现细节、密钥管理、算法性能优化等方面的问题。同时,还需要进行相关的测试和验证,确保移植后的算法能够正常运行并满足安全需求。 总之,SM2椭圆曲线公钥密码算法已经在我国得到广泛应用,并且有相关的政策要求在密码应用系统中使用该算法。移植工作需要考虑算法实现和性能优化,并进行相应的测试和验证。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* *3* [sm2国密算法的纯c语言版本,使用于单片机平台(静态内存分配)](https://blog.csdn.net/qq8864/article/details/100582268)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值