Java sm3加密算法的实现

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加密算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java实现的Base64加密算法示例

    本文实例讲述了Java实现的Base64加密算法.分享给大家供大家参考,具体如下: 一 算法实现 1.JDK 2.Commonc Codec 3.Bouncy Castle 二 代码 package com.imooc.security.base64; import java.io.IOException; import org.apache.commons.codec.binary.Base64; import sun.misc.BASE64Decoder; import sun.misc.B

  • JAVA对称加密算法PBE定义与用法实例分析

    本文实例讲述了JAVA对称加密算法PBE定义与用法.分享给大家供大家参考,具体如下: 一 AES.DES和3DES在使用上比较一致 二 PBE算法优点 三 PBE介绍 1.PBE:Password Based Encryption 基于口令加密.通过加Salt来增强安全性. 2.对已有算法的包装 3.JDK和BC的实现 4.通过加Salt来增强安全性 四 常见算法 五代码实现 package com.imooc.security.pbe; import java.security.Key; im

  • Java对称加密算法DES实例详解

    本文实例讲述了Java对称加密算法DES.分享给大家供大家参考,具体如下: 一 DES算法概述 1.介绍 DES:Data Encryption Standard 数据加密标准. 2.DES算法参数 二 DES算法Java实现 package com.imooc.security.des; import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto

  • java 对称加密算法实现详解

    前言 对于信息的加密方式多种多样,之前为大家介绍了一种自己设计的加密方式,有兴趣的朋友可以欣赏一下,欢迎给予指点.今天为大家介绍一下对称加密方式,所谓对称加密指的是加密和解密方式呈对称格式,即解密是加密的逆过程,下面我们就看一下:DES.3DES.AES.PBE这四种方式,他们的加密强度依次递增.好吧闲话少说,上代码: 首先我们先看一下DES: package cn.edu.hpu.des; import java.security.Key; import javax.crypto.Cipher

  • java实现微信小程序加密数据解密算法

    一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让广大的Java开发人员蛋疼. 微信小程序提供的加密数据解密算法链接 我们下载的算法示例如下: 木有Java!! 木有Java!! 木有Java!! 那么如何解决这个问题,我们一起来实现Java版本的微信小程序加密数据解密算法. 二.实现Java版本的微信小程序加密数据解密算法 1.创建项目 这里,我们创建一个Maven工程,具体创建步骤略.

  • Java实现的对称加密算法AES定义与用法详解

    本文实例讲述了Java实现的对称加密算法AES定义与用法.分享给大家供大家参考,具体如下: 一 简介 1.AES是目前使用最多的对称加密算法. 2.AES的优势之一是至今尚未被破解. 3.AES通常用于移动通信系统加密以及基于SSH协议(SSH Client.SecrueCRT)的软件. 二 特点 1.高级的 2.DES替代者 三 AES的参数说明 四 代码实现 package com.imooc.security.aes; import java.security.Key; import ja

  • java 非对称加密算法RSA实现详解

    现在就为大家介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单. 初始化密钥: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.g

  • java实现AES可逆加密算法

    本文实例为大家分享了java实现AES可逆加密算法的具体代码,供大家参考,具体内容如下 package com.hdu.encode; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES

  • java实现可逆加密算法

    很多加密包都提供复杂的加密算法,比如MD5,这些算法有的是不可逆的. 有时候我们需要可逆算法,将敏感数据加密后放在数据库或配置文件中,在需要时再再还原. 这里介绍一种非常简单的java实现可逆加密算法. 算法使用一个预定义的种子(seed)来对加密内容进行异或运行,解密只用再进行一次异或运算就还原了. 代码如下: seed任意写都可以. 代码: package cn.exam.signup.service.pay.util; import java.math.BigInteger; import

  • java 非对称加密算法DH实现详解

    非对称加密算法是相对于对称加密算法来说的,对于对称加密算法请查阅之前的总结,今天为大家介绍一下DH算法,DH是一种密钥交换算法,接收方根据发送方加密时的密钥,生成接收方解密密钥.下面就一起来学习一下吧: 初始化发送方密钥: KeyPairGenerator sendKeyPairGenerator = KeyPairGenerator.getInstance("DH"); sendKeyPairGenerator.initialize(512); KeyPair sendKeyPair

  • Java加密算法RSA代码实例

    这篇文章主要介绍了Java加密算法RSA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java

随机推荐