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

相关推荐
passer__jw76725 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
代码之光_198025 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi30 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Ocean☾31 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序39 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
颜淡慕潇1 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城2 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵