Java sm3加密演算法的實現
阿新 • • 發佈:2020-10-21
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加密演算法的資料請關注我們其它相關文章!