去年今日此门中,人面桃花相映红。
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。