最新国产好看的视频,伊人天堂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是由國家密碼管理局編制的一種商用密碼分組標(biāo)準(zhǔn)對稱算法,分組長度和密鑰長度均為128位,算法的安全保密強度及相關(guān)軟硬件實現(xiàn)性能與AES算法相當(dāng),目前該算法尚未公開,僅以IP核的形式存在于芯片中,調(diào)用該算法時,需要通過加密芯片的接口進行調(diào)用。

2、*SM2公鑰密碼算法

SM2算法是國家密碼據(jù)于2010年12月17日發(fā)布的國密標(biāo)準(zhǔn)橢圓曲線加密算法,是一種基于ECC算法的非對稱加密算法,SM2橢圓曲線公鑰密碼算法是我國自主設(shè)計的公鑰密碼算法,包括SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。

SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點群離散對數(shù)難題,對于一般橢圓曲線的離散對數(shù)問題,目前只存在指數(shù)級計算復(fù)雜度的求解方法。

與大數(shù)分解問題及有限域上離散對數(shù)問題相比,橢圓曲線離散對數(shù)問題的求解難度要大得多。

因此,在相同安全程度要求下,橢圓曲線密碼較其他公鑰密碼所需的秘鑰規(guī)模要小得多。

相對于RSA算法,256位的SM2密碼強度已經(jīng)比2048位的RSA密碼強度要高。

其加密強度為256位,密鑰長度短,安全程度高,可用于數(shù)字簽名、密鑰交換、公鑰加密。

3、*SM3密碼雜湊算法

SM3是我國采用的一種密碼散列函數(shù)標(biāo)準(zhǔn),由國家密碼管理局于2010年12月17日發(fā)布。

相關(guān)標(biāo)準(zhǔn)為“GM/T 0004-2012 《SM3密碼雜湊算法》”。

據(jù)國家密碼管理局表示,其安全性及效率與SHA-256相當(dāng),也叫密碼雜湊算法,屬于哈希(摘要)算法的一種,功能與MD5,SHA-1相同。

對長度小于264比特的消息m,經(jīng)過填充、壓縮,生成256位雜湊值,和SM2算法一起被公布,該算法位不可逆的算法。

在商用密碼體系中,SM3主要用于數(shù)字簽名及驗證、消息認(rèn)證碼生成及驗證、隨機數(shù)生成等,可滿足多種密碼應(yīng)用的安全需求,算法已公開。

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,默認(rèn)為1,這里用0

加密

let base = Base64.encode(msgString);
let encryptData = sm2.doEncrypt(base, publicKey, cipherMode) // 加密結(jié)果
conso.log("加密結(jié)果:",encryptData);

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 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),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring?Boot?3.0?+?MyBatis-Plus全家桶實戰(zhàn)詳細(xì)代碼

    Spring?Boot?3.0?+?MyBatis-Plus全家桶實戰(zhàn)詳細(xì)代碼

    MyBatis-Plus是一個MyBatis的增強工具,是國內(nèi)人員開發(fā)的MyBatis增強工具,在MyBatis的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,這篇文章主要介紹了Spring?Boot?3.0?+?MyBatis-Plus全家桶的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • Java之synchronized(含與ReentrantLock的區(qū)別解讀)

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

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

    springboot集成nacos的配置方法

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

    8個簡單部分開啟Java語言學(xué)習(xí)之路 附j(luò)ava學(xué)習(xí)書單

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

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

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

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

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

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

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

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

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

最新評論

商丘市| 莱阳市| 武胜县| 灵石县| 大埔县| 中卫市| 临泽县| 正镶白旗| 东至县| 中卫市| 富锦市| 闽侯县| 乐陵市| 甘谷县| 宿州市| 和平区| 竹山县| 佛冈县| 和顺县| 海兴县| 怀化市| 大邑县| 双鸭山市| 田东县| 武邑县| 营口市| 黑水县| 陕西省| 峨眉山市| 临城县| 廊坊市| 河西区| 大理市| 顺昌县| 鄱阳县| 思南县| 胶南市| 济阳县| 凤台县| 天台县| 合江县|