Java實(shí)現(xiàn)SM3加密和驗(yàn)證的示例代碼
更新時(shí)間:2023年12月19日 11:26:36 作者:共飲一杯無(wú)
在商用密碼體系中,SM3主要用于數(shù)字簽名及驗(yàn)證、消息認(rèn)證碼生成及驗(yàn)證、隨機(jī)數(shù)生成等,其算法公開,本文給大家詳細(xì)介紹了使用Java實(shí)現(xiàn)SM3加密和驗(yàn)證,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
需要引入如下坐標(biāo)依賴:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
自定義密鑰加密及校驗(yàn)
加密
private static final String ENCODING = "UTF-8";
/**
* 加密
*
* @param src 明文
* @param key 密鑰
* @return
* @throws Exception
*/
public static String encrypt(String src, String key) throws Exception {
return ByteUtils.toHexString(getEncryptByKey(src, key));
}
/**
* SM3加密方式之: 根據(jù)自定義密鑰進(jìn)行加密,返回加密后長(zhǎng)度為32位的16進(jìn)制字符串
*
* @param src 源數(shù)據(jù)
* @param key 密鑰
* @return
* @throws Exception
*/
public static byte[] getEncryptByKey(String src, String key) throws Exception {
byte[] srcByte = src.getBytes(ENCODING);
byte[] keyByte = key.getBytes(ENCODING);
KeyParameter keyParameter = new KeyParameter(keyByte);
SM3Digest sm3 = new SM3Digest();
HMac hMac = new HMac(sm3);
hMac.init(keyParameter);
hMac.update(srcByte, 0, srcByte.length);
byte[] result = new byte[hMac.getMacSize()];
hMac.doFinal(result, 0);
return result;
}
校驗(yàn)
/**
* 利用源數(shù)據(jù)+密鑰校驗(yàn)與密文是否一致
*
* @param src 源數(shù)據(jù)
* @param key 密鑰
* @param sm3HexStr 密文
* @return
* @throws Exception
*/
public static boolean verify(String src, String key, String sm3HexStr) throws Exception {
byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
byte[] newHashCode = getEncryptByKey(src, key);
return Arrays.equals(newHashCode, sm3HashCode);
}
無(wú)密鑰的加密及校驗(yàn)
加密
/**
* SM3加密方式之:不提供密鑰的方式 SM3加密,返回加密后長(zhǎng)度為64位的16進(jìn)制字符串
*
* @param src 明文
* @return
*/
public static String encrypt(String src) {
return ByteUtils.toHexString(getEncryptBySrcByte(src.getBytes()));
}
/**
* 返回長(zhǎng)度為32位的加密后的byte數(shù)組
*
* @param srcByte
* @return
*/
public static byte[] getEncryptBySrcByte(byte[] srcByte) {
SM3Digest sm3 = new SM3Digest();
sm3.update(srcByte, 0, srcByte.length);
byte[] encryptByte = new byte[sm3.getDigestSize()];
sm3.doFinal(encryptByte, 0);
return encryptByte;
}
校驗(yàn)
/**
* 校驗(yàn)源數(shù)據(jù)與加密數(shù)據(jù)是否一致
*
* @param src 源數(shù)據(jù)
* @param sm3HexStr 16進(jìn)制的加密數(shù)據(jù)
* @return
* @throws Exception
*/
public static boolean verify(String src, String sm3HexStr) throws Exception {
byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
byte[] newHashCode = getEncryptBySrcByte(src.getBytes(ENCODING));
return Arrays.equals(newHashCode, sm3HashCode);
}
測(cè)試驗(yàn)證
public static void main(String[] args) throws Exception {
String srcStr = "今天天氣很晴朗";
String key = "zjqzjq";
// ******************************自定義密鑰加密及校驗(yàn)*****************************************
String hexStrByKey = SM3Utils.encrypt(srcStr, key);
System.out.println("帶密鑰加密后的密文:" + hexStrByKey);
System.out.println("明文(帶密鑰)與密文校驗(yàn)結(jié)果:" + SM3Utils.verify(srcStr, key, hexStrByKey));
// ******************************無(wú)密鑰的加密及校驗(yàn)******************************************
String hexStrNoKey = SM3Utils.encrypt(srcStr);
System.out.println("不帶密鑰加密后的密文:" + hexStrNoKey);
System.out.println("明文(不帶密鑰)與密文校驗(yàn)結(jié)果:" + SM3Utils.verify(srcStr, hexStrNoKey));
}
結(jié)果輸出如下:

以上就是Java實(shí)現(xiàn)SM3加密和驗(yàn)證的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java實(shí)現(xiàn)SM3加密和驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Redis使用@Cacheable和RedisTemplate
本文主要介紹了SpringBoot整合Redis使用@Cacheable和RedisTemplate,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java文件(io)編程_基于File類的基本用法(必看篇)
下面小編就為大家?guī)?lái)一篇Java文件(io)編程_基于File類的基本用法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Olingo分析和實(shí)踐之OData框架核心組件初始化(關(guān)鍵步驟)
ODataSpringBootService通過(guò)初始化OData實(shí)例和服務(wù)元數(shù)據(jù),構(gòu)建框架核心能力與數(shù)據(jù)模型結(jié)構(gòu),實(shí)現(xiàn)序列化、URI解析及URL映射,為請(qǐng)求處理提供基礎(chǔ)支撐,本文給大家介紹Olingo分析和實(shí)踐之OData框架核心組件初始化,感興趣的朋友一起看看吧2025-07-07
利用Redis實(shí)現(xiàn)延時(shí)處理的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Redis實(shí)現(xiàn)延時(shí)處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼)
這篇文章主要介紹了Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

