文档章节

java sm3加密算法

o
 osc_odyg6b92
发布于 2018/07/13 09:38
字数 545
阅读 104
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

 

java sm3加密算法实现

CreationTime--2018年7月13日09点28分

Author:Marydon

1.准备工作  

  所需jar包:

  bcprov-jdk15on-1.59.jar

  commons-lang3-3.1.jar

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

}

 

 
o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
XLSX读写库--EPPlus

EPPlus 是使用Open Office XML格式(xlsx)读写Excel 2007 / 2010文件的.net开发库。 EPPlus 支持: 单元格范围 单元格样式(Border, Color, Fill, Font, Number, Alignments) Charts 图片 形状...

匿名
2013/02/01
1W
2
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
密码管理程序--pwgrep

为了管理我的密码,我写了一个小的 bash/awk 脚本用来管理一个密码数据库并使用 GnuPG 进行加密。使用 pwgrep 的好处是: 密码加密 密码版本化,不用担心丢失老密码 Since a versioning sys...

匿名
2013/03/11
1.3K
0
Password Manager Daemon

pwmd(Password Manager Daemon) 通过 Unix domain socket 提供服务,数据存储在加密的 XML 文件中,客户端必须提供密钥才能修改。支持多线程,可同时允许多个客户端同时连接。 特性 通过 ...

匿名
2013/03/12
429
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL 语句大全

点击上方“掌上编程”,选择“置顶或者星标” 优质文章第一时间送达! 一、基础 「1、说明:创建数据库」 CREATE DATABASE database-name    「2、说明:删除数据库」 drop database ...

GeneralMa
昨天
0
0
山东创睦网络科技有限公司:使用Python爬取全球新冠肺炎疫情数据

使用Python爬取全球新冠肺炎疫情数据 导入所需库包 获取实时数据的url 正式编写程序 查看输出结果 导入所需库包 在获取数据之前,我们需要先安装好所需的包requests和pandas: 1.如果是使用p...

osc_qv1fwke0
刚刚
0
0
如何1年获得别人3年的工作经验(深度好文)

最近有同学问我,为什么你的工作年限不长,技术却这么厉害,我笑了笑,啥也没说。 我不是不想回答,是不知道怎么回答。在他们的定位可能就是,每方面都懂一点,遇到问题能够快速解决,就是比...

zhang_rick
今天
0
0
新基建带动行业

什么是“新基建”? 什么是“新基建”? 根据央视发布的信息来看,其涵盖了5G基站建设、新能源汽车充电桩、大数据中心、人工智能、工业互联网,特高压,城际以及城轨交通,涉及了七大领域和相...

osc_anefoz50
1分钟前
0
0
怕入错行?这群技术人写了本“择业指南”

计算机专业好找工作吗?哪些方向是当前的主流和热门方向呢? 计算机专业的你是不是还在为职业发展纠结犹豫呢? 刚经历完高考选专业的你是不是还在迷茫徘徊呢? 那么福利来啦! 《软件技术职业...

阿里云云栖号
1分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部