java hutool 国密2 国密4 加密解密 生成密钥

本文介绍了如何在Java中使用Hutool库进行SM2和SM4加密,包括SM2密钥对生成、私钥解密/签名、公钥加密/验签以及SM4的加密/解密操作,展示了加密和安全功能的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SM4;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;

public class SMUtils {

    private static final String SM4Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    /**
     * SM2 生成密钥 16进制
     *
     * @return
     */
    public static SM2KeyPair generateSM2Key() {
        SM2 sm2 = new SM2();
        String privateKey = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
        String publicKey = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
        return new SM2KeyPair(publicKey, privateKey);
    }

    public static class SM2KeyPair {
        private String publicKey;
        private String privateKey;

        SM2KeyPair(String publicKey, String privateKey) {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }

        public String getPublicKey() {
            return publicKey;
        }

        public void setPublicKey(String publicKey) {
            this.publicKey = publicKey;
        }

        public String getPrivateKey() {
            return privateKey;
        }

        public void setPrivateKey(String privateKey) {
            this.privateKey = privateKey;
        }
    }

    /**
     * SM2 私钥解密
     *
     * @param privateKey
     * @param encryptedText
     * @return
     */
    public static String sm2Decode(String privateKey, String encryptedText) {
        SM2 sm2 = SmUtil.sm2(privateKey, null);
        byte[] decryptBytes = sm2.decrypt(encryptedText, KeyType.PrivateKey);
        return new String(decryptBytes);
    }

    /**
     * SM2 私钥签名
     *
     * @param privateKey
     * @param text
     * @return
     */
    public static String sm2PrivateSign(String privateKey, String text) {
        SM2 sm2 = SmUtil.sm2(privateKey, null);
        return sm2.signHex(HexUtil.encodeHexStr(text));
    }

    /**
     * SM2 公钥验签
     *
     * @param publicKey
     * @param signStr
     * @param text
     * @return
     */
    public static boolean sm2PublicVerify(String publicKey, String signStr, String text) {
        SM2 sm2 = SmUtil.sm2(null, publicKey);
        return sm2.verifyHex(HexUtil.encodeHexStr(text), signStr);

    }

    /**
     * SM2 公钥加密
     *
     * @param publicKey
     * @param text
     * @return
     */
    public static String sm2Encode(String publicKey, String text) {
        SM2 sm2 = SmUtil.sm2(null, publicKey);
        byte[] encryptBytes = sm2.encrypt(text.getBytes(), KeyType.PublicKey);
        return HexUtil.encodeHexStr(encryptBytes);
    }

    /**
     * SM4 解密
     *
     * @param encryptedText
     * @return
     */
    public static String sm4Decode(String encryptedText) {
        if (StringUtils.isEmpty(encryptedText)) {
            return "";
        }
        SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(SM4Key));
        return new String(sm4.decrypt(encryptedText));
    }

    /**
     * SM4 加密
     *
     * @param text
     * @return
     */
    public static String sm4Encode(String text) {
        SM4 sm4 = SmUtil.sm4(HexUtil.decodeHex(SM4Key));
        return HexUtil.encodeHexStr(sm4.encrypt(text));
    }

    /**
     * SM4 生成密钥
     */
    public void generateSM4Key() {
        byte[] sm4Key = SecureUtil.generateKey("SM4").getEncoded();
        System.out.println("SM4密钥:" + HexUtil.encodeHexStr(sm4Key));
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值