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

Java實(shí)現(xiàn)SM3加密和驗(yàn)證的示例代碼

 更新時(shí)間:2023年12月19日 11:26:36   作者:共飲一杯無(wú)  
在商用密碼體系中,SM3主要用于數(shù)字簽名及驗(yàn)證、消息認(rèn)證碼生成及驗(yàn)證、隨機(jī)數(shù)生成等,其算法公開,本文給大家詳細(xì)介紹了使用Java實(shí)現(xiàn)SM3加密和驗(yàn)證,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下

需要引入如下坐標(biāo)依賴:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

自定義密鑰加密及校驗(yàn)

加密

	private static final String ENCODING = "UTF-8";
    /**
     * 加密
     *
     * @param src 明文
     * @param key 密鑰
     * @return
     * @throws Exception
     */
    public static String encrypt(String src, String key) throws Exception {
        return ByteUtils.toHexString(getEncryptByKey(src, key));
    }


    /**
     * SM3加密方式之: 根據(jù)自定義密鑰進(jìn)行加密,返回加密后長(zhǎng)度為32位的16進(jìn)制字符串
     *
     * @param src 源數(shù)據(jù)
     * @param key 密鑰
     * @return
     * @throws Exception
     */
    public static byte[] getEncryptByKey(String src, String key) throws Exception {
        byte[] srcByte = src.getBytes(ENCODING);
        byte[] keyByte = key.getBytes(ENCODING);
        KeyParameter keyParameter = new KeyParameter(keyByte);
        SM3Digest sm3 = new SM3Digest();
        HMac hMac = new HMac(sm3);
        hMac.init(keyParameter);
        hMac.update(srcByte, 0, srcByte.length);
        byte[] result = new byte[hMac.getMacSize()];
        hMac.doFinal(result, 0);
        return result;
    }

校驗(yàn)

    /**
     * 利用源數(shù)據(jù)+密鑰校驗(yàn)與密文是否一致
     *
     * @param src       源數(shù)據(jù)
     * @param key       密鑰
     * @param sm3HexStr 密文
     * @return
     * @throws Exception
     */
    public static boolean verify(String src, String key, String sm3HexStr) throws Exception {
        byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
        byte[] newHashCode = getEncryptByKey(src, key);
        return Arrays.equals(newHashCode, sm3HashCode);
    }

無(wú)密鑰的加密及校驗(yàn)

加密

    /**
     * SM3加密方式之:不提供密鑰的方式 SM3加密,返回加密后長(zhǎng)度為64位的16進(jìn)制字符串
     *
     * @param src 明文
     * @return
     */
    public static String encrypt(String src) {
        return ByteUtils.toHexString(getEncryptBySrcByte(src.getBytes()));
    }

    /**
     * 返回長(zhǎng)度為32位的加密后的byte數(shù)組
     *
     * @param srcByte
     * @return
     */
    public static byte[] getEncryptBySrcByte(byte[] srcByte) {
        SM3Digest sm3 = new SM3Digest();
        sm3.update(srcByte, 0, srcByte.length);
        byte[] encryptByte = new byte[sm3.getDigestSize()];
        sm3.doFinal(encryptByte, 0);
        return encryptByte;
    }

校驗(yàn)

    /**
     * 校驗(yàn)源數(shù)據(jù)與加密數(shù)據(jù)是否一致
     *
     * @param src       源數(shù)據(jù)
     * @param sm3HexStr 16進(jìn)制的加密數(shù)據(jù)
     * @return
     * @throws Exception
     */
    public static boolean verify(String src, String sm3HexStr) throws Exception {
        byte[] sm3HashCode = ByteUtils.fromHexString(sm3HexStr);
        byte[] newHashCode = getEncryptBySrcByte(src.getBytes(ENCODING));
        return Arrays.equals(newHashCode, sm3HashCode);
    }

測(cè)試驗(yàn)證

public static void main(String[] args) throws Exception {
        String srcStr = "今天天氣很晴朗";
        String key = "zjqzjq";
        // ******************************自定義密鑰加密及校驗(yàn)*****************************************
        String hexStrByKey = SM3Utils.encrypt(srcStr, key);
        System.out.println("帶密鑰加密后的密文:" + hexStrByKey);

        System.out.println("明文(帶密鑰)與密文校驗(yàn)結(jié)果:" + SM3Utils.verify(srcStr, key, hexStrByKey));

        // ******************************無(wú)密鑰的加密及校驗(yàn)******************************************
        String hexStrNoKey = SM3Utils.encrypt(srcStr);
        System.out.println("不帶密鑰加密后的密文:" + hexStrNoKey);

        System.out.println("明文(不帶密鑰)與密文校驗(yàn)結(jié)果:" + SM3Utils.verify(srcStr, hexStrNoKey));

    }

結(jié)果輸出如下:

以上就是Java實(shí)現(xiàn)SM3加密和驗(yàn)證的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Java實(shí)現(xiàn)SM3加密和驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用IDEA配置Mybatis-Plus框架圖文詳解

    使用IDEA配置Mybatis-Plus框架圖文詳解

    這篇文章主要介紹了使用IDEA配置Mybatis-Plus框架,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot整合Redis使用@Cacheable和RedisTemplate

    SpringBoot整合Redis使用@Cacheable和RedisTemplate

    本文主要介紹了SpringBoot整合Redis使用@Cacheable和RedisTemplate,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java文件(io)編程_基于File類的基本用法(必看篇)

    Java文件(io)編程_基于File類的基本用法(必看篇)

    下面小編就為大家?guī)?lái)一篇Java文件(io)編程_基于File類的基本用法(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java封裝好的mail包發(fā)送電子郵件的類

    Java封裝好的mail包發(fā)送電子郵件的類

    本文給大家分享了2個(gè)java封裝好的mail包發(fā)送電子郵件的類,并附上使用方法,小伙伴們可以根據(jù)自己的需求自由選擇。
    2016-01-01
  • 深入探究如何使用Java編寫MapReduce程序

    深入探究如何使用Java編寫MapReduce程序

    MapReduce是一種用于處理大規(guī)模數(shù)據(jù)集的并行編程模型,其特點(diǎn)高效性和可擴(kuò)展性,在本文中,我們將深入了解MapReduce,并使用Java編寫一個(gè)簡(jiǎn)單的MapReduce程序,需要的朋友可以參考下
    2023-05-05
  • springboot整合shiro的過(guò)程詳解

    springboot整合shiro的過(guò)程詳解

    Shiro 是一個(gè)強(qiáng)大的簡(jiǎn)單易用的 Java 安全框架,主要用來(lái)更便捷的 認(rèn)證,授權(quán),加密,會(huì)話管理,這篇文章給大家詳細(xì)介紹Shiro 工作原理及架構(gòu)圖,通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-10-10
  • Olingo分析和實(shí)踐之OData框架核心組件初始化(關(guān)鍵步驟)

    Olingo分析和實(shí)踐之OData框架核心組件初始化(關(guān)鍵步驟)

    ODataSpringBootService通過(guò)初始化OData實(shí)例和服務(wù)元數(shù)據(jù),構(gòu)建框架核心能力與數(shù)據(jù)模型結(jié)構(gòu),實(shí)現(xiàn)序列化、URI解析及URL映射,為請(qǐng)求處理提供基礎(chǔ)支撐,本文給大家介紹Olingo分析和實(shí)踐之OData框架核心組件初始化,感興趣的朋友一起看看吧
    2025-07-07
  • 利用Redis實(shí)現(xiàn)延時(shí)處理的方法實(shí)例

    利用Redis實(shí)現(xiàn)延時(shí)處理的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于利用Redis實(shí)現(xiàn)延時(shí)處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼)

    Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼)

    這篇文章主要介紹了Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java騷操作之CountDownLatch代碼詳解

    Java騷操作之CountDownLatch代碼詳解

    這篇文章主要介紹了Java騷操作之CountDownLatch代碼詳解,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

无棣县| 额敏县| 内黄县| 井研县| 桐梓县| 钟山县| 苗栗县| 和林格尔县| 上栗县| 肇东市| 壤塘县| 太仆寺旗| 磐安县| 桐庐县| 旅游| 绥宁县| 阜城县| 平江县| 长顺县| 南木林县| 奉节县| 健康| 巴林左旗| 聂拉木县| 如皋市| 界首市| 嵊州市| 蓬莱市| 新乡县| 柘荣县| 敦化市| 福建省| 额尔古纳市| 日照市| 特克斯县| 泽库县| 马山县| 江门市| 凤冈县| 淮阳县| 客服|