Java实现常用加密算法SM3的方式及测试代码

 更新时间:2024年10月14日 10:35:02   作者:祖安文科状元丶  
这篇文章介绍了SM3算法在Java中的实现方式,SM3算法是一种密码散列函数标准,主要用于商用密码应用中的数字签名和验证、消息认证码生成和验证、随机数生成等,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。本篇主要介绍SM3算法在Java(JDK1.8)中如何实现,借助Java标准库或第三方库,非原始实现,较为基础。

一、SM3是什么?

SM3算法是一种密码散列函数标准,‌由国家密码管理局发布,‌其安全性和SHA-256相当。‌ 这种算法主要用于商用密码应用中的数字签名和验证、‌消息认证码生成和验证、‌随机数生成等。‌SM3算法的执行过程包括消息填充、‌消息分组、‌消息扩展、‌迭代压缩和输出结果。‌它是一种不需要密钥的Hash算法,‌加密过程后无法还原为明文,‌即不可逆。‌SM3算法的执行过程涉及将输入的消息分成512位的分组,‌并对每个分组进行填充、‌分组、‌扩展、‌迭代压缩等操作,‌最后输出256位的摘要值。‌此外,‌SM3算法使用8个字寄存器来存储每一轮迭代压缩的过程数据及结果,‌这8个寄存器的初始值在算法开始执行前被定义。‌

SM3算法的用途广泛,‌包括但不限于生成消息以及文件的数字签名,‌以保证信息的完整性和不可否认性。‌这种算法的特性使其适用于需要高安全性的应用场景,‌如数字签名和验证,‌以确保信息在传输或存储过程中的完整性和真实性。

二、实现方式

Java标准库并不包含SM3算法,一般借助BC库自行实现,也可以使用hutool(正式项目中不推荐)。

1、自行实现

1)导入Maven依赖,代码如下(示例):

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

2)代码如下(示例):

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class EncryptUtils {
    static {
        // 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现)
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * SM3,国家商用密码(Shang Mi3)也称国密3,是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。
     * <p>
     * 输入:待加密的字符串
     * 输出:256位(16字节)或64个16进制字符(常用)
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sm3(String plainString) {
        String cipherString = null;
        try {
            // 创建SM3Digest对象
            SM3Digest sm3Digest = new SM3Digest();
            // 初始化SM3计算
            sm3Digest.update(plainString.getBytes(StandardCharsets.UTF_8), 0, plainString.length());
            // 创建输出缓冲区
            byte[] cipherBytes = new byte[sm3Digest.getDigestSize()];
            // 计算SM3摘要
            sm3Digest.doFinal(cipherBytes, 0);
            // 输出16进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : cipherBytes) {
                sb.append(String.format("%02x", b));
            }
            cipherString = sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
}

2、hutool开源组件

1)导入依赖,代码如下(示例):

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.12</version>
</dependency>

2)代码如下(示例):

import cn.hutool.crypto.SmUtil;

public class EncryptUtils {
    static {
        // 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现)
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * SM3,国家商用密码(Shang Mi3)也称国密3,是中华人民共和国政府采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。
     * <p>
     * 输入:待加密的字符串
     * 输出:256位(16字节)或64个16进制字符(常用)
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sm3(String plainString) {
        return SmUtil.sm3(plainString);
    }
}

三、测试

我这里随机找了一个在线SM3加密的某网站做对比,如下:

代码如下(示例):

public class EncryptUtils {
    ...
 
    public static void main(String[] args) {
        String plainString = "hello world, hello java!";
        String sm3 = sm3(plainString);
        System.out.println("加密前: " + plainString);
        System.out.println("加密后: " + sm3);
    }
}

代码运行截图:

某网站截图:

总结

到此这篇关于Java实现常用加密算法SM3的方式及测试代码的文章就介绍到这了,更多相关Java常用加密算法SM3内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot集成定时器和多线程异步处理操作

    Springboot集成定时器和多线程异步处理操作

    这篇文章主要介绍了Springboot集成定时器和多线程异步处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 详解Springboot Oauth2 Server搭建Oauth2认证服务

    详解Springboot Oauth2 Server搭建Oauth2认证服务

    这篇文章主要介绍了Springboot Oauth2 Server 搭建Oauth2认证服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • JavaEE初阶教程之UDP协议和TCP协议

    JavaEE初阶教程之UDP协议和TCP协议

    TCP是一种面向连接的、可靠的、面向字节流,双全工的传输层通信协议,UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务,这篇文章主要介绍了JavaEE初阶教程之UDP协议和TCP协议的相关资料,需要的朋友可以参考下
    2025-12-12
  • Java基于堆结构实现优先队列功能示例

    Java基于堆结构实现优先队列功能示例

    这篇文章主要介绍了Java基于堆结构实现优先队列功能,结合实例形式分析了java优先队列的简单定义与使用方法,需要的朋友可以参考下
    2017-11-11
  • Java实现字符串解析为日期时间的方法示例

    Java实现字符串解析为日期时间的方法示例

    这篇文章主要介绍了Java实现字符串解析为日期时间的方法,结合具体实例形式分析了java日期时间字符串的解析操作相关实现技巧,需要的朋友可以参考下
    2017-04-04
  • 一篇文章带你入门java方法

    一篇文章带你入门java方法

    这篇文章主要介绍了java基础之方法详解,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-08-08
  • SpringBoot深入分析webmvc和webflux的区别

    SpringBoot深入分析webmvc和webflux的区别

    这篇文章主要介绍了SpringBoot深入分析webmvc和webflux的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • 详解SpringBoot应用服务启动与安全终止

    详解SpringBoot应用服务启动与安全终止

    这篇文章主要介绍了SpringBoot应用服务启动与安全终止,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码

    SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码

    本文主要介绍了SpringBoot+Kotlin中使用GRPC实现服务通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 老生常谈java中cookie的使用

    老生常谈java中cookie的使用

    下面小编就为大家带来一篇老生常谈java中cookie的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论