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!
相关推荐
小蒜学长3 分钟前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
sunshine22 girl27 分钟前
Java学习六 Java常见API-1-Radom随机数
java·开发语言·学习
IT_陈寒43 分钟前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
wangbing11251 小时前
使用jps jstack排查系统问题
java
于指尖飞舞1 小时前
java面试题总结
java·开发语言
打工仔折腾 AI1 小时前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战
ZealSinger2 小时前
LangChain4j用AiServices拼Tool
java·rag·ai智能体·langchain4j
vx_Biye_Design2 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
Sweet锦3 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索