java采用sm文件加密sm_Java sm3加密算法的实现
1.准备工作
所需jar包:
bcprov-jdk15on-1.59.jar
commons-lang3-3.1.jar
对应的maven依赖
org.bouncycastle
bcprov-jdk15on
1.66
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
/**
* sm3加密算法工具类
* @explain 加密与加密结果验证(不可逆算法)
* @author Marydon
* @creationTime 2018年7月5日上午10:01:24
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
}
2.SM3加密
方式一:不提供密钥
/**
* sm3算法加密
* @explain
* @param paramStr
* 待加密字符串
* @return 返回加密后,固定长度=32的16进制字符串
*/
public static String encrypt(String paramStr){
// 将返回的hash值转换成16进制字符串
String resultHexString = "";
try {
// 将字符串转换成byte数组
byte[] srcData = paramStr.getBytes(ENCODING);
// 调用hash()
byte[] resultHash = hash(srcData);
// 将返回的hash值转换成16进制字符串
resultHexString = ByteUtils.toHexString(resultHash);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return resultHexString;
}
/**
* 返回长度=32的byte数组
* @explain 生成对应的hash值
* @param srcData
* @return
*/
public static byte[] hash(byte[] srcData) {
SM3Digest digest = new SM3Digest();
digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
方式二:自定义密钥
/**
* 通过密钥进行加密
* @explain 指定密钥进行加密
* @param key
* 密钥
* @param srcData
* 被加密的byte数组
* @return
*/
public static byte[] hmac(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest digest = new SM3Digest();
HMac mac = new HMac(digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] result = new byte[mac.getMacSize()];
mac.doFinal(result, 0);
return result;
}
3.加密数据校验
/**
* 判断源数据与加密数据是否一致
* @explain 通过验证原数组和生成的hash数组是否为同一数组,验证2者是否为同一数据
* @param srcStr
* 原字符串
* @param sm3HexString
* 16进制字符串
* @return 校验结果
*/
public static boolean verify(String srcStr, String sm3HexString) {
boolean flag = false;
try {
byte[] srcData = srcStr.getBytes(ENCODING);
byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
byte[] newHash = hash(srcData);
if (Arrays.equals(newHash, sm3Hash))
flag = true;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return flag;
}
4.测试
public static void main(String[] args) {
// 测试二:json
String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}";
String hex = Sm3Utils.encrypt(json);
System.out.println(hex);// 0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c
// 验证加密后的16进制字符串与加密前的字符串是否相同
boolean flag = Sm3Utils.verify(json, hex);
System.out.println(flag);// true
}
以上就是Java sm3加密算法的实现的详细内容,更多关于Java sm3加密算法的资料请关注脚本之家其它相关文章!
java采用sm文件加密sm_Java sm3加密算法的实现相关推荐
- 【密码学】Java课设-文件加密系统(适用于任何文件)
Java实现文件加密解密 前言 一.密码学入门 1.对称加密 2.非对称加密 二.程序代码 1.welcome类(欢迎界面) 2.Log类(登录界面) 3.Register类(注册界面) 4.Inde ...
- Java实现批量文件加密
一.题目要求: 用Java实现一个文件批量加密解密工具,实现以下功能: 1. 要有图形界面. 2. 能够通过界面设置一个目录,软件对该目录下的所有文件进行加密或解密(使用对称或非对称加密算法). 加密 ...
- 基于JAVA的SM4文件加密解密,可以直接使用
@[JAVA]SM4文件加密以及解密 SM4文件加密 本加密只需要填写一个 key就可以了,需要导入两个包,一个是bcprov-jdk15on-1.59.jar 另一个是hutool-all-4.6. ...
- java简单的文件加密
文件加密是建立在文件复制的基础之上,说白了就是将一个文件复制过去,期间加上一些干扰信息,致使文件发生改变,来达到文件加密的效果. 文件解密是根据文件相应的加密,来进行解密. 本次加密是比较简层次的加密 ...
- [网络工具] 个人密盘(Z盘)官网免费版 文件加密软件 加密文件夹
更新时间:2015-07-05 软件大小:4.19MB 界面语言:简体中文 授权方式:免费版 运行环境:WinXP/Win7/Win8/win10 个人密盘(z盘)v2015采用虚拟盘文件加密技术,利 ...
- 用poi-3.6-20091214.jar 实现java给excel资料加密
用poi-3.6-20091214.jar 实现java给excel文件加密 我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fi ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- Java文件操作大全(包括文件加密,String加密)
1.创建文件夹 //import java.io.*; File myFolderPath = new File(%%1); try { if (!myFolderPath.exists()) myF ...
- JAVA文件复制和文件加密存储
前言 提示:本篇文章主要讲解一下Java如何复制文件,以及Java如何加密文件 1.文件复制 直接给出实例代码 代码如下(示例): package file;import java.io.*;publ ...
最新文章
- MATLAB简易验证码识别程序介绍
- AlertDialog.Builder 显示为白色 蓝色字
- css实现多行文字溢出隐藏——前端小问题不定时更新
- 浅谈Java网络编程之Socket (2)
- Eclipse单行和多行注释快捷键以及撤销注释
- 为Editplus安装smali代码语法高亮插件
- android bochs,通过 Bochs 让高性能的 Android 手机流畅运行 Windows 虚拟机
- LTE网络架构简化了
- java公司薪酬管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- HTML常用标签总结 [建议收藏]
- 南京工程学院计算机博士,南京工程学院高层次人才引进工作实施办法(修订)...
- Linux系统打印机打印乱码,Linux输入中文乱码问题(亲测有效)
- Hadoop 之Mong DB 之CentOS 6 使用 yum 安装MongoDB及服务器端配置
- 云队友丨马云的摆渡人
- python4.30每周一练
- 虚拟办公室,产业创新与转型升级
- 积分制管理系统:添加成员
- 基于NI myRIO 的智能家居设计
- BIMServer系列——1.BIMServer安装
- 聚合搜索引擎查询结果的开源项目gosearch