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!
相关推荐
颜酱38 分钟前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_1 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble1 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟2 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖2 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707533 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.3 小时前
Day06——权限认证-项目集成
java
瑶山3 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy3 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法