国密 SM2 的非对称加密解密过程
国密 SM2 的非对称加密解密过程
椭圆曲线
椭圆曲线是由一组方程描述的点的集合:
y2 = x3 + ax + b 其中 a, b 满足 (4a3 + 27b2 ≠ 0)
SM2 定义了一个 sm2p256v1 的椭圆曲线方程
各种参数
BigInteger p = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF");
BigInteger a = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC");
BigInteger b = FromHex("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93");
BigInteger n = FromHex("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123");
BigInteger h = BigInteger.One;
Point G coord: (22963146547237050559479531362550074578802567295341616970375194840604139615431, 85132369209828568825618990617112496413088388631904505083283536607588877201568)
公钥,私钥
- 私钥:
可以随机生成一个 BigInteger D,必须符合区间 [1, n - 1]
- 公钥:
私钥 D * G(Point) 得到的一个 Point: Q
隐函数微分 dy/dx = (3x² + a) / (2y)
椭圆曲线密码(Elliptic Curve Cryptography,ECC)的安全性主要基于椭圆曲线离散对数问题(Elliptic Curve Discrete Logarithm Problem,ECDLP)的难度。简单来说,如果知道椭圆曲线上的两个点P和Q,并且知道存在一个整数d,使得dP=Q(这里的乘法表示点的数乘,就是把点P加d次),那么想从P和Q推算出d是几乎不可能的。这就是椭圆曲线离散对数问题。
这个乘法异常的复杂 D * G 就是 D 个 G点相加,2 * G 就是过这个点的切线与椭圆曲线的交点,和 x 轴的对称点,还有有限域的处理,求同余...。
所以也能看出来知道公钥和 G 也很难求出 私钥 D

私钥和公钥的关系:
D * G = Q
加密过程
公钥: Q
- 随机生成一个 BigInteger K
- K * Q 生成一个 Point(x, y) KPB
C2: 每对原文 byte[] 每32个byte z循环处理,序号初始为1
32 和后续待处理字节长度取小值
- 对 KPB(x,y), 序号做摘要 记作 buf: byte[32]
- 这32个字节 分别和 buf的32个字节做异或运算 z[zOff + i] ^= buf[xOff + i];
- 序号 + 1 处理后续的
C1: k * G
C3: KPB.x 原文byte[], KPB.y 做摘要
解密过程
私钥: D
因为:C1 = K * G
所以 C1 * D = K * G * D = K * (G * D) = K * Q = KPB
然后: 异或运算满足 A ^ B ^ A = B
所以对 C2来相同的运算即可得到原文
C3用来验证是否一致
总结
知道密文和公钥无法解密,因为不知道随机生成的 K
C1 部分的生成和公私钥的生成是一模一样的,类似的原理很难通过 C1 和 G 倒推出K,解不了密
加密后占用空间 C2 和原文长度一致
C1 不压缩 标志位 + x + y = 65, C3 = 摘要长度 32 增大 97
C1 压缩 标志位 + x = 33 C3 = 摘要长度 32 增大 65
然后一般的结果有 C1C2C3 和 C1C3C2两种排列模式
实际情况中,针对这三部分有无数种基于 ASN.1 的包装方式,最终都是按照 C1C2C3 组装好进行解密
国密 SM2 的非对称加密解密过程的更多相关文章
- 推荐一款能支持国密SM2浏览器——密信浏览器
密信浏览器( MeSince Browser )是基于Chromium开源项目开发的国密安全浏览器,支持国密算法和国密SSL证书,同时也支持国际算法及全球信任SSL证书:密信浏览器使用界面清新,干净. ...
- Java对称与非对称加密解密,AES与RSA
加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么 ...
- SM2的非对称加解密java工具类
maven依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov- ...
- https的加密解密过程
前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...
- 谈谈PBOC3.0中使用的国密SM2算法
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...
- 一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱
转:https://blog.csdn.net/xuq09/article/details/91815366 The GmSSL Project网址:http://gmssl.org/docs/qui ...
- bouncycastle 国密SM2 API的使用
摘要:本文不对SM2做过多的介绍,主要介绍java bouncycastle库关于SM2的相关API的使用及注意事项 1. SM2 签名: 注意: 1)签名格式ASN1(描述了一种对数据进行表示.编码 ...
- 使用java实现对称加密解密(AES),非对称加密解密(RSA)
对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- golang实现aes-cbc-256加密解密过程记录
我为什么吃撑了要实现go的aes-cbc-256加密解密功能? 之前的项目是用php实现的,现在准备用go重构,需要用到这个功能,这么常用的功能上网一搜一大把现成例子,于是基于go现有api分分钟实现 ...
随机推荐
- vscodeC++生成配置文件
参考 https://www.cnblogs.com/harrypotterisdead/p/14207866.html 和 https://www.cnblogs.com/heyiping/p/14 ...
- welearn平台答案 大学英语 视听说 综合教程
打开页面 1. F12 2. ctrl+shift+c 3. 鼠标移动到选项位置 4. 带data-solution的就是答案
- windows编译ZLMediaKit流媒体服务webrtc
环境说明 ZLMediaKit编译需要的软件 visual studio 2022 cmake 3.29.0-rc2 OpenSSL 1.1.1w(不想踩坑的话安装这个版本) libsrtp 2.6. ...
- Java解析JSON数据,有回车符\n时解析报错
一.问题由来 测试人员最近在测试时,后台日志一直抱错,大致意思是JSON数据解析错误,错误信息如下: 二.问题分析 去查看代码时,发现异常信息是这里抛出来的,解析时使用的是json-lib这个包中的方 ...
- vetur 和 volar 不要一起装 - vscode插件 已解决
vetur 和 volar 不要一起装 - vscode插件 会有各种稀奇古怪的问题. 解决方案 利用 vscode 工作区 新建工作区 然后全局 将 volar 禁用工作区,起一个新的vue3项目, ...
- JavaFx 圆形头像实现
原文:JavaFx 圆形头像实现 - Stars-One的杂货小窝 本文基于TornadoFx框架进行编写,封装工具代码是kotlin版本 圆形头像框组件封装成了stars-one/common-co ...
- Python爬虫实战系列4:天眼查公司工商信息采集
Python爬虫实战系列1:博客园cnblogs热门新闻采集 Python爬虫实战系列2:虎嗅网24小时热门新闻采集 Python爬虫实战系列3:今日BBNews编程新闻采集 Python爬虫实战系列 ...
- 记录--Three.js入门教程——教不会算我输
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在javascript中使用Three.js设计并且实现3D场景是一个很有意思的事情,因为在浏览器中就能够渲染出3D场景,非常简单和轻便. ...
- 记录--Vue PC前端扫码登录
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 需求描述 目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户 ...
- 你的DDPG/RDPG为何不收敛?
园子好多年没有更过了,草长了不少.上次更还是读博之前,这次再更已是博士毕业2年有余,真是令人唏嘘.盗链我博客的人又见长,身边的师弟也问我挖的几个系列坑什么时候添上.这些着实令我欣喜,看来我写的东西也是 ...