SpringBoot 接口加密SM2非对称加密算法 国密算法 公钥加密 私钥解密

介绍

SM2是一种基于椭圆曲线密码学(ECC)的公钥密码体制,它有一套严格的生成私钥和公钥的规范。如果你想要生成有效的SM2公钥和私钥对,你需要按照SM2算法来生成。私钥通常是一个随机的大整数,而公钥则通过私钥和椭圆曲线方程生成。

  • 私钥必须保密:私钥应该保存在安全的位置,绝对不能泄露给未经授权的人员。如果私钥泄露,别人可以伪造你的身份。
  • 公钥可以公开:公钥是用来加密数据或验证签名的,可以放心公开,任何人都可以用你的公钥来加密数据,只有持有私钥的人才能解密。

依赖

xml 复制代码
 <!--    引入Bouncy Castle依赖    -->
<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcpkix-jdk18on</artifactId>
	<version>1.78.1</version>
</dependency>

<!--    引入Hutool依赖    -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-crypto</artifactId>
    <version>5.8.14</version> <!-- 请根据实际版本替换 -->
</dependency>

生成公钥私钥

公钥和私钥不是随意填写的,也是通过一系列的算法进行计算的

java 复制代码
// 生成 SM2 密钥对
SM2 sm2 = new SM2();

// 获取私钥和公钥
byte[] privateKey = sm2.getPrivateKey().getEncoded();
byte[] publicKey = sm2.getPublicKey().getEncoded();

// 转换为十六进制字符串
String privateKeyHex = HexUtil.encodeHexStr(privateKey);
String publicKeyHex = HexUtil.encodeHexStr(publicKey);

// 打印结果
System.out.println("sm2PrivateKey: " + privateKeyHex); // 标准长度私钥
System.out.println("sm2PublicKey: " + publicKeyHex); // 标准长度公钥

对私钥和公钥进行保存,后续加密解密需要使用

powershell 复制代码
私钥: 308193020100301306072a8648ce3d020106082a811ccf5501822d047930770201010420e8346463a0c243411507da79570832bcebcdeb67710d4cb6cb292c51c62be364a00a06082a811ccf5501822da14403420004f5388f133c0beb2f210b01d5ffa96f114d9b37dbfcf7634d939a78f581305aecc76274bc1431c22b7a9f1ce47831cd493947366ce898186c5a496160dc58b32a
公钥: 3059301306072a8648ce3d020106082a811ccf5501822d03420004f5388f133c0beb2f210b01d5ffa96f114d9b37dbfcf7634d939a78f581305aecc76274bc1431c22b7a9f1ce47831cd493947366ce898186c5a496160dc58b32a

加密解密

java 复制代码
String privateKeyHex = "308193020100301306072a8648ce3d020106082a811ccf5501822d047930770201010420e8346463a0c243411507da79570832bcebcdeb67710d4cb6cb292c51c62be364a00a06082a811ccf5501822da14403420004f5388f133c0beb2f210b01d5ffa96f114d9b37dbfcf7634d939a78f581305aecc76274bc1431c22b7a9f1ce47831cd493947366ce898186c5a496160dc58b32a"; 
String publicKeyHex = "3059301306072a8648ce3d020106082a811ccf5501822d03420004f5388f133c0beb2f210b01d5ffa96f114d9b37dbfcf7634d939a78f581305aecc76274bc1431c22b7a9f1ce47831cd493947366ce898186c5a496160dc58b32a"; 

// 创建 SM2 实例
SM2 sm2Private = new SM2(HexUtil.decodeHex(privateKeyHex), null);  // 使用私钥
SM2 sm2Public = new SM2(null, HexUtil.decodeHex(publicKeyHex));    // 使用公钥

// 公钥加密
String data = "Hello, SM2!";
byte[] encryptedData = sm2Public.encrypt(data.getBytes());
System.out.println("Encrypted Data: " + HexUtil.encodeHexStr(encryptedData));

// 私钥解密
byte[] decryptedData = sm2Private.decrypt(encryptedData);
System.out.println("Decrypted Data: " + new String(decryptedData));
powershell 复制代码
Encrypted Data: 04dff2fe883146ae0bd67ef6aae892be1640212b6be49de369fc78134778c9ceed6c52cc800aad153cfed0a6d64c773e85548bea7e77e00dc01078f1eb30673b3a5299ebf0ab9b4ecfaa652968afa7ecda4915ebc37210a92b75393d1d08a639e0de164049a493c52d142496
Decrypted Data: Hello, SM2!
相关推荐
zybishe5 分钟前
计算机毕业设计原创定制(免费送源码)Java+SpringBoot+MySQL SpringBoot物流配送后台系统
java·css·c++·spring boot·spark·django·课程设计
BIM云平台开发7 分钟前
关于return,yield 和 yield return
java·开发语言·数据结构·c#
黄俊懿7 分钟前
【深入理解SpringCloud微服务】Sentinel功能详解
后端·spring·spring cloud·微服务·中间件·架构·sentinel
运维&陈同学11 分钟前
【zookeeper04】消息队列与微服务之zookeeper客户端访问
linux·后端·微服务·zookeeper·云原生·消息队列·云计算
GGBondlctrl15 分钟前
【Spring MVC】关于Spring MVC编程中与http请求的参数传递的详细介绍
java·spring·mvc·postman·请求参数的传递·json的传递
小小unicorn17 分钟前
基于Boost库的搜索引擎
java·搜索引擎·dubbo
m0_7482329217 分钟前
JVM的内存区域划分
java·jvm·算法
遇见你真好。24 分钟前
x-easypdf 初始与简单使用
java·springboot·x-easypdf
菜鸟挣扎史26 分钟前
关于一次开源java spring快速开发平台项目RuoYi部署的记录
java·spring·开源
硕风和炜1 小时前
【LeetCode: 743. 网络延迟时间 + Dijkstra】
java·算法·leetcode·面试·dijkstra·最短路径