最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot使用國產(chǎn)加密算法方式,sm2和sm3加解密demo

 更新時間:2023年07月19日 09:49:29   作者:yy1209357299  
這篇文章主要介紹了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)合查詢

    這篇文章主要介紹了mybatis如何使用Criteria的and和or進行聯(lián)合查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 一文詳解JavaWeb過濾器(Filter)

    一文詳解JavaWeb過濾器(Filter)

    本文主要介紹了一文詳解JavaWeb過濾器(Filter),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Spring?Boot?3.0?+?MyBatis-Plus全家桶實戰(zhàn)詳細代碼

    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ū)別解讀)

    Java之synchronized(含與ReentrantLock的區(qū)別解讀)

    文章主要介紹了`synchronized`和`ReentrantLock`的區(qū)別,包括它們的實現(xiàn)原理、公平性、靈活性、可中斷性等方面,同時,文章詳細解釋了`synchronized`的使用方法,包括修飾實例方法、靜態(tài)方法和代碼塊的情況,以及如何分析代碼是否互斥和可重入性
    2025-01-01
  • springboot集成nacos的配置方法

    springboot集成nacos的配置方法

    這篇文章主要介紹了springboot集成nacos的配置方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 8個簡單部分開啟Java語言學習之路 附java學習書單

    8個簡單部分開啟Java語言學習之路 附java學習書單

    8個簡單部分開啟Java語言學習之路,附java學習書單,這篇文章主要向大家介紹了學習java語言的方向,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 淺談java并發(fā)之計數(shù)器CountDownLatch

    淺談java并發(fā)之計數(shù)器CountDownLatch

    CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,當我們在new 一個CountDownLatch對象的時候需要帶入該計數(shù)器值,該值就表示了線程的數(shù)量。下面我們來深入了解一下吧
    2019-06-06
  • Java并發(fā)之Condition案例詳解

    Java并發(fā)之Condition案例詳解

    這篇文章主要介紹了Java并發(fā)之Condition案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復數(shù)生成隨機數(shù)的方法小結(jié)

    Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復數(shù)生成隨機數(shù)的方法小結(jié)

    這篇文章主要介紹了Java編程實現(xiàn)從給定范圍內(nèi)隨機N個不重復數(shù)生成隨機數(shù)的方法,結(jié)合實例形式較為詳細的分析了java根據(jù)指定范圍生成不重復隨機數(shù)的相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • Java方法能定義多少個參數(shù)你知道嗎

    Java方法能定義多少個參數(shù)你知道嗎

    這篇文章主要給大家介紹了關于Java方法能定義多少個參數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09

最新評論

景德镇市| 和龙市| 犍为县| 香格里拉县| 洛南县| 新邵县| 乐业县| 信阳市| 涞水县| 永嘉县| 蒙城县| 新源县| 五常市| 靖江市| 涪陵区| 图片| 开鲁县| 肇州县| 鹤峰县| 临邑县| 五大连池市| 西峡县| 仁布县| 郑州市| 五华县| 苗栗县| 从化市| 崇义县| 库尔勒市| 荔波县| 青川县| 四子王旗| 博罗县| 泽库县| 奉贤区| 宜昌市| 余庆县| 平安县| 星座| 饶平县| 双峰县|