1. 程式人生 > 程式設計 >Java sm3加密演算法的實現

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 [email protected]
 */
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,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,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加密演算法的資料請關注我們其它相關文章!