Maven依賴
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.56</version> </dependency>
SM3Utils
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; public class SM3Utils { private static final String ENCODING = "UTF-8"; static { Security.addProvider(new BouncyCastleProvider()); } /** * 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; } /** * sm3算法加密 * @explain * @param paramStr 待加密字符串 * @param key 密鑰 * @return 返回加密后,固定長度=32的16進制字符串 */ public static String encryptPlus(String paramStr,String key){ // 將返回的hash值轉換成16進制字符串 String resultHexString = ""; try { // 將字符串轉換成byte數組 byte[] srcData = paramStr.getBytes(ENCODING); // 調用hash() byte[] resultHash = hmac(srcData,key.getBytes(ENCODING)); // 將返回的hash值轉換成16進制字符串 resultHexString = ByteUtils.toHexString(resultHash); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return resultHexString; } /** * 通過密鑰進行加密 * @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; } /** * 判斷源數據與加密數據是否一致 * @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; } public static void main(String[] args) { String str = "{\"test\":\"001\"}"; //秘鑰 String key = "key"; String hex = SM3Utils.encryptPlus(str,key); System.out.println("參數:" + str); System.out.println("密文:" + hex); } }
轉載:https://blog.csdn.net/yao583224426/article/details/121746882