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!
相关推荐
ladymorgana17 分钟前
【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API
spring boot·elk·grafana
一只叫煤球的猫1 小时前
【🤣离谱整活】我写了一篇程序员掉进 Java 异世界的短篇小说
java·后端·程序员
斐波娜娜1 小时前
Maven详解
java·开发语言·maven
Bug退退退1231 小时前
RabbitMQ 高级特性之事务
java·分布式·spring·rabbitmq
程序员秘密基地1 小时前
基于html,css,vue,vscode,idea,,java,springboot,mysql数据库,在线旅游,景点管理系统
java·spring boot·mysql·spring·web3
皮皮林5512 小时前
自从用了CheckStyle插件,代码写的越来越规范了....
java
小码氓2 小时前
Java填充Word模板
java·开发语言·spring·word
会飞的天明2 小时前
Java 导出word 实现饼状图导出--可编辑数据
java·word
Muxiyale2 小时前
使用spring发送邮件,部署ECS服务器
java·服务器·spring
你的人类朋友2 小时前
🫏光速入门cURL
前端·后端·程序员