Java sm3加密算法的實(shí)現(xiàn)
1.準(zhǔn)備工作
所需jar包:
bcprov-jdk15on-1.59.jar
commons-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é)果驗(yàn)證(不可逆算法)
* @author Marydon
* @creationTime 2018年7月5日上午10:01:24
* @version 1.0
* @since
* @email marydon20170307@163.com
*/
public class Sm3Utils {
private static final String ENCODING = "UTF-8";
static {
Security.addProvider(new BouncyCastleProvider());
}
}
2.SM3加密
方式一:不提供密鑰
/**
* sm3算法加密
* @explain
* @param paramStr
* 待加密字符串
* @return 返回加密后,固定長度=32的16進(jìn)制字符串
*/
public static String encrypt(String paramStr){
// 將返回的hash值轉(zhuǎn)換成16進(jìn)制字符串
String resultHexString = "";
try {
// 將字符串轉(zhuǎn)換成byte數(shù)組
byte[] srcData = paramStr.getBytes(ENCODING);
// 調(diào)用hash()
byte[] resultHash = hash(srcData);
// 將返回的hash值轉(zhuǎn)換成16進(jìn)制字符串
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;
}
方式二:自定義密鑰
/**
* 通過密鑰進(jìn)行加密
* @explain 指定密鑰進(jìn)行加密
* @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ù)校驗(yàn)
/**
* 判斷源數(shù)據(jù)與加密數(shù)據(jù)是否一致
* @explain 通過驗(yàn)證原數(shù)組和生成的hash數(shù)組是否為同一數(shù)組,驗(yàn)證2者是否為同一數(shù)據(jù)
* @param srcStr
* 原字符串
* @param sm3HexString
* 16進(jìn)制字符串
* @return 校驗(yàn)結(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
// 驗(yàn)證加密后的16進(jìn)制字符串與加密前的字符串是否相同
boolean flag = Sm3Utils.verify(json, hex);
System.out.println(flag);// true
}
以上就是Java sm3加密算法的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Java sm3加密算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于SpringCloud分布式系統(tǒng)中實(shí)現(xiàn)冪等性的幾種方式
這篇文章主要介紹了關(guān)于SpringCloud分布式系統(tǒng)中實(shí)現(xiàn)冪等性的幾種方式,冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù),這些函數(shù)不會(huì)影響系統(tǒng)狀態(tài),也不用擔(dān)心重復(fù)執(zhí)行會(huì)對系統(tǒng)造成改變,需要的朋友可以參考下2023-10-10
Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院
我們在編程的時(shí)候,經(jīng)常需要保存對象的中間狀態(tài),當(dāng)需要的時(shí)候,可以恢復(fù)到這個(gè)狀態(tài)。接下來通過本文給大家分享java設(shè)計(jì)模式之備忘錄模式,感興趣的的朋友一起看看吧2017-08-08
SpringBoot項(xiàng)目使用validated實(shí)現(xiàn)參數(shù)校驗(yàn)框架
當(dāng)談到Spring的參數(shù)校驗(yàn)功能時(shí),@Validated注解無疑是一個(gè)重要的利器,它為我們提供了一種簡單而又強(qiáng)大的方式來驗(yàn)證請求參數(shù)的合法性,保證了系統(tǒng)的穩(wěn)定性和安全性,本文將介紹Spring Validated的基本用法以及在實(shí)際項(xiàng)目中的應(yīng)用,需要的朋友可以參考下2024-05-05
Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)
這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無參區(qū)別),通過代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下2022-04-04
詳解Spring AOP 實(shí)現(xiàn)主從讀寫分離
本篇文章主要介紹了Spring AOP 實(shí)現(xiàn)主從讀寫分離,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
SpringSecurity6.4中一次性令牌登錄(One-Time Token Login)實(shí)現(xiàn)
Spring Security為一次性令牌認(rèn)證提供了支持,本文就來介紹一下SpringSecurity6.4中一次性令牌登錄(One-Time Token Login)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
Java幾個(gè)實(shí)例帶你進(jìn)階升華上篇
與其明天開始,不如現(xiàn)在行動(dòng),本文為你帶來幾個(gè)Java書寫的實(shí)際案例,對鞏固編程的基礎(chǔ)能力很有幫助,快來一起往下看看吧2022-03-03
高并發(fā)下restTemplate的錯(cuò)誤分析方式
這篇文章主要介紹了高并發(fā)下restTemplate的錯(cuò)誤分析方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

