欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

一、SM3是什么?

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

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

二、實現(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,是中華人民共和國政府采用的一種密碼散列函數(shù)標準,由國家密碼管理局于2010年12月17日發(fā)布。
     * <p>
     * 輸入:待加密的字符串
     * 輸出:256位(16字節(jié))或64個16進制字符(常用)
     * 應用:密碼管理、數(shù)字簽名、文件完整性校驗
     * 安全性:★★☆☆☆
     *
     * @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,是中華人民共和國政府采用的一種密碼散列函數(shù)標準,由國家密碼管理局于2010年12月17日發(fā)布。
     * <p>
     * 輸入:待加密的字符串
     * 輸出:256位(16字節(jié))或64個16進制字符(常用)
     * 應用:密碼管理、數(shù)字簽名、文件完整性校驗
     * 安全性:★★☆☆☆
     *
     * @param plainString 明文
     * @return cipherString 密文
     */
    public static String sm3(String plainString) {
        return SmUtil.sm3(plainString);
    }
}

三、測試

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

代碼如下(示例):

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

代碼運行截圖:

某網(wǎng)站截圖:

總結

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

相關文章

  • 基于Java字符編碼的使用詳解

    基于Java字符編碼的使用詳解

    本篇文章對Java字符編碼的使用進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • Java使用位運算實現(xiàn)加減乘除詳解

    Java使用位運算實現(xiàn)加減乘除詳解

    這篇文章主要為大家詳細介紹了Java如何使用位運算實現(xiàn)加減乘除,文中的示例代碼講解詳細,對我們深入了解Java有一定的幫助,感興趣的可以了解一下
    2023-05-05
  • 關于設置Mybatis打印調(diào)試sql的兩種方式

    關于設置Mybatis打印調(diào)試sql的兩種方式

    這篇文章主要介紹了關于設置Mybatis打印調(diào)試sql的兩種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring?BeanDefinition父子關系示例解析

    Spring?BeanDefinition父子關系示例解析

    這篇文章主要為大家介紹了Spring?BeanDefinition父子關系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 使用java實現(xiàn)百萬級別數(shù)據(jù)導出excel的三種方式

    使用java實現(xiàn)百萬級別數(shù)據(jù)導出excel的三種方式

    這篇文章主要介紹了使用java實現(xiàn)百萬級別數(shù)據(jù)導出excel的三種方式,有些業(yè)務系統(tǒng)可能動輒涉及到百萬上千萬的數(shù)據(jù),用正常的方法效率就變得很低,今天我們來看看這幾種實現(xiàn)思路
    2023-03-03
  • 使用Feign實現(xiàn)微服務間文件下載

    使用Feign實現(xiàn)微服務間文件下載

    這篇文章主要為大家詳細介紹了使用Feign實現(xiàn)微服務間文件下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java8 stream 中利用 groupingBy 進行多字段分組求和案例

    Java8 stream 中利用 groupingBy 進行多字段分組求和案例

    這篇文章主要介紹了Java8 stream 中利用 groupingBy 進行多字段分組求和案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • SpringBoot集成jjwt和使用方式

    SpringBoot集成jjwt和使用方式

    本文詳細介紹了JWT依賴(以jjwt為例)的引入和使用方法,首先,需要在項目中引入jwt依賴,隨后在Spring的啟動類application.yml中進行相應配置,最后,提供了一份完整的jwt工具類代碼,供讀者直接使用,以上內(nèi)容便是作者的個人經(jīng)驗分享,期望能為讀者提供參考并得到支持
    2024-10-10
  • maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn)

    maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn)

    這篇文章主要介紹了maven多profile 打包下 -P參和-D參數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    這篇文章主要介紹了如何利用Java語言實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細,對我們學習有一定的參考價值,快跟隨小編一起學習一下吧
    2022-06-06

最新評論