基于hutool 封装国密sm2,sm4 加解密算法

本文档介绍了如何利用Hutool库进行国密SM2和SM4加解密算法的封装,包括添加依赖和具体编码实现步骤。
摘要由CSDN通过智能技术生成

基于hutool 封装国密sm2,sm4 加解密算法

1. 加入依赖包
    <dependency>
    	<groupId>cn.hutool</groupId>
    	<artifactId>hutool-all</artifactId>
    	<version>5.7.22</version>
	</dependency>
   <!-- 国密sm4的时候需要加入此依赖-->
    <dependency>
		<groupId>org.bouncycastle</groupId>
		<artifactId>bcprov-jdk15on</artifactId>
		<version>1.70</version>
	</dependency> 
		
2. 编码
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SM4;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: 
 * @CreateTime: 
 * @Description: 国密加密,解密算法 支持 sm2, sm4;
 * 基于签名算法的SM3,个人感觉没有必要封装直接用 SmUtil.sm3("aaaaa"); 即可。
 */
public class StateSecretUtil {
   

    public static Map concurrentHashMap 
以下是Java代码实现SM2算法加密: ```java import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.generators.ECKeyPairGenerator; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECKeyGenerationParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PublicKeyFactory; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.util.encoders.Hex; import java.security.SecureRandom; public class SM2Util { // 国密推荐的椭圆曲线参数 private static final String SM2_ECC_PARAM = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF"; private static final String SM2_ECC_A = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"; private static final String SM2_ECC_B = "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"; private static final String SM2_ECC_GX = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE171F6241CACD9A2ED"; private static final String SM2_ECC_GY = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"; private static final String SM2_ECC_N = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"; /** * 生成SM2公私钥对 * * @return 公私钥对 */ public static SM2KeyPair generateKeyPair() { ECDomainParameters domainParameters = new ECDomainParameters( SM2Util.getCurve(), SM2Util.getGPoint(), SM2Util.getN()); ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); ECKeyGenerationParameters keyGenerationParameters = new ECKeyGenerationParameters(domainParameters, new SecureRandom()); keyPairGenerator.init(keyGenerationParameters); AsymmetricCipherKeyPair keyPair = keyPairGenerator.generateKeyPair(); ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters) keyPair.getPrivate(); ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters) keyPair.getPublic(); return new SM2KeyPair(Hex.toHexString(privateKeyParameters.getD().toByteArray()), Hex.toHexString(publicKeyParameters.getQ().getEncoded(true))); } /** * 加密数据 * * @param publicKey 公钥 * @param data 待加密数据 * @return 加密结果 */ public static String encrypt(String publicKey, String data) { ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters) PublicKeyFactory.createKey(Hex.decode(publicKey)); SM2Engine engine = new SM2Engine(); engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom())); byte[] input = data.getBytes(); byte[] output = engine.processBlock(input, 0, input.length); return Hex.toHexString(output); } /** * 解密数据 * * @param privateKey 私钥 * @param data 待解密数据 * @return 解密结果 */ public static String decrypt(String privateKey, String data) { ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters) PrivateKeyFactory.createKey(Hex.decode(privateKey)); SM2Engine engine = new SM2Engine(); engine.init(false, privateKeyParameters); byte[] input = Hex.decode(data); byte[] output = engine.processBlock(input, 0, input.length); return new String(output); } /** * 获取SM2曲线参数 */ public static ECDomainParameters getCurve() { return new ECDomainParameters( SM2Util.getCurve(), SM2Util.getGPoint(), SM2Util.getN()); } /** * 获取SM2曲线 */ private static org.bouncycastle.math.ec.ECCurve getCurve() { return new org.bouncycastle.math.ec.ECCurve.Fp( Hex.decode(SM2_ECC_PARAM), Hex.decode(SM2_ECC_A), Hex.decode(SM2_ECC_B)); } /** * 获取SM2曲线生成点G */ private static ECPoint getGPoint() { org.bouncycastle.math.ec.ECCurve curve = SM2Util.getCurve(); return curve.createPoint( new java.math.BigInteger(Hex.toHexString(SM2Util.getGx()), 16), new java.math.BigInteger(Hex.toHexString(SM2Util.getGy()), 16)); } /** * 获取SM2曲线参数N */ private static java.math.BigInteger getN() { return new java.math.BigInteger(Hex.toHexString(SM2_ECC_N), 16); } /** * 获取SM2曲线生成点Gx */ private static byte[] getGx() { return Hex.decode(SM2_ECC_GX); } /** * 获取SM2曲线生成点Gy */ private static byte[] getGy() { return Hex.decode(SM2_ECC_GY); } } ``` 其中,`SM2KeyPair`为公私钥对的封装类,`generateKeyPair()`方法用于生成SM2公私钥对;`encrypt(String publicKey, String data)`方法用于加密数据,其中`publicKey`为公钥,`data`为待加密数据;`decrypt(String privateKey, String data)`方法用于解密数据,其中`privateKey`为私钥,`data`为待解密数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潇凝子潇

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值