Java實現(xiàn)常用加密算法SM3的方式及測試代碼
前言
在商用密碼體系中,SM3主要用于數字簽名及驗證、消息認證碼生成及驗證、隨機數生成等,其算法公開。據國家密碼管理局表示,其安全性及效率與SHA-256相當。本篇主要介紹SM3算法在Java(JDK1.8)中如何實現(xiàn),借助Java標準庫或第三方庫,非原始實現(xiàn),較為基礎。
一、SM3是什么?
SM3算法是一種密碼散列函數標準,由國家密碼管理局發(fā)布,其安全性和SHA-256相當。 這種算法主要用于商用密碼應用中的數字簽名和驗證、消息認證碼生成和驗證、隨機數生成等。SM3算法的執(zhí)行過程包括消息填充、消息分組、消息擴展、迭代壓縮和輸出結果。它是一種不需要密鑰的Hash算法,加密過程后無法還原為明文,即不可逆。SM3算法的執(zhí)行過程涉及將輸入的消息分成512位的分組,并對每個分組進行填充、分組、擴展、迭代壓縮等操作,最后輸出256位的摘要值。此外,SM3算法使用8個字寄存器來存儲每一輪迭代壓縮的過程數據及結果,這8個寄存器的初始值在算法開始執(zhí)行前被定義。
SM3算法的用途廣泛,包括但不限于生成消息以及文件的數字簽名,以保證信息的完整性和不可否認性。這種算法的特性使其適用于需要高安全性的應用場景,如數字簽名和驗證,以確保信息在傳輸或存儲過程中的完整性和真實性。
二、實現(xiàn)方式
Java標準庫并不包含SM3算法,一般借助BC庫自行實現(xiàn),也可以使用hutool(正式項目中不推薦)。
1、自行實現(xiàn)
1)導入Maven依賴,代碼如下(示例):
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>2)代碼如下(示例):
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class EncryptUtils {
static {
// 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java標準庫中,由BouncyCastleProvider實現(xiàn))
Security.addProvider(new BouncyCastleProvider());
}
/**
* SM3,國家商用密碼(Shang Mi3)也稱國密3,是中華人民共和國政府采用的一種密碼散列函數標準,由國家密碼管理局于2010年12月17日發(fā)布。
* <p>
* 輸入:待加密的字符串
* 輸出:256位(16字節(jié))或64個16進制字符(常用)
* 應用:密碼管理、數字簽名、文件完整性校驗
* 安全性:★★☆☆☆
*
* @param plainString 明文
* @return cipherString 密文
*/
public static String sm3(String plainString) {
String cipherString = null;
try {
// 創(chuàng)建SM3Digest對象
SM3Digest sm3Digest = new SM3Digest();
// 初始化SM3計算
sm3Digest.update(plainString.getBytes(StandardCharsets.UTF_8), 0, plainString.length());
// 創(chuàng)建輸出緩沖區(qū)
byte[] cipherBytes = new byte[sm3Digest.getDigestSize()];
// 計算SM3摘要
sm3Digest.doFinal(cipherBytes, 0);
// 輸出16進制字符串
StringBuilder sb = new StringBuilder();
for (byte b : cipherBytes) {
sb.append(String.format("%02x", b));
}
cipherString = sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return cipherString;
}
}2、hutool開源組件
1)導入依賴,代碼如下(示例):
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.12</version>
</dependency>2)代碼如下(示例):
import cn.hutool.crypto.SmUtil;
public class EncryptUtils {
static {
// 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java標準庫中,由BouncyCastleProvider實現(xiàn))
Security.addProvider(new BouncyCastleProvider());
}
/**
* SM3,國家商用密碼(Shang Mi3)也稱國密3,是中華人民共和國政府采用的一種密碼散列函數標準,由國家密碼管理局于2010年12月17日發(fā)布。
* <p>
* 輸入:待加密的字符串
* 輸出:256位(16字節(jié))或64個16進制字符(常用)
* 應用:密碼管理、數字簽名、文件完整性校驗
* 安全性:★★☆☆☆
*
* @param plainString 明文
* @return cipherString 密文
*/
public static String sm3(String plainString) {
return SmUtil.sm3(plainString);
}
}三、測試
我這里隨機找了一個在線SM3加密的某網站做對比,如下:
代碼如下(示例):
public class EncryptUtils {
...
public static void main(String[] args) {
String plainString = "hello world, hello java!";
String sm3 = sm3(plainString);
System.out.println("加密前: " + plainString);
System.out.println("加密后: " + sm3);
}
}代碼運行截圖:

某網站截圖:

總結
到此這篇關于Java實現(xiàn)常用加密算法SM3的方式及測試代碼的文章就介紹到這了,更多相關Java常用加密算法SM3內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用java實現(xiàn)百萬級別數據導出excel的三種方式
這篇文章主要介紹了使用java實現(xiàn)百萬級別數據導出excel的三種方式,有些業(yè)務系統(tǒng)可能動輒涉及到百萬上千萬的數據,用正常的方法效率就變得很低,今天我們來看看這幾種實現(xiàn)思路2023-03-03
Java8 stream 中利用 groupingBy 進行多字段分組求和案例
這篇文章主要介紹了Java8 stream 中利用 groupingBy 進行多字段分組求和案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
maven多profile 打包下 -P參和-D參數的實現(xiàn)
這篇文章主要介紹了maven多profile 打包下 -P參和-D參數的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

