当前位置:首页 » 《资源分享》 » 正文

Java实现常用加密算法 —— SM3

28 人参与  2024年09月15日 17:21  分类 : 《资源分享》  评论

点击全文阅读


系列文章目录

汇总:Java实现常用加密算法汇总(建议收藏)

第一章:Java实现常用加密算法 —— MD5

第二章:Java实现常用加密算法 —— SHA256


文章目录

系列文章目录

前言

一、SM3是什么?

二、实现方式

1、自行实现

2、hutool开源组件

三、测试

总结


前言

       在商用密码体系中,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);    }}

代码运行截图:

某网站截图:


总结

以上就是今天要讲的内容,本文仅仅简单介绍了SM3加密算法在Java中的实现方式,各个加密算法的对比及总结请见本文系列文章汇总篇,水平有限,难免出错,仅供参考,不喜勿喷,感谢!更多内容请百度和ChatGPT!


点击全文阅读


本文链接:http://zhangshiyu.com/post/160472.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1