Java进行国密SM2加密和解密实现

本文详细介绍了如何使用Java进行国密SM2加密和解密操作,包括SM2算法概述、私钥公钥生成、hutool库的问题以及依赖库的引入。通过示例代码展示了SM2加解密的实现,并提供了单元测试确保功能正确性。
摘要由CSDN通过智能技术生成

前言

本文讲解java进行国密sm2加密和解密实现。

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。

SM2介绍

SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
旧标准的加密排序C1C2C3 新标准 C1C3C2,C1为65字节第1字节为压缩标识,这里固定为0x04,后面64字节为xy分量各32字节。C3为32字节。C2长度与原文一致。

如何生成私钥和公钥

参考博主另一篇文章:《国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名》

关于hutool库生成的私钥有问题

使用hutool库中的sm2生成的私钥公钥是有问题的,无法被其他国密sm2所认可。

依赖

在 JDK 1.5 中实现 SM2 加密需要进行以下步骤: 1. 下载和引入 BC 依赖库 BC(Bouncy Castle)是一个 Java 实现加密库,支持多种加密算法,包括 SM2。我们需要下载 BouncyCastle 的 jar 包,并引入项目中。 2. 生成 SM2 密钥对 使用 Bouncy Castle 提供的 SM2 密钥对生成器,生成 SM2 密钥对。示例代码如下: ```java Security.addProvider(new BouncyCastleProvider()); KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC"); kpg.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = kpg.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); ``` 3. 进行 SM2 加密 使用 Bouncy Castle 提供的 SM2 加密算法,对明文进行加密。示例代码如下: ```java byte[] plainText = "Hello, SM2!".getBytes(); Cipher cipher = Cipher.getInstance("SM2", "BC"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] cipherText = cipher.doFinal(plainText); ``` 4. 进行 SM2 解密 使用 Bouncy Castle 提供的 SM2 解密算法,对密文进行解密。示例代码如下: ```java cipher = Cipher.getInstance("SM2", "BC"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decrypted = cipher.doFinal(cipherText); String decryptedStr = new String(decrypted); System.out.println(decryptedStr); ``` 完整代码示例: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.spec.ECGenParameterSpec; import javax.crypto.Cipher; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class SM2Demo { public static void main(String[] args) throws Exception { // 添加 BC 依赖库 Security.addProvider(new BouncyCastleProvider()); // 生成 SM2 密钥对 KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC"); kpg.initialize(new ECGenParameterSpec("sm2p256v1")); KeyPair keyPair = kpg.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 加密 byte[] plainText = "Hello, SM2!".getBytes(); Cipher cipher = Cipher.getInstance("SM2", "BC"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] cipherText = cipher.doFinal(plainText); System.out.println("Cipher text: " + new String(cipherText)); // 解密 cipher = Cipher.getInstance("SM2", "BC"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decrypted = cipher.doFinal(cipherText); String decryptedStr = new String(decrypted); System.out.println("Decrypted text: " + decryptedStr); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eguid_1

感谢支持eguid原创技术文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值