springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo
需求
前后端交互的加解密算法,要求使用國產(chǎn)的
1、SM1分組密碼算法
SM1是由國家密碼管理局編制的一種商用密碼分組標準對稱算法,分組長度和密鑰長度均為128位,算法的安全保密強度及相關軟硬件實現(xiàn)性能與AES算法相當,目前該算法尚未公開,僅以IP核的形式存在于芯片中,調(diào)用該算法時,需要通過加密芯片的接口進行調(diào)用。
2、*SM2公鑰密碼算法
SM2算法是國家密碼據(jù)于2010年12月17日發(fā)布的國密標準橢圓曲線加密算法,是一種基于ECC算法的非對稱加密算法,SM2橢圓曲線公鑰密碼算法是我國自主設計的公鑰密碼算法,包括SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。
SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點群離散對數(shù)難題,對于一般橢圓曲線的離散對數(shù)問題,目前只存在指數(shù)級計算復雜度的求解方法。
與大數(shù)分解問題及有限域上離散對數(shù)問題相比,橢圓曲線離散對數(shù)問題的求解難度要大得多。
因此,在相同安全程度要求下,橢圓曲線密碼較其他公鑰密碼所需的秘鑰規(guī)模要小得多。
相對于RSA算法,256位的SM2密碼強度已經(jīng)比2048位的RSA密碼強度要高。
其加密強度為256位,密鑰長度短,安全程度高,可用于數(shù)字簽名、密鑰交換、公鑰加密。
3、*SM3密碼雜湊算法
SM3是我國采用的一種密碼散列函數(shù)標準,由國家密碼管理局于2010年12月17日發(fā)布。
相關標準為“GM/T 0004-2012 《SM3密碼雜湊算法》”。
據(jù)國家密碼管理局表示,其安全性及效率與SHA-256相當,也叫密碼雜湊算法,屬于哈希(摘要)算法的一種,功能與MD5,SHA-1相同。
對長度小于264比特的消息m,經(jīng)過填充、壓縮,生成256位雜湊值,和SM2算法一起被公布,該算法位不可逆的算法。
在商用密碼體系中,SM3主要用于數(shù)字簽名及驗證、消息認證碼生成及驗證、隨機數(shù)生成等,可滿足多種密碼應用的安全需求,算法已公開。
4、*SM4分組密碼算法
SM4是國家密碼管理局發(fā)布的分組密碼算法,于2012年3月正式公布。
與DES和AES算法類似,SM4是一種分組密碼算法。其分組長度為128bit,密鑰長度也為128bit。
SM4算法加/解密算法是對合運算,只是使用輪密鑰相反,其中解密輪密鑰是加密輪密鑰的逆序。
加密算法與密鑰擴展算法均采用32輪非線性迭代結(jié)構(gòu)(Feistel),以字(32位)為單位進行加密運算,每一次迭代運算均為一輪變換函數(shù)F。
目前主要用于無線局域網(wǎng)產(chǎn)品。
方案
使用場景:前后端交互使用sm2,后端存儲密碼時使用sm3
1、pom依賴
<dependency> ? ? ?<groupId>org.bouncycastle</groupId> ? ? ?<artifactId>bcprov-jdk15on</artifactId> ? ? ?<version>1.60</version> </dependency>
2、demo示例
public static void main(String[] args) throws InvalidCipherTextException {
System.out.println("sm2測試開始-----------");
X9ECParameters sm2EcParameters = GMNamedCurves.getByName("sm2p256v1");
ECDomainParameters domainParameters = new ECDomainParameters(sm2EcParameters.getCurve(),sm2EcParameters.getG(),sm2EcParameters.getN());
ECKeyPairGenerator keyPairGenerator =new ECKeyPairGenerator();
try {
keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
//私鑰
BigInteger privateKey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
String privateKeyHex = privateKey.toString(16);
System.out.println("私鑰:" + privateKeyHex);
//公鑰
ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
System.out.println("公鑰:" + publicKeyHex);
String str = SM2Util.encrypt("test",publicKeyHex);
System.out.println("加密結(jié)果:"+str);
try{
String res = SM2Util.decrypt(str,privateKeyHex);
System.out.println("解密結(jié)果:"+res);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("sm2測試結(jié)束-----------");
System.out.println("sm3測試開始-----------");
String sm3 = SM3Util.sm3Sign("test");
System.out.println("sm3加密結(jié)果"+sm3);
if(SM3Util.sm3Verify("test",sm3)){
System.out.println("sm3驗證成功");
}else {
System.out.println("sm3驗證失敗");
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}3、結(jié)果
sm2測試開始-----------
私鑰:bdda9f26ae5884e3f5410902aec78cab6c3f4a7c9d9578e6a9c60ae977d6d645
公鑰:041870142d71f518ce9bd6458b4b41b4d49e7fbfd9a14440eb49ed9bbb352e72739d2e2369722ba381db2a7add5093c7a976df49496cb5c08a56e87db877f4e866
加密結(jié)果:0445fd5bce247f30cd507314830f57d3278dfdfab3e8fdc6acb93c60a3a4b6bbc09150c065153389d7b0c3581a0a0fd5c3ffe59ed53855a289a98ce9705a5230b752aa8535980ba08db6319eef0f3c1140ccd3d0849f0c78a4478189c1736de07b27254794929c9de9
解密結(jié)果:test
sm2測試結(jié)束-----------
sm3測試開始-----------
sm3加密結(jié)果55e12e91650d2fec56ec74e1d3e4ddbfce2ef3a65890c2a19ecf88a307e76a23
sm3驗證成功
4、前端加密
const sm2 = require('sm-crypto').sm2
const cipherMode = 0 // 1 - C1C3C2,0 - C1C2C3,默認為1,這里用0加密
let base = Base64.encode(msgString);
let encryptData = sm2.doEncrypt(base, publicKey, cipherMode) // 加密結(jié)果
conso.log("加密結(jié)果:",encryptData);總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mybatis如何使用Criteria的and和or進行聯(lián)合查詢
這篇文章主要介紹了mybatis如何使用Criteria的and和or進行聯(lián)合查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring?Boot?3.0?+?MyBatis-Plus全家桶實戰(zhàn)詳細代碼
MyBatis-Plus是一個MyBatis的增強工具,是國內(nèi)人員開發(fā)的MyBatis增強工具,在MyBatis的基礎上只做增強不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了Spring?Boot?3.0?+?MyBatis-Plus全家桶的相關資料,需要的朋友可以參考下2025-10-10
Java之synchronized(含與ReentrantLock的區(qū)別解讀)
文章主要介紹了`synchronized`和`ReentrantLock`的區(qū)別,包括它們的實現(xiàn)原理、公平性、靈活性、可中斷性等方面,同時,文章詳細解釋了`synchronized`的使用方法,包括修飾實例方法、靜態(tài)方法和代碼塊的情況,以及如何分析代碼是否互斥和可重入性2025-01-01
淺談java并發(fā)之計數(shù)器CountDownLatch
CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,當我們在new 一個CountDownLatch對象的時候需要帶入該計數(shù)器值,該值就表示了線程的數(shù)量。下面我們來深入了解一下吧2019-06-06
Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復數(shù)生成隨機數(shù)的方法小結(jié)
這篇文章主要介紹了Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復數(shù)生成隨機數(shù)的方法,結(jié)合實例形式較為詳細的分析了java根據(jù)指定范圍生成不重復隨機數(shù)的相關操作技巧,需要的朋友可以參考下2017-04-04

