博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java sm3加密算法
阅读量:6300 次
发布时间:2019-06-22

本文共 3137 字,大约阅读时间需要 10 分钟。

 

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}

 

 相关推荐:

 

 
你可能感兴趣的文章
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>
!important 和 * ----hack
查看>>
聊天界面图文混排
查看>>
控件的拖动
查看>>
svn eclipse unable to load default svn client的解决办法
查看>>
Android.mk 文件语法详解
查看>>
QT liunx 工具下载
查看>>
内核源码树
查看>>
AppScan使用
查看>>
Java NIO框架Netty教程(三) 字符串消息收发(转)
查看>>
Ucenter 会员同步登录通讯原理
查看>>
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>