首页 > 基础资料 博客日记
Java实现常用加密算法 —— SM3
2024-10-30 09:00:07基础资料围观82次
系列文章目录
文章目录
前言
在商用密码体系中,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!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: