一、简要

  • Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。
  • Hutool 的实现也是基于 BC(Bouncy Castle库)实现的
  • 本文只实现简单功能,若有需要请移步官网

二、POM 文件引用

<!--hutool具包-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.0</version>
    <scope>compile</scope>
</dependency>
<!--Bouncy Castle库-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.69</version>
</dependency>

三、SM2

package com.prison.common.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.junit.Test;

import java.security.KeyPair;

public class HutoolSMUtil {


    @Test
    public void sm2Test() {

        String text = "wangjing";

        //使用随机生成的密钥对加密或解密
        System.out.println("使用随机生成的密钥对加密或解密====开始");
        SM2 sm2 = SmUtil.sm2();
        // 公钥加密
        String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
        System.out.println("公钥加密:" + encryptStr);
        //私钥解密
        String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
        System.out.println("私钥解密:" + decryptStr);
        System.out.println("使用随机生成的密钥对加密或解密====结束");


        //使用自定义密钥对加密或解密
        System.out.println("使用自定义密钥对加密或解密====开始");

        KeyPair pair = SecureUtil.generateKeyPair("SM2");
        byte[] privateKey = pair.getPrivate().getEncoded();
        byte[] publicKey = pair.getPublic().getEncoded();

        SM2 sm22 = SmUtil.sm2(privateKey, publicKey);
        // 公钥加密
        String encryptStr2 = sm22.encryptBcd(text, KeyType.PublicKey);
        System.out.println("公钥加密:" + encryptStr2);
        //私钥解密
        String decryptStr2 = StrUtil.utf8Str(sm22.decryptFromBcd(encryptStr2, KeyType.PrivateKey));
        System.out.println("私钥解密:" + decryptStr2);
        System.out.println("使用自定义密钥对加密或解密====结束");

    }

}

执行效果

使用随机生成的密钥对加密或解密====开始
公钥加密:04357E15B4AF2E2CCA84F309A006E98D1ADB4445743E3CC4DAAD956780152E4E778A09B120691DA8B03734C72729CDED4AA93C5132562E4BD22DAFB0B5199CF84ADD4BCC85D5197BC9137AC2356B2465954A0284A5A7D864324B4FB6457D8919396C687B9C84474C0C
私钥解密:wangjing
使用随机生成的密钥对加密或解密====结束
使用自定义密钥对加密或解密====开始
公钥加密:04F9A38518E92B086C0C424F4065BDF961828D0115273394C1027D6A3D0A228529EBC7293DC95E39B6BB8E4C258269DDF579B26117C83841A4D53E0D19C573A50D65B1B4E222A5A74B8B86958A58B51241522F918D191FFE544CF4A90F1C2BD33656244E22259BF91C
私钥解密:wangjing
使用自定义密钥对加密或解密====结束

四、SM3

package com.prison.common.util;

import cn.hutool.crypto.SmUtil;
import org.junit.Test;

public class HutoolSMUtil {

    @Test
    public void sm3Test() {
        String text = "wangjing";
        String digestHex = SmUtil.sm3(text);
        System.out.println("加密后:" + digestHex);
    }

}

执行效果

加密后:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be

五、SM4

package com.prison.common.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import org.junit.Test;

public class HutoolSMUtil {

    @Test
    public void sm4Test() {
        String text = "wangjing";
        SymmetricCrypto sm4 = SmUtil.sm4();

        String encryptHex = sm4.encryptHex(text);
        System.out.println("加密后:" + encryptHex);
        String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
        System.out.println("解密后:" + decryptStr);
    }

}

执行效果

加密后:ad0fd3d52e1345a8ccdb2fbf005741e6
解密后:wangjing

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

推荐内容
阅读全文
AI总结
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐