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

相关推荐
码事漫谈3 小时前
当AI开始“思考”:我们是否真的准备好了?
前端·后端
2301_764441333 小时前
LISA时空跃迁分析,地理时空分析
数据结构·python·算法
东北洗浴王子讲AI3 小时前
GPT-5.4辅助算法设计与优化:从理论到实践的系统方法
人工智能·gpt·算法·chatgpt
Billlly4 小时前
ABC 453 个人题解
算法·题解·atcoder
玉树临风ives4 小时前
atcoder ABC 452 题解
数据结构·算法
feifeigo1234 小时前
基于马尔可夫随机场模型的SAR图像变化检测源码实现
算法
铁东博客4 小时前
Go实现周易大衍筮法三变取爻
开发语言·后端·golang
fengfuyao9855 小时前
基于STM32的4轴步进电机加减速控制工程源码(梯形加减速算法)
网络·stm32·算法
oak隔壁找我5 小时前
SpringBoot中MyBatis的Mapper的原理
后端
oak隔壁找我5 小时前
Spring Boot 自动配置(Auto-configuration)的核心原理
后端