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加密算法的实现相关推荐

  1. 【密码学】Java课设-文件加密系统(适用于任何文件)

    Java实现文件加密解密 前言 一.密码学入门 1.对称加密 2.非对称加密 二.程序代码 1.welcome类(欢迎界面) 2.Log类(登录界面) 3.Register类(注册界面) 4.Inde ...

  2. Java实现批量文件加密

    一.题目要求: 用Java实现一个文件批量加密解密工具,实现以下功能: 1. 要有图形界面. 2. 能够通过界面设置一个目录,软件对该目录下的所有文件进行加密或解密(使用对称或非对称加密算法). 加密 ...

  3. 基于JAVA的SM4文件加密解密,可以直接使用

    @[JAVA]SM4文件加密以及解密 SM4文件加密 本加密只需要填写一个 key就可以了,需要导入两个包,一个是bcprov-jdk15on-1.59.jar 另一个是hutool-all-4.6. ...

  4. java简单的文件加密

    文件加密是建立在文件复制的基础之上,说白了就是将一个文件复制过去,期间加上一些干扰信息,致使文件发生改变,来达到文件加密的效果. 文件解密是根据文件相应的加密,来进行解密. 本次加密是比较简层次的加密 ...

  5. [网络工具] 个人密盘(Z盘)官网免费版 文件加密软件 加密文件夹

    更新时间:2015-07-05 软件大小:4.19MB 界面语言:简体中文 授权方式:免费版 运行环境:WinXP/Win7/Win8/win10 个人密盘(z盘)v2015采用虚拟盘文件加密技术,利 ...

  6. 用poi-3.6-20091214.jar 实现java给excel资料加密

    用poi-3.6-20091214.jar 实现java给excel文件加密 我用了网上的很多方法,但是都没有成功! HSSFWorkbook wb = new HSSFWorkbook(new Fi ...

  7. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  8. Java文件操作大全(包括文件加密,String加密)

    1.创建文件夹 //import java.io.*; File myFolderPath = new File(%%1); try { if (!myFolderPath.exists()) myF ...

  9. JAVA文件复制和文件加密存储

    前言 提示:本篇文章主要讲解一下Java如何复制文件,以及Java如何加密文件 1.文件复制 直接给出实例代码 代码如下(示例): package file;import java.io.*;publ ...

最新文章

  1. MATLAB简易验证码识别程序介绍
  2. AlertDialog.Builder 显示为白色 蓝色字
  3. css实现多行文字溢出隐藏——前端小问题不定时更新
  4. 浅谈Java网络编程之Socket (2)
  5. Eclipse单行和多行注释快捷键以及撤销注释
  6. 为Editplus安装smali代码语法高亮插件
  7. android bochs,通过 Bochs 让高性能的 Android 手机流畅运行 Windows 虚拟机
  8. LTE网络架构简化了
  9. java公司薪酬管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  10. HTML常用标签总结 [建议收藏]
  11. 南京工程学院计算机博士,南京工程学院高层次人才引进工作实施办法(修订)...
  12. Linux系统打印机打印乱码,Linux输入中文乱码问题(亲测有效)
  13. Hadoop 之Mong DB 之CentOS 6 使用 yum 安装MongoDB及服务器端配置
  14. 云队友丨马云的摆渡人
  15. python4.30每周一练
  16. 虚拟办公室,产业创新与转型升级
  17. 积分制管理系统:添加成员
  18. 基于NI myRIO 的智能家居设计
  19. BIMServer系列——1.BIMServer安装
  20. 聚合搜索引擎查询结果的开源项目gosearch

热门文章

  1. linux内存重映射的概念及对内核虚拟地址的重映射方法分析
  2. 歌谣学前端之React中虚拟dom
  3. 《在线问卷调查系统》交流基地~
  4. python投票系统_python实时投票系统的课设
  5. 电路图纸怎么看懂的最快
  6. 中国移动M5310 nbiot开发板连接onenet平台全过程
  7. 环境类sci期刊排名一区_SCI计算机学术期刊排名(收藏对你有用)
  8. 中科院计算机技术研究所石晶林,专家人才库数据----中国科学院计算技术研究所...
  9. Jupyter Notebook 添加代码自动补全功能
  10. CRO 管理系统(附源码)