关于SM2国密算法开发流程

SM2国密算法开发流程

最近公司在做芯片加密项目,正好我刚入职的时候做了一个备用,拿来顶,然后改完交给对接的公司,在一开始看的时候,虽然我注释写的挺多,但是关于SM2国标算法的算法流程忘得差不多了,然后浪费了很多时间,花了2-3天才搞定项目里的Bug,好多都是忘记流程产生的,现在来写个文章记录一下。首先

SM2算法介绍:

SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥秒速昂发所需密钥长度小很多。

ECC算法描述:

1.用户A选定一条适合加密的椭圆曲线Ep(a,b)(如:y2=x3+ax+b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有密钥k,并生成公开密钥(公钥PB)K=kG。
3、用户A将Ep(a,b)和点(公钥)K,G传给用户B。   
4、用户B接到信息后 ,将待传输的明文(M)编码到Ep(a,b)上一点M,并产生一个随机整数r(r<n)。加密开始   
5、用户B计算点C1=M+rK;C2=rG。   
6、用户B将C1、C2传给用户A。   
7、用户A接到信息后,计算C1-kC2,结果就是点M。因为C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M   再对点M进行解码就可以得到明文。

密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:   T=(p,a,b,G,n,h)。   (p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分)

这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;
2、p≠n×h;
3、pt≠1 (mod n),1≤t<20;   
4、4a3+27b2≠0 (mod p);   
5、n 为素数;   
6、h≤4。

基本算法流程

根据国家规定的SM2算法流程标准。

整体流程结构
在这里插sda 入图片描述

  1. 生成公私钥 ,SM2国标算法主要是生成公钥和私钥,一方拿着私钥另一方拿着公钥,来互相破解验证加密的数据;
  2. 私钥签名,私钥对一组原始数据M进行HASH计算,一般来说HASH计算的SM2标准流程是输入你的用户ID和公钥产生一个Z值,然后Z值和M进行拼接产生M*,然后对M*进行HASH计算 ,但是不同的算法工具在这块处理的时候HASH计算可能不同,基本区别就在这里。然后HASH计算完,进行签名计算产生一个R值和S值。然后将产生的R值和S值还有原始数据M发给另一方。
    l 签名者用户A的密钥对包括其私钥dA和公钥PA=[dA]G= (xA,yA)
    l 签名者用户A具有长度为entlenA比特的可辨别标识IDA,
    l ENTLA是由整数entlenA转换而成的两个字节
    l ZA=H256(ENTLA || IDA || a || b || xG || yG|| xA || yA)。
    l 待签名的消息为M,
    l 数字签名(r,s)

在这里插入图片描述
说明:第5步若r=0或r+k=n则返回第3步;第6步若s=0则返回第3步。

  1. 公钥验签 ,当一方收到了R值S值还有原始数据的时候,在进行取Z值然后拼接进行HASH计算当HASH都相等的时候验签才可能成功,然后进行验签将R值S值以及产生的HASH值还有公钥带入进行验签计算,如果计算结果R值=S值则成功,反正失败;
    在这里插入图片描述
    计算流程
    | (x′1; y′1) |
    |= [s′]G + [t]PA|
    |= [s′]G + [s′] PA + [r′] PA |
    |= [s′]G +[s′][dA] G +[r′·dA] G |
    |= [(1+ dA)×s′] G+[r′·dA] G|
    |= [k] G |
    |= ( x1, y1 ) |

  2. 密钥交换协议,进行安全通信之前,各用户间需要确立加密程序的细节,尤其是密钥。在对称密钥加密系统,各用户间需要确立共同使用的单一密钥,此步骤即密钥交换。交换对称密钥必须透过另一安全的通信管道进行;否则,如果以明文形式在网络发送,将使窃听者能够立即得知密钥以及据其加密的数据。以前,交换密称密钥是非常麻烦的,可能需要使外交邮袋等安全渠道。
    公开密钥加密的出现大大减轻了交换对称密钥的困难,公钥可以公开(透过不安全、可被窃听的渠道)发送,用以加密明文。不过,公钥加密在在计算上相当复杂,性能欠佳、远远不比对称加密。
    因此,在一般实际情况下,往往通过公钥加密来随机创建临时的对称秘钥,亦即对话键,然后才通过对称加密来传输大量、主体的数据。(也叫混合加密算法);
    一般有基于俩种加密类型:
    非对称加密算法
    原理:拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。
    依靠专门的密钥交换算法
    原理:这个原理比较复杂,感兴趣可以下去了解。
    举例:DH 算法及其变种(ECDH算法)
    在这里插入图片描述参与KDF运算的所有输入数据均相等,所以得到的协商密钥自然相同。

  3. 数据加密,当我们私钥签名公钥验签之后,我们建立起了连通的通道,我们可以进行数据加密,用公钥对所需要的数据进行加密,发送。
    在这里插入图片描述
    说明:第3步计算S=[h]PB略,因h=1。

  4. 数据解密 然后接收到了加密数据之后,用私钥解密
    在这里插入图片描述
    说明:第2步计算S=[h]C1略,因h=1。

原理
关键在于说明加密流程第4步计算的 [k]PB= (x2, y2) 与解密流程第2步计算的 [dB]C1 = (x2, y2) 相等。解密流程第2步计算

计算流程

(x2, y2)

= [dB]C1

=[dB][k]G

=[k] [dB] G

=[ k] PB

[k]PB是加密流程第4步计算值。所以加密流程第4步计算的[k]PB = (x2,y2) 与解密流程第2步计算的[dB]C1 = (x2, y2) 相等。

参考的博客
https://blog.csdn.net/samsho2/article/details/80772228
https://blog.csdn.net/u013896064/article/details/99962436
https://blog.csdn.net/u011068702/article/details/73357150?utm_medium=distribute.wap_relevant_bbs_down.none-task-blog-2%7Eall%7Efirst_rank_v2%7Erank_v29-16.nonecase&dist_request_id=1328769.2638.16172957829153603&depth_1-utm_source=distribute.wap_relevant_bbs_down.none-task-blog-2%7Eall%7Efirst_rank_v2%7Erank_v29-16.nonecase

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值