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!
相关推荐
zwrlj527几秒前
编码能效插件SmartInputPro插件扩展
后端
加瓦点灯3 分钟前
从阻塞到 Reactor:理解 Java I/O 背后的架构思维
后端
zzzzz3693 分钟前
服务器返回前端Long类型精度丢失
后端
AronTing13 分钟前
12- Java虚拟线程(Project Loom)深度解析:原理、实战与性能调优
java·后端·面试
顾林海20 分钟前
深度解析LinkedHashSet工作原理
android·java·面试
创码小奇客24 分钟前
Java 对象变形记:BeanUtils 与 MapStruct 的高阶魔法实战
java·spring boot·trae
豆浆Whisky36 分钟前
深入剖析Go Channel:从底层原理到高阶避坑指南|Go语言进阶(5)
后端·go
申城异乡人36 分钟前
Spring RestTemplate使用方法总结
java
写bug写bug40 分钟前
Lua语言教程:从基础到进阶
后端·lua
吾日三省吾码42 分钟前
微服务入门:Spring Boot 初学者指南
spring boot·微服务·架构