Java sm3加密算法的实现

 更新时间:2020年10月20日 10:42:45   作者:Marydon  
这篇文章主要介绍了Java sm3加密算法的实现,帮助大家更好的利用Java进行加密,感兴趣的朋友可以了解下

1.准备工作

  所需jar包:

  bcprov-jdk15on-1.59.jar
  commons-lang3-3.1.jar

  对应的maven依赖

<!--sm3,sm4加密算法-->
<dependency>
 <groupId>org.bouncycastle</groupId>
 <artifactId>bcprov-jdk15on</artifactId>
 <version>1.66</version>
</dependency> 
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加密算法的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot底层注解超详细介绍

    SpringBoot底层注解超详细介绍

    这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 关于Java中你所不知道的Integer详解

    关于Java中你所不知道的Integer详解

    这篇文章主要给大家介绍了关于Java中你所不知道的一些关于Integer的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Java深入讲解static操作符

    Java深入讲解static操作符

    static关键字基本概念我们可以一句话来概括:方便在没有创建对象的情况下来进行调用。也就是说:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问,让我们来了解一下你可能还不知道情况
    2022-07-07
  • Java并发编程之浅谈ReentrantLock

    Java并发编程之浅谈ReentrantLock

    今天带大家学习Java并发编程的相关知识,文中对Java ReentrantLock作了非常详细的图文示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • BeanPostProcessor在显示调用初始化方法前修改bean详解

    BeanPostProcessor在显示调用初始化方法前修改bean详解

    这篇文章主要介绍了BeanPostProcessor在显示调用初始化方法前修改bean详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Cookie 实现的原理

    Cookie 实现的原理

    我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了
    2021-06-06
  • SpringBoot中默认缓存实现方案的示例代码

    SpringBoot中默认缓存实现方案的示例代码

    这篇文章主要介绍了SpringBoot中默认缓存实现方案,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Netty分布式ByteBuf使用directArena分配缓冲区过程解析

    Netty分布式ByteBuf使用directArena分配缓冲区过程解析

    这篇文章主要介绍了Netty分布式ByteBuf使用directArena分配缓冲区过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 1小时快速上手RabbitMQ(简介及安装过程)

    1小时快速上手RabbitMQ(简介及安装过程)

    RabbitMQ简称MQ全称是Message Queue(消息队列),是在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信,本文给大家讲解了RabbitMQ简介与安装,结合实例代码给大家介绍的非常详细,需要的朋友跟随小编一起看看吧
    2023-01-01
  • Java使用阻塞队列控制线程通信的方法实例详解

    Java使用阻塞队列控制线程通信的方法实例详解

    这篇文章主要介绍了Java使用阻塞队列控制线程通信的方法,结合实例形式详细分析了java使用阻塞队列控制线程通信的相关原理、方法及操作注意事项,需要的朋友可以参考下
    2019-09-09

最新评论