Java实现SM3加密和验证的示例代码

 更新时间:2023年12月19日 11:26:36   作者:共饮一杯无  
在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开,本文给大家详细介绍了使用Java实现SM3加密和验证,文中有详细的代码示例供大家参考,需要的朋友可以参考下

需要引入如下坐标依赖:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

自定义密钥加密及校验

加密

	private static final String ENCODING = "UTF-8";
    /**
     * 加密
     *
     * @param src 明文
     * @param key 密钥
     * @return
     * @throws Exception
     */
    public static String encrypt(String src, String key) throws Exception {
        return ByteUtils.toHexString(getEncryptByKey(src, key));
    }


    /**
     * SM3加密方式之: 根据自定义密钥进行加密,返回加密后长度为32位的16进制字符串
     *
     * @param src 源数据
     * @param key 密钥
     * @return
     * @throws Exception
     */
    public static byte[] getEncryptByKey(String src, String key) throws Exception {
        byte[] srcByte = src.getBytes(ENCODING);
        byte[] keyByte = key.getBytes(ENCODING);
        KeyParameter keyParameter = new KeyParameter(keyByte);
        SM3Digest sm3 = new SM3Digest();
        HMac hMac = new HMac(sm3);
        hMac.init(keyParameter);
        hMac.update(srcByte, 0, srcByte.length);
        byte[] result = new byte[hMac.getMacSize()];
        hMac.doFinal(result, 0);
        return result;
    }

校验

    /**
     * 利用源数据+密钥校验与密文是否一致
     *
     * @param src       源数据
     * @param key       密钥
     * @param sm3HexStr 密文
     * @return
     * @throws Exception
     */
    public static boolean verify(String src, String key, String sm3HexStr) throws Exception {
        byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
        byte[] newHashCode = getEncryptByKey(src, key);
        return Arrays.equals(newHashCode, sm3HashCode);
    }

无密钥的加密及校验

加密

    /**
     * SM3加密方式之:不提供密钥的方式 SM3加密,返回加密后长度为64位的16进制字符串
     *
     * @param src 明文
     * @return
     */
    public static String encrypt(String src) {
        return ByteUtils.toHexString(getEncryptBySrcByte(src.getBytes()));
    }

    /**
     * 返回长度为32位的加密后的byte数组
     *
     * @param srcByte
     * @return
     */
    public static byte[] getEncryptBySrcByte(byte[] srcByte) {
        SM3Digest sm3 = new SM3Digest();
        sm3.update(srcByte, 0, srcByte.length);
        byte[] encryptByte = new byte[sm3.getDigestSize()];
        sm3.doFinal(encryptByte, 0);
        return encryptByte;
    }

校验

    /**
     * 校验源数据与加密数据是否一致
     *
     * @param src       源数据
     * @param sm3HexStr 16进制的加密数据
     * @return
     * @throws Exception
     */
    public static boolean verify(String src, String sm3HexStr) throws Exception {
        byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
        byte[] newHashCode = getEncryptBySrcByte(src.getBytes(ENCODING));
        return Arrays.equals(newHashCode, sm3HashCode);
    }

测试验证

public static void main(String[] args) throws Exception {
        String srcStr = "今天天气很晴朗";
        String key = "zjqzjq";
        // ******************************自定义密钥加密及校验*****************************************
        String hexStrByKey = SM3Utils.encrypt(srcStr, key);
        System.out.println("带密钥加密后的密文:" + hexStrByKey);

        System.out.println("明文(带密钥)与密文校验结果:" + SM3Utils.verify(srcStr, key, hexStrByKey));

        // ******************************无密钥的加密及校验******************************************
        String hexStrNoKey = SM3Utils.encrypt(srcStr);
        System.out.println("不带密钥加密后的密文:" + hexStrNoKey);

        System.out.println("明文(不带密钥)与密文校验结果:" + SM3Utils.verify(srcStr, hexStrNoKey));

    }

结果输出如下:

以上就是Java实现SM3加密和验证的示例代码的详细内容,更多关于Java实现SM3加密和验证的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot中@EnableAsync和@Async注解的使用小结

    SpringBoot中@EnableAsync和@Async注解的使用小结

    在SpringBoot中,可以通过@EnableAsync注解来启动异步方法调用的支持,通过@Async注解来标识异步方法,让方法能够在异步线程中执行,本文就来介绍一下,感兴趣的可以了解一下
    2023-11-11
  • Java中的线程死锁解读

    Java中的线程死锁解读

    这篇文章主要介绍了Java中的线程死锁解读,死锁就是指两个或两个以上的线程在抢占资源时,造成相互等待的现象,称为死锁,在没有外力的情况下是会一直等待无法执行下去,需要的朋友可以参考下
    2024-01-01
  • SpringBoot3集成MyBatis详解

    SpringBoot3集成MyBatis详解

    MyBatis是一款开源的持久层框架,它极大地简化了与数据库的交互流程,MyBatis更具灵活性,允许开发者直接使用SQL语句与数据库进行交互,本文将详细介绍在Spring Boot项目中如何集成MyBatis,以实现对数据库的轻松访问和操作,需要的朋友可以参考下
    2023-12-12
  • java BigDecimal类案例详解

    java BigDecimal类案例详解

    这篇文章主要介绍了java BigDecimal类案例详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • java8如何根据某一属性条件快速筛选list中的集合

    java8如何根据某一属性条件快速筛选list中的集合

    这篇文章主要介绍了java8如何根据某一属性条件快速筛选list中的集合,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Sequelize 常用操作详解及实例代码

    Sequelize 常用操作详解及实例代码

    这篇文章主要介绍了Sequelize 常用操作详解及实例代码的相关资料,希望能帮助到大家,需要的朋友可以参考下
    2016-11-11
  • Mybatis Plus 代码生成器的实现

    Mybatis Plus 代码生成器的实现

    这篇文章主要介绍了Mybatis Plus 代码生成器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java使用join方法暂停当前线程

    Java使用join方法暂停当前线程

    这篇文章主要为大家详细介绍了Java使用join方法暂停当前线程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • maven打包失败踩坑的解决方式详解

    maven打包失败踩坑的解决方式详解

    最近因为新项目有很多自定义的jar包,而且占内存很多,就直接拷贝过来,新开了一个maven仓库,用的时候没有问题,但是打包一直编译不通过,下面这篇文章主要给大家介绍了关于maven打包失败踩坑的解决方式,需要的朋友可以参考下
    2023-05-05
  • java 根据坐标截取图片实例代码

    java 根据坐标截取图片实例代码

    这篇文章主要介绍了java 根据坐标截取图片实例代码的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论