国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

國密算法 SM4 加解密 java 工具類

這篇具有很好參考價值的文章主要介紹了國密算法 SM4 加解密 java 工具類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?? 博主簡介:知名開發(fā)工程師
?? 出沒地點:北京
?? 2023年目標:成為一個大佬
———————————————————————————————————————————
版權聲明:本文為原創(chuàng)文章,如需轉載須注明出處,喜歡可收藏!

一. 前言

我國國家密碼管理局陸續(xù)發(fā)布了一系列國產加密算法,這其中就包括 SM1、SM2、SM3 、SM4、SM7、SM9、ZUC(祖沖之加密算法)等,SM 代表商密,即商業(yè)密碼,是指用于商業(yè)的、不涉及國家秘密的密碼技術。SM1 和 SM7 的算法不公開,其余算法都已成為 ISO/IEC 國際標準。

在這些國產加密算法中,SM2、SM3、SM4 三種加密算法是比較常見的。

算法 名稱 應用領域 特點
SM1 對稱(分組)加密算法 芯片 分組長度、鑰長度均為128比特
SM2 非對稱(基于橢圓曲線ECC)加密算法 數據加密 ECC橢圓曲線密碼機制256位,相比RSA處理速度快,消耗更少
SM3 散列(hash)函數算法 完整性校驗 安全性及效率與SHA-256相當,壓縮函數更復雜
SM4 對稱(分組)加密算法 數據加密和局域網產品 分組長度、密鑰長度均為128比特,計算輪數多
SM7 對稱(分組)加密算法 非接觸式IC卡 分組長度、鑰長度均為128比特
SM9 標識加密算法(IBE) 端對端離線安全通訊 加密強度等同于3072位密鑰的RSA加密算法
ZUC 對稱(序列)加密算法 移動通信4G網絡 流密碼

對稱算法 SM4 支持加解密,可替代 AES 等算法使用

二. 工具類

首選引入依賴,支持 java8文章來源地址http://www.zghlxwxcb.cn/news/detail-672618.html

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.56</version>
</dependency>
/**
 * @Author zhoumengjun
 * @Description sm4加密算法工具類
 * @Date 2023/7/12 10:47
 */
public class SM4Util {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    private static final String ENCODING = "UTF-8";
    public static final String ALGORITHM_NAME = "SM4";
    // 加密算法/分組加密模式/分組填充方式
    // PKCS5Padding-以8個字節(jié)為一組進行分組加密
    // 定義分組加密模式使用:PKCS5Padding
    public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
    // 128-32位16進制;256-64位16進制
    public static final int DEFAULT_KEY_SIZE = 128;

    /**
     * 生成ECB暗號
     *
     * @param algorithmName 算法名稱
     * @param mode          模式
     * @param key
     * @return
     * @throws Exception
     * @explain ECB模式(電子密碼本模式:Electronic codebook)
     */
    private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
        Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
        cipher.init(mode, sm4Key);
        return cipher;
    }

    /**
     * 自動生成密鑰
     *
     * @return
     * @throws NoSuchAlgorithmException
     * @throws NoSuchProviderException
     * @explain
     */
    public static String generateKey() throws Exception {
        return new String(Hex.encode(generateKey(DEFAULT_KEY_SIZE)));
    }

    /**
     * @param keySize
     * @return
     * @throws Exception
     * @explain
     */
    public static byte[] generateKey(int keySize) throws Exception {
        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);
        kg.init(keySize, new SecureRandom());
        return kg.generateKey().getEncoded();
    }

    /**
     * sm4加密
     *
     * @param hexKey   16進制密鑰(忽略大小寫)
     * @param paramStr 待加密字符串
     * @return 返回16進制的加密字符串
     * @throws Exception
     * @explain 加密模式:ECB
     * 密文長度不固定,會隨著被加密字符串長度的變化而變化
     */
    public static String encryptEcb(String hexKey, String paramStr) throws Exception {
        String cipherText = "";
        // 16進制字符串-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // String-->byte[]
        byte[] srcData = paramStr.getBytes(ENCODING);
        // 加密后的數組
        byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);
        // byte[]-->hexString
        cipherText = ByteUtils.toHexString(cipherArray);
        return cipherText;
    }

    /**
     * 加密模式之Ecb
     *
     * @param key
     * @param data
     * @return
     * @throws Exception
     * @explain
     */
    public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(data);
    }

    /**
     * sm4解密
     *
     * @param hexKey     16進制密鑰
     * @param cipherText 16進制的加密字符串(忽略大小寫)
     * @return 解密后的字符串
     * @throws Exception
     * @explain 解密模式:采用ECB
     */
    public static String decryptEcb(String hexKey, String cipherText) throws Exception {
        // 用于接收解密后的字符串
        String decryptStr = "";
        // hexString-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // hexString-->byte[]
        byte[] cipherData = ByteUtils.fromHexString(cipherText);
        // 解密
        byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);
        // byte[]-->String
        decryptStr = new String(srcData, ENCODING);
        return decryptStr;
    }

    /**
     * 解密
     *
     * @param key
     * @param cipherText
     * @return
     * @throws Exception
     */
    public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {
        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(cipherText);
    }

    /**
     * 校驗加密前后的字符串是否為同一數據
     *
     * @param hexKey     16進制密鑰(忽略大小寫)
     * @param cipherText 16進制加密后的字符串
     * @param paramStr   加密前的字符串
     * @return 是否為同一數據
     * @throws Exception
     */
    public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception {
        // 用于接收校驗結果
        boolean flag = false;
        // hexString-->byte[]
        byte[] keyData = ByteUtils.fromHexString(hexKey);
        // 將16進制字符串轉換成數組
        byte[] cipherData = ByteUtils.fromHexString(cipherText);
        // 解密
        byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData);
        // 將原字符串轉換成byte[]
        byte[] srcData = paramStr.getBytes(ENCODING);
        // 判斷2個數組是否一致
        flag = Arrays.equals(decryptData, srcData);
        return flag;
    }

    public static void main(String[] args) {
        try {
            String data = "2023-07-12,下午三點";
            //生成key
            String key = generateKey();
            System.out.println("key:" + key);
            //加密
            String cipher = SM4Util.encryptEcb(key, data);
            System.out.println("加密后:"+cipher);
            //判斷是否正確
            System.out.println(SM4Util.verifyEcb(key, cipher, data));// true
            //解密
            String res = SM4Util.decryptEcb(key, cipher);
            System.out.println("解密后:"+res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到了這里,關于國密算法 SM4 加解密 java 工具類的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 國密算法SM2/3/4簡單比較,以及基于Java的SM4(ECB模式,CBC模式)對稱加解密實現

    常用的國密算法包含SM2,SM3,SM4。以下針對每個算法使用場景進行說明以比較其差異 SM2:非對稱加密算法,可以替代RSA 數字簽名,SM2為非對稱加密,加解密使用一對私鑰和公鑰,只有簽名發(fā)行者擁有私鑰,可用于加密,其他需要驗證解密或驗簽者使用公鑰進行。如果使用公

    2024年04月13日
    瀏覽(24)
  • java實現國密SM4的加密和解密方式(即時通訊的消息對話加密采用SM2還是SM4)

    java實現國密SM4的加密和解密方式(即時通訊的消息對話加密采用SM2還是SM4)

    1.對于即時通訊的消息對話加密采用SM2還是SM4更合適? 對于即時通訊的消息對話加密,建議采用SM4對稱加密算法,而不是SM2非對稱加密算法。 SM2主要用于數字簽名和密鑰交換,其加密速度比SM4慢,而且SM2不太適合對長消息進行加密,因為它只能對比較短的數據塊進行加密,這

    2024年02月07日
    瀏覽(101)
  • 基于hutool 封裝國密sm2,sm4 加解密算法

    基于hutool 封裝國密sm2,sm4 加解密算法 1. 加入依賴包 2. 編碼

    2024年02月13日
    瀏覽(25)
  • 國密算法SM2,SM3,SM4-java實現原理

    國密算法SM2,SM3,SM4-java實現原理

    SM2是國家密碼管理局于2010年12月17日發(fā)布的橢圓曲線公鑰密碼算法,基于ECC。其簽名速度與秘鑰生成速度都快于RSA,非對稱加密,該算法已公開 SM3是中華人民共和國政府采用的一種密碼散列函數標準,由國家密碼管理局于2010年12月17日發(fā)布。SM3主要用數字簽名及驗證、消息認

    2024年02月13日
    瀏覽(39)
  • 醫(yī)保移動支付加密解密請求工具封裝【國密SM2SM4】

    醫(yī)保移動支付加密解密請求工具封裝【國密SM2SM4】

    醫(yī)保移動支付加密解密請求工具封裝 定點醫(yī)藥機構向地方移動支付中心發(fā)起費用明細上傳、支付下單、醫(yī)保退費等交易時需要發(fā)送密文,由于各大醫(yī)療機構廠商的開發(fā)語各不相同,可能要有java的、c#的、python的、pb的、nodjs的、php的、還可能有Delphi的等。。。。很多開發(fā)語言

    2024年01月21日
    瀏覽(123)
  • 【IC卡 國密SM4算法 密鑰分散,加解密,MAC計算】

    在這里記錄一下工作中調查國密算法SM4過程中掌握的心得體會。 對基于 SM4 的分散算法的描述。 密鑰分散算法簡稱 Diversify,是指將一個雙長度的密鑰 MK,對分散數據進行處理,推導出雙長度的密鑰 DK。 將分散數據的 8 個字節(jié),作為輸入數據的左半部分: 將分散數據的 8 個字

    2024年02月07日
    瀏覽(76)
  • 使用 Java Bouncy Castle實現國密算法SM4、SM3以及SM2的加密

    使用 Java Bouncy Castle實現國密算法SM4、SM3以及SM2的加密

    國密算法的實現借助了Java庫函數 Bouncy Castle,加密庫安裝使用教程請參考鏈接 SM4,又稱為商密算法,是一種分組密碼算法,于2012年由中國密碼技術研究中心(中國密碼學會成員)發(fā)布,目前已成為我國國家密碼算法,并在多個領域得到了廣泛的應用。SM4算法采用了32輪迭代結

    2024年02月16日
    瀏覽(34)
  • JAVA集成國密SM4

    JAVA集成國密SM4

    國密算法概述:https://blog.csdn.net/qq_38254635/article/details/131801527 SM4對稱算法 SM4 無線局域網標準的分組數據算法。對稱加密,密鑰長度和分組長度均為128位 ConfigBean.java ProviderSingleton.java SecretCommon.java Utils.java 測試類:Test.java 使用方法參考測試類即可。 使用KeyGenerator構建的秘鑰長

    2024年02月10日
    瀏覽(18)
  • SpringBoot實現國密SM4加密、解密

    SM4.0(原名SMS4.0)是中華人民共和國政府采用的一種分組密碼標準,由國家密碼管理局于2012年3月21日發(fā)布。相關標準為“GM/T 0002-2012《SM4分組密碼算法》(原SMS4分組密碼算法)”。 在商用密碼體系中,SM4主要用于數據加密,其算法公開,分組長度與密鑰長度均為128bit,加密算

    2024年02月07日
    瀏覽(93)
  • 前端使用國密SM4進行加密、解密

    前端使用國密SM4進行加密、解密

    前端/后端使用 國密SM4 進行加密/解密, 【注意】前后端配合加解密時,需要我們 自定義密鑰 ,一般由后端提供 下載 sm4util 依賴 sm4util 依賴使用說明 使用 - ECB 模式加解密 后端代碼參考:https://blog.csdn.net/qq_48922459/article/details/122130283 這種辦法好像只能使用默認密鑰 key,不能

    2023年04月23日
    瀏覽(104)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包