Springboot web SM2 加解密签名验签实践

去年今日此门中,人面桃花相映红。

1 前言

在上一篇文章中,已经分享了 RSA 的原理以及使用方法,在本文中将介绍另外一个比较重要加解密算法 SM2, 其使用的是椭圆曲线算法,相比可逆模幂运算来讲,SM2 密码复杂度高、处理速度快、机器性能消耗更小比较难以破解。在本文中将全方位讲解 SM2 的原理, 加密、解密、签名、验签等内容,并结合 springboot 进行代码的编写,本文使用了 Hutool 来实现所有的操作过程。

2 SM2 算法原理

SM2 全称为"椭圆曲线公钥密码算法",是在工作中最常见的非对称加解密算法。它基于椭圆曲线离散对数问题(ECDLP)的困难性,结合具体的密码学算法,实现了高效的加密、解密、签名和验签等操作。SM2 于 2010 年由中国国家密码管理局正式发布,并于 2012 年成为国家密码行业标准。

椭圆曲线离散对数问题,这是一个很数学的概念,具体来说,它使用了一个椭圆曲线加法运算和一个椭圆曲线点乘法运算来实现安全的加密和签名功能。椭圆曲线方程的一般形式为 y^2 = x^3 + a*x + b

css 复制代码
# 椭圆曲线的含义
1 椭圆曲线是在曲线上随机取点 A,经过 B 点做直线与椭圆曲线相较于 C1 点,然后取X轴对称点取 C 点,
2 连接 A 和 C 点经过 D1, 在对称位置上取点 D。
3 连接 A 和 D 点做直线经过点 E1, 在对称位置上取点 E。

椭圆曲线算法(ECC)如下图所示,已知椭圆曲线上的 A点和 E 点,需要知道经过几次运算和几次直线能抵达,这简直就是一个平面的三体问题,如果不知道初始的点位,是不可能运算出来的。

ini 复制代码
# openssl 生成 ms2 密钥的流程
1 首先生成 sm2 私钥文件: openssl ecparam -genkey -name SM2 -out pri_key.pem
2 使用私钥生成公钥文件: openssl ec -in pri_key.pem -pubout -out pub_key.pem
3 私钥文件: openssl ec -in pri_key.pem -text
4 私钥转换格式为pkcs#8:openssl pkcs8 -topk8 -inform PEM -in pri_key.pem -outform pem -nocrypt -out pri_key_pkcs8.pem

# 使用hutool 生成 sm2 公私钥
SM2 sm2 = new SM2();
String publicKeyBase64 = sm2.getPublicKeyBase64();
String privateKeyBase64 = sm2.getPrivateKeyBase64();
System.out.println(privateKeyBase64);
System.out.println(publicKeyBase64);

SM2 生成公私钥的过程解析

SM2 加签验签的过程解析

3 SM2 算法特点

安全性:SM2算法基于椭圆曲线离散对数问题,具有较高的安全性。当前无已知有效的攻击方法能够在合理时间内求解椭圆曲线离散对数问题,因此SM2的安全性得到了广泛认可。

高效性:相对于传统的RSA算法,SM2算法在相同安全性下拥有更短的密钥长度和更快的运算速度,这使得SM2在资源有限的场景下更具优势。

自主可控:SM2是中国自主研发的密码算法,避免了对国外算法的依赖,提高了信息安全的自主可控性。

4 hutool 实现 SM2 加解密

使用 Hutool 进行 sm2 加解密的方式和 RSA 相似,如下图所示,还是公钥加密,私钥解密,私钥加签,公钥验签。

5 总结

SM2 椭圆曲线密码算法作为中国自主研发的密码学成就,在信息安全领域发挥着重要作用。其安全性、高效性以及自主可控性使得它成为国内外广泛关注和应用的密码算法。SM2的发展不仅为我国信息安全提供了坚实保障,同时也为密码学领域的创新和发展贡献了中国的力量。随着信息技术的不断发展,SM2算法将继续发挥其重要作用,推动我国在信息安全领域的进一步发展。项目代码已经上传,github 地址 springboot-auth

相关推荐
程序员-珍14 分钟前
SpringBoot v2.6.13 整合 swagger
java·spring boot·后端
海里真的有鱼22 分钟前
好文推荐-架构
后端
菜鸟求带飞_37 分钟前
算法打卡:第十一章 图论part01
java·数据结构·算法
浅念同学39 分钟前
算法.图论-建图/拓扑排序及其拓展
算法·图论
骆晨学长1 小时前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
是小Y啦1 小时前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
AskHarries1 小时前
利用反射实现动态代理
java·后端·reflect
liuyang-neu1 小时前
力扣 42.接雨水
java·算法·leetcode
y_dd1 小时前
【machine learning-12-多元线性回归】
算法·机器学习·线性回归
m0_631270401 小时前
标准c语言(一)
c语言·开发语言·算法