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

Java實(shí)現(xiàn)常用加密算法SM3的方式及測(cè)試代碼

 更新時(shí)間:2024年10月14日 10:35:02   作者:祖安文科狀元丶  
這篇文章介紹了SM3算法在Java中的實(shí)現(xiàn)方式,SM3算法是一種密碼散列函數(shù)標(biāo)準(zhǔn),主要用于商用密碼應(yīng)用中的數(shù)字簽名和驗(yàn)證、消息認(rèn)證碼生成和驗(yàn)證、隨機(jī)數(shù)生成等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在商用密碼體系中,SM3主要用于數(shù)字簽名及驗(yàn)證、消息認(rèn)證碼生成及驗(yàn)證、隨機(jī)數(shù)生成等,其算法公開。據(jù)國(guó)家密碼管理局表示,其安全性及效率與SHA-256相當(dāng)。本篇主要介紹SM3算法在Java(JDK1.8)中如何實(shí)現(xiàn),借助Java標(biāo)準(zhǔn)庫(kù)或第三方庫(kù),非原始實(shí)現(xiàn),較為基礎(chǔ)。

一、SM3是什么?

SM3算法是一種密碼散列函數(shù)標(biāo)準(zhǔn),‌由國(guó)家密碼管理局發(fā)布,‌其安全性和SHA-256相當(dāng)。‌ 這種算法主要用于商用密碼應(yīng)用中的數(shù)字簽名和驗(yàn)證、‌消息認(rèn)證碼生成和驗(yàn)證、‌隨機(jī)數(shù)生成等。‌SM3算法的執(zhí)行過(guò)程包括消息填充、‌消息分組、‌消息擴(kuò)展、‌迭代壓縮和輸出結(jié)果。‌它是一種不需要密鑰的Hash算法,‌加密過(guò)程后無(wú)法還原為明文,‌即不可逆。‌SM3算法的執(zhí)行過(guò)程涉及將輸入的消息分成512位的分組,‌并對(duì)每個(gè)分組進(jìn)行填充、‌分組、‌擴(kuò)展、‌迭代壓縮等操作,‌最后輸出256位的摘要值。‌此外,‌SM3算法使用8個(gè)字寄存器來(lái)存儲(chǔ)每一輪迭代壓縮的過(guò)程數(shù)據(jù)及結(jié)果,‌這8個(gè)寄存器的初始值在算法開始執(zhí)行前被定義。‌

SM3算法的用途廣泛,‌包括但不限于生成消息以及文件的數(shù)字簽名,‌以保證信息的完整性和不可否認(rèn)性。‌這種算法的特性使其適用于需要高安全性的應(yīng)用場(chǎng)景,‌如數(shù)字簽名和驗(yàn)證,‌以確保信息在傳輸或存儲(chǔ)過(guò)程中的完整性和真實(shí)性。

二、實(shí)現(xiàn)方式

Java標(biāo)準(zhǔn)庫(kù)并不包含SM3算法,一般借助BC庫(kù)自行實(shí)現(xiàn),也可以使用hutool(正式項(xiàng)目中不推薦)。

1、自行實(shí)現(xiàn)

1)導(dǎo)入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標(biāo)準(zhǔn)庫(kù)中,由BouncyCastleProvider實(shí)現(xiàn))
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * SM3,國(guó)家商用密碼(Shang Mi3)也稱國(guó)密3,是中華人民共和國(guó)政府采用的一種密碼散列函數(shù)標(biāo)準(zhǔn),由國(guó)家密碼管理局于2010年12月17日發(fā)布。
     * <p>
     * 輸入:待加密的字符串
     * 輸出:256位(16字節(jié))或64個(gè)16進(jìn)制字符(常用)
     * 應(yīng)用:密碼管理、數(shù)字簽名、文件完整性校驗(yàn)
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sm3(String plainString) {
        String cipherString = null;
        try {
            // 創(chuàng)建SM3Digest對(duì)象
            SM3Digest sm3Digest = new SM3Digest();
            // 初始化SM3計(jì)算
            sm3Digest.update(plainString.getBytes(StandardCharsets.UTF_8), 0, plainString.length());
            // 創(chuàng)建輸出緩沖區(qū)
            byte[] cipherBytes = new byte[sm3Digest.getDigestSize()];
            // 計(jì)算SM3摘要
            sm3Digest.doFinal(cipherBytes, 0);
            // 輸出16進(jìn)制字符串
            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)導(dǎo)入依賴,代碼如下(示例):

<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標(biāo)準(zhǔn)庫(kù)中,由BouncyCastleProvider實(shí)現(xiàn))
        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     * SM3,國(guó)家商用密碼(Shang Mi3)也稱國(guó)密3,是中華人民共和國(guó)政府采用的一種密碼散列函數(shù)標(biāo)準(zhǔn),由國(guó)家密碼管理局于2010年12月17日發(fā)布。
     * <p>
     * 輸入:待加密的字符串
     * 輸出:256位(16字節(jié))或64個(gè)16進(jìn)制字符(常用)
     * 應(yīng)用:密碼管理、數(shù)字簽名、文件完整性校驗(yàn)
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sm3(String plainString) {
        return SmUtil.sm3(plainString);
    }
}

三、測(cè)試

我這里隨機(jī)找了一個(gè)在線SM3加密的某網(wǎng)站做對(duì)比,如下:

代碼如下(示例):

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);
    }
}

代碼運(yùn)行截圖:

某網(wǎng)站截圖:

總結(jié)

到此這篇關(guān)于Java實(shí)現(xiàn)常用加密算法SM3的方式及測(cè)試代碼的文章就介紹到這了,更多相關(guān)Java常用加密算法SM3內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot集成定時(shí)器和多線程異步處理操作

    Springboot集成定時(shí)器和多線程異步處理操作

    這篇文章主要介紹了Springboot集成定時(shí)器和多線程異步處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 詳解Springboot Oauth2 Server搭建Oauth2認(rèn)證服務(wù)

    詳解Springboot Oauth2 Server搭建Oauth2認(rèn)證服務(wù)

    這篇文章主要介紹了Springboot Oauth2 Server 搭建Oauth2認(rèn)證服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • JavaEE初階教程之UDP協(xié)議和TCP協(xié)議

    JavaEE初階教程之UDP協(xié)議和TCP協(xié)議

    TCP是一種面向連接的、可靠的、面向字節(jié)流,雙全工的傳輸層通信協(xié)議,UDP是傳輸層的協(xié)議,功能即為在IP的數(shù)據(jù)報(bào)服務(wù)之上增加了最基本的服務(wù),這篇文章主要介紹了JavaEE初階教程之UDP協(xié)議和TCP協(xié)議的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例

    Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例

    這篇文章主要介紹了Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能,結(jié)合實(shí)例形式分析了java優(yōu)先隊(duì)列的簡(jiǎn)單定義與使用方法,需要的朋友可以參考下
    2017-11-11
  • Java實(shí)現(xiàn)字符串解析為日期時(shí)間的方法示例

    Java實(shí)現(xiàn)字符串解析為日期時(shí)間的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)字符串解析為日期時(shí)間的方法,結(jié)合具體實(shí)例形式分析了java日期時(shí)間字符串的解析操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • 一篇文章帶你入門java方法

    一篇文章帶你入門java方法

    這篇文章主要介紹了java基礎(chǔ)之方法詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-08-08
  • SpringBoot深入分析webmvc和webflux的區(qū)別

    SpringBoot深入分析webmvc和webflux的區(qū)別

    這篇文章主要介紹了SpringBoot深入分析webmvc和webflux的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-02-02
  • 詳解SpringBoot應(yīng)用服務(wù)啟動(dòng)與安全終止

    詳解SpringBoot應(yīng)用服務(wù)啟動(dòng)與安全終止

    這篇文章主要介紹了SpringBoot應(yīng)用服務(wù)啟動(dòng)與安全終止,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot+Kotlin中使用GRPC實(shí)現(xiàn)服務(wù)通信的示例代碼

    SpringBoot+Kotlin中使用GRPC實(shí)現(xiàn)服務(wù)通信的示例代碼

    本文主要介紹了SpringBoot+Kotlin中使用GRPC實(shí)現(xiàn)服務(wù)通信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 老生常談java中cookie的使用

    老生常談java中cookie的使用

    下面小編就為大家?guī)?lái)一篇老生常談java中cookie的使用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12

最新評(píng)論

上思县| 册亨县| 十堰市| 虞城县| 尼玛县| 漳浦县| 大足县| 株洲县| 封开县| 泸水县| 喀喇| 栾川县| 石首市| 沾化县| 慈利县| 浦城县| 霍林郭勒市| 山丹县| 崇信县| 吴旗县| 从化市| 余姚市| 北宁市| 都江堰市| 三原县| 四会市| 收藏| 龙山县| 无极县| 眉山市| 来凤县| 肃北| 盈江县| 西乌珠穆沁旗| 玉门市| 株洲县| 莎车县| 鄂托克前旗| 温宿县| 怀柔区| 建始县|