Java實現(xiàn)SM3加密和驗證的示例代碼
更新時間:2023年12月19日 11:26:36 作者:共飲一杯無
在商用密碼體系中,SM3主要用于數(shù)字簽名及驗證、消息認證碼生成及驗證、隨機數(shù)生成等,其算法公開,本文給大家詳細介紹了使用Java實現(xiàn)SM3加密和驗證,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
需要引入如下坐標依賴:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
自定義密鑰加密及校驗
加密
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ù)自定義密鑰進行加密,返回加密后長度為32位的16進制字符串
*
* @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;
}
校驗
/**
* 利用源數(shù)據(jù)+密鑰校驗與密文是否一致
*
* @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);
}
無密鑰的加密及校驗
加密
/**
* SM3加密方式之:不提供密鑰的方式 SM3加密,返回加密后長度為64位的16進制字符串
*
* @param src 明文
* @return
*/
public static String encrypt(String src) {
return ByteUtils.toHexString(getEncryptBySrcByte(src.getBytes()));
}
/**
* 返回長度為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;
}
校驗
/**
* 校驗源數(shù)據(jù)與加密數(shù)據(jù)是否一致
*
* @param src 源數(shù)據(jù)
* @param sm3HexStr 16進制的加密數(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);
}
測試驗證
public static void main(String[] args) throws Exception {
String srcStr = "今天天氣很晴朗";
String key = "zjqzjq";
// ******************************自定義密鑰加密及校驗*****************************************
String hexStrByKey = SM3Utils.encrypt(srcStr, key);
System.out.println("帶密鑰加密后的密文:" + hexStrByKey);
System.out.println("明文(帶密鑰)與密文校驗結(jié)果:" + SM3Utils.verify(srcStr, key, hexStrByKey));
// ******************************無密鑰的加密及校驗******************************************
String hexStrNoKey = SM3Utils.encrypt(srcStr);
System.out.println("不帶密鑰加密后的密文:" + hexStrNoKey);
System.out.println("明文(不帶密鑰)與密文校驗結(jié)果:" + SM3Utils.verify(srcStr, hexStrNoKey));
}
結(jié)果輸出如下:

以上就是Java實現(xiàn)SM3加密和驗證的示例代碼的詳細內(nèi)容,更多關(guān)于Java實現(xiàn)SM3加密和驗證的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot項目嵌入RocketMQ的實現(xiàn)示例
本文主要介紹了SpringBoot項目嵌入RocketMQ的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
java將String字符串轉(zhuǎn)換為List<Long>類型實例方法
在本篇文章里小編給大家整理的是關(guān)于java將String字符串轉(zhuǎn)換為List<Long>類型實例方法,需要的朋友們可以參考下。2020-03-03
Java使用Jdbc連接Oracle執(zhí)行簡單查詢操作示例
這篇文章主要介紹了Java使用Jdbc連接Oracle執(zhí)行簡單查詢操作,結(jié)合實例形式詳細分析了java基于jdbc實現(xiàn)Oracle數(shù)據(jù)庫的連接與查詢相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
Spring使用AspectJ注解和XML配置實現(xiàn)AOP
這篇文章主要介紹了Spring使用AspectJ注解和XML配置實現(xiàn)AOP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
解決Maven無法下載2.1.7.js7版本的itext依賴問題
本文主要解決使用Maven編譯項目時出現(xiàn)的itext依賴版本問題,通過分析,發(fā)現(xiàn)該問題是由jasperreports依賴的特定版本itext導(dǎo)致的,解決方法是排除jasperreports中的itext依賴,并自行指定更高版本的itext依賴2024-12-12

