java sm3國密算法加密、驗證工具類
- 說明
-
- maven依賴
- 完整代碼
- 測試
說明
由于本人并不專于算法和密碼學,是以如果發現工具類存在問題或者可優化地方,歡迎評論處提出。
maven依賴
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
完整代碼
package com.example.pass.common.utils;
import org.bouncycastle.crypto.digests.SM3Digest;
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;
/**
* @description:
* @author: dsy
* @date: 2021/2/25 14:39
*/
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* sm3算法加密
*
* @param paramStr 待加密字元串
* @return 傳回加密後,固定長度=32的16進制字元串
* @explain
*/
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數組
*
* @param srcData
* @return
* @explain 生成對應的hash值
*/
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;
}
/**
* 判斷源資料與加密資料是否一緻
*
* @param srcStr 原字元串
* @param sm3HexString 16進制字元串
* @return 校驗結果
* @explain 通過驗證原數組和生成的hash數組是否為同一數組,驗證2者是否為同一資料
*/
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;
}