SM2 加密与解密过程概述

1.SM2算法简介

SM2算法是中国国家密码局推出的国产化算法,是基于椭圆曲线的非对称算法,相对于RSA算法,SM2具有密钥更小,运算速度更快,相同密钥长度下具有更高安全性等优势。

1.1SM2 椭圆曲线定义

SM2算法定义了两条椭圆曲线,一条基于F§上的素域曲线,一条基于F(2^m)上的拓域曲线,目前使用最多的曲线为素域曲线,本文介绍的算法基于素域曲线上的运算,素域曲线方程定义如下:
y2−x3+ax+by^2-x^3+ax+b y2−x3+ax+b

###1.2 SM2 曲线参数定义

SM2算法定义了5个默认参数,即有限域F§的规模p,椭圆曲线参数a,b,椭圆曲线的基点G(x,y),与G的阶n。

国密算法标准中给出了对应的默认值,默认值如下:

p:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
n:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
a:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b:28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
Gx:32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
Gy:BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

牢记上面四个默认参数与一个基础点,在后面运算过程中会用到上面的所有参数。

1.2SM2 密钥结构定义

SM2作为非对称算法拥有公钥与私钥,对于SM2中公私钥的结构如下:

私钥:d 符合要求的32byte(256bit)随机数
公钥:(x,y),实际一个坐标点,依据私钥d计算所得

依据私钥计算公钥的逻辑不在本文介绍范围。

2.SM2 加密数据

SM2加密数据使用公钥(x,y)进行加密,加密结果为c1c3c2部分算法中定义为c1c2c3,下面介绍密文中各个结构实际含义:

c1: 随机数K与G(x,y)的多倍点运算结果,结果也是一个点,记录为(kx,ky)
c2: 实际密文值
c3:使用SM3对于 kx||data||ky的hash值,在解密时校验解密结果是否正确

2.1c1计算逻辑

在实际算法实现中,c1的运算逻辑如下:

c1 = k·G(x,y)

k是一个随机数,随机数的生成逻辑如下:

选取一个随机数k,使得随机的k的取值范围为[1,n-1],这块的n是1.2章节中提到的默认值

2.2c2计算逻辑

c2是真正的数据密文,计算逻辑如下:

c2 = 密钥流 (异或)data

密钥流的计算逻辑如下:

1. 复用计算c1时产生的随机数k
2. 计算 kpk(x,y),得到kpx,kpy
3. 根据data的长度与kpx,kpy生成与data等长的密钥流,用于c2的最终计算

整体密钥流计算采用KDF方法计算,KDF可以理解成根据输入的因子,产生期望长度的数据流,目前直流的KDF计算采用HASH方法。SM2中的KDF使用的是SM3摘要。

2.3 c3计算逻辑

c3是一个SM3的摘要值,作用是用于解密时校验解密出的原文数据的正确性,c3的计算逻辑如下:

c3 = HASH(kpx,data,kpy)

在解密时需要在解密出原文后计算HASH值做最后确认,确认一致后认定解密成功,不一致则解密失败。

3. SM2 解密数据

SM2的解密流程实际是根据c1计算出加密时使用的密钥流,使用密文数据与密钥流进行异或得到数据明文,后续在确认计算出的摘要值与密文中c3是否一致。

3.1 密钥流计算逻辑

1. 从密文中分离出 c1(x,y)
2. 使用私钥d与c1进行多倍点运算,得到计算结果 (cx,cy),d·c1(cx,cy)
3. 根据c2长度计算密钥流,KDF(cipherlen,cx,cy)

这里为什么私钥d与c1的运算结果等于k与G(x,y)运算结果,请参网上的其他帖子或数学证明过程,不在本文的讨论范围。

3.2 解密运算

上面我们得到了密钥流的中间结果,我们根据密钥流来计算明文:

原文 = 密钥流 (异或) 密文

3.3 解密校验

接下来我们计算解密后的摘要值与c3是否相等,计算流程如下:

1. 基于以上的运算结果的cx,cy与得到的原文
2. SM3(cx,计算得到的明文,cy)
3. 对比计算结果与c1,一致解密成功,不一致则解密失败

SM2算法加密与解密过程相关推荐

  1. 详解国密SM2的加密和解密

    在上一篇文章<解读国密非对称加密算法SM2>介绍了国密非对称算法SM2,在文章中说到,如果现有的网络库中已经实现ECC算法,只需加入SM2命名曲线的参数即可.这对于ECDHE密钥协商和EC ...

  2. RSA加密算法加密与解密过程解析

    1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所谓对称加密即是指在加密和解密时使用的是同一个密钥 ...

  3. 记录一次寻4399加密信息解密过程

    记录一次寻4399加密信息解密过程 一.前提须知 在4399页面中,登录面板中输入了用户名和密码(随便输入,只是拿来试试解密),输入的用户名是:test ,密码:23232323: 4399网站采用的 ...

  4. 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密

    公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...

  5. mcrypt php 加密解密,mcrypt启用 加密以及解密过程详细解析

    Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原. 1.PHP加密扩展库Mcrypt安装在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmc ...

  6. 黑客学习-密码学:基于openssl的算法加密和解密

    在Linux系统中自带openssl工具,加密和解密,可以在Linux上进行.利 openssl工具,用DES.3DES.IDEA.AES等对称算法对文件加密解密,和用RSA非对称算法对文件加密解密. ...

  7. Java实现HTTPS加密、解密过程

    1.HTTPS握手过程模拟 以下文章来自:http://kingj.iteye.com/blog/2103662 1.1准备工作 1.创建java证书: C:\> keytool -genkey ...

  8. 国密算法加密、解密、加签、验签

    理论就不说了:我也看不懂,这两篇够了 https://blog.51cto.com/u_13929722/3422122 https://blog.csdn.net/w57685321/article ...

  9. python aes加密 cbc_Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda...

    1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...

  10. php 破解加密帖子,某PHP加密文件解密过程初探 · 浮萍’s Blog

    最近在52PJ上看到一篇关于PHP加密解密的帖子,过程非常详细,而且作者很负责,对于别人的回答也很热心.跟着动手做了一下,记录一下遇到的问题.这里针对的是PHP加密网站的免费加密进行的调试. 采用的I ...

最新文章

  1. html中item属性,项目id(属性) | itemid (attribute)
  2. 7个让你惊叹的HTML技巧
  3. Swarm 如何实现 Failover?- 每天5分钟玩转 Docker 容器技术(98)
  4. 产品定义到产品推广的思路
  5. java多线程编程--基础篇
  6. Wargame.kr_Web:already got
  7. linux c之((void *) - 1)是啥意思
  8. 如何安装python3.8_python3.8下载及安装步骤详解
  9. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
  10. Uva 10557 XYZZY
  11. SPOJ REPEATS Repeats (后缀数组 + RMQ:子串的最大循环节)题解
  12. live2d手机制作软件_Live2D制作客户端下载v2.1.14-Live2D制作软件下载 - iefans下载
  13. Java数据库的JDBC编程
  14. Kafka权威指南,初识 Kafka
  15. 部署calico网络的k8s集群
  16. 常用开发工具及常用DOS命令
  17. JavaScript - 动画介绍与学习
  18. python 补获按键_qpython可以捕获耳机按键吗?
  19. python打印皮卡丘步骤_编程作战丨如何利用python绘制可爱皮卡丘?
  20. select option

热门文章

  1. 设置java环境变量path_配置java环境变量path怎么设置
  2. 用iSSH代替Mobile Terminal管理iOS
  3. Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名
  4. 苹果电脑如何快速用计算机,苹果电脑快捷键如何使用 Mac快捷键大全详细教程...
  5. 速达软件|无法打开帐套数据库|一般性网络错误
  6. 最全最新cpu显卡天梯图_2019.12月CPU和显卡性能天梯图
  7. Xcode12 兼容iOS14 及下载链接
  8. 使用融云 SDK 避坑指南之 iOS13 推送失败
  9. mac os+selenium2+chrome驱动+python3
  10. 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?