Java sm3加密算法的實現(xiàn)
1.準(zhǔn)備工作
所需jar包:
bcprov-jdk15on-1.59.jarcommons-lang3-3.1.jar
對應(yīng)的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 加密與加密結(jié)果驗證(不可逆算法) * @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值轉(zhuǎn)換成16進制字符串 String resultHexString = ''; try { // 將字符串轉(zhuǎn)換成byte數(shù)組 byte[] srcData = paramStr.getBytes(ENCODING); // 調(diào)用hash() byte[] resultHash = hash(srcData); // 將返回的hash值轉(zhuǎn)換成16進制字符串 resultHexString = ByteUtils.toHexString(resultHash); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return resultHexString;} /** * 返回長度=32的byte數(shù)組 * @explain 生成對應(yīng)的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數(shù)組 * @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.加密數(shù)據(jù)校驗
/** * 判斷源數(shù)據(jù)與加密數(shù)據(jù)是否一致 * @explain 通過驗證原數(shù)組和生成的hash數(shù)組是否為同一數(shù)組,驗證2者是否為同一數(shù)據(jù) * @param srcStr * 原字符串 * @param sm3HexString * 16進制字符串 * @return 校驗結(jié)果 */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加密算法的實現(xiàn)的詳細內(nèi)容,更多關(guān)于Java sm3加密算法的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. ASP動態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗分享2. jsp文件下載功能實現(xiàn)代碼3. asp.net core項目授權(quán)流程詳解4. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法5. CSS3實現(xiàn)動態(tài)翻牌效果 仿百度貼吧3D翻牌一次動畫特效6. XMLHTTP資料7. ASP常用日期格式化函數(shù) FormatDate()8. html中的form不提交(排除)某些input 原創(chuàng)9. CSS3中Transition屬性詳解以及示例分享10. ASP基礎(chǔ)入門第八篇(ASP內(nèi)建對象Application和Session)
