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

Java中的對稱加密詳解

 更新時間:2022年01月26日 14:36:56   作者:路和遠方  
大家好,本篇文章主要講的是Java中的對稱加密詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。

常見的對稱加密方法

DES : Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。

AES : Advanced Encryption Standard, 高級加密標準 .在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區(qū)塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

代碼案例

byte[] 和16進制字符串相互轉換

private byte[] hexStringToBytes(String hexString) {
    if (hexString.length() % 2 != 0) throw new IllegalArgumentException("hexString length not valid");
    int length = hexString.length() / 2;
    byte[] resultBytes = new byte[length];
    for (int index = 0; index < length; index++) {
        String result = hexString.substring(index * 2, index * 2 + 2);
        resultBytes[index] = Integer.valueOf(Integer.parseInt(result, 16)).byteValue();
    }
    return resultBytes;
}
private String bytesToHexString(byte[] sources) {
    if (sources == null) return null;
    StringBuilder stringBuffer = new StringBuilder();
    for (byte source : sources) {
        String result = Integer.toHexString(source& 0xff);
        if (result.length() < 2) {
            result = "0" + result;
        }
        stringBuffer.append(result);
    }
    return stringBuffer.toString();
}

DES 加密和解密

private String encryptByDES(String input,String key) throws Exception {
    // 算法
    String algorithm = "DES";
    String transformation = "DES";
    // Cipher:密碼,獲取加密對象
    // transformation:參數表示使用什么類型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘鑰規(guī)則
    // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是8位
    // 第二個參數表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 對加密進行初始化
    // 第一個參數:表示模式,有加密模式和解密模式
    // 第二個參數:表示秘鑰規(guī)則
    cipher.init(Cipher.ENCRYPT_MODE,sks);
    // 進行加密
    byte[] bytes = cipher.doFinal(input.getBytes());
    return bytesToHexString(bytes);
}

private String decryptByDES(String input,String key)throws Exception{
    // 算法
    String algorithm = "DES";
    String transformation = "DES";
    // Cipher:密碼,獲取加密對象
    // transformation:參數表示使用什么類型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘鑰規(guī)則
    // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是8位
    // 第二個參數表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 對加密進行初始化
    // 第一個參數:表示模式,有加密模式和解密模式
    // 第二個參數:表示秘鑰規(guī)則
    cipher.init(Cipher.DECRYPT_MODE,sks);
    // 進行解密
    byte [] inputBytes = hexStringToBytes(input);
    byte[] bytes = cipher.doFinal(inputBytes);
    return new String(bytes);
 }

AES 加密和解密

private String encryptByAES(String input,String key) throws Exception {
    // 算法
    String algorithm = "AES";
    String transformation = "AES";
    // Cipher:密碼,獲取加密對象
    // transformation:參數表示使用什么類型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘鑰規(guī)則
    // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是16位
    // 第二個參數表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 對加密進行初始化
    // 第一個參數:表示模式,有加密模式和解密模式
    // 第二個參數:表示秘鑰規(guī)則
    cipher.init(Cipher.ENCRYPT_MODE,sks);
    // 進行加密
    byte[] bytes = cipher.doFinal(input.getBytes());
    return bytesToHexString(bytes);
}

private String decryptByAES(String input,String key)throws Exception{
    // 算法
    String algorithm = "AES";
    String transformation = "AES";
    // Cipher:密碼,獲取加密對象
    // transformation:參數表示使用什么類型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘鑰規(guī)則
    // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是16位
    // 第二個參數表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 對加密進行初始化
    // 第一個參數:表示模式,有加密模式和解密模式
    // 第二個參數:表示秘鑰規(guī)則
    cipher.init(Cipher.DECRYPT_MODE,sks);
    // 進行解密
    byte [] inputBytes = hexStringToBytes(input);
    byte[] bytes = cipher.doFinal(inputBytes);
    return new String(bytes);
}

加密模式

ECB

Electronic codebook, 電子密碼本. 需要加密的消息按照塊密碼的塊大小被分為數個塊,并對每個塊進行獨立加密

在這里插入圖片描述

優(yōu)點:并行加密,速度快
缺點:同樣的明文,加密成同樣的密文,容易被破解,不利于安全保護
CBC

在這里插入圖片描述

優(yōu)點:同樣的原文生成不同的密文
缺點:串行處理,速度慢

注意: 需要一個初始的向量值IV

填充模式

當需要按塊處理的數據, 數據長度不符合塊處理需求時, 按照一定的方法填充滿塊長的規(guī)則

NoPadding
不填充.
在DES加密算法下, 要求原文長度必須是8byte的整數倍
在AES加密算法下, 要求原文長度必須是16byte的整數倍PKCS5Padding
數據塊的大小為8位, 不夠就補足

注意
默認情況下, 加密模式和填充模式為 : ECB/PKCS5Padding
如果使用CBC模式, 在初始化Cipher對象時, 需要增加參數, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());

加密模式和填充模式

AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)

使用加密模式和填充模式的案例

    private String encryptByAES(String input,String key) throws Exception {
        // 算法
        String algorithm = "AES";
        String transformation = "AES/CBC/PKCS5Padding";
        // Cipher:密碼,獲取加密對象
        // transformation:參數表示使用什么類型加密
        Cipher cipher = Cipher.getInstance(transformation);
        // 指定秘鑰規(guī)則
        // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是16位
        // 第二個參數表示:算法
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        // 初始向量值長度必須是16位
        String ivStr = "2222222222222221";
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        // 對加密進行初始化
        // 第一個參數:表示模式,有加密模式和解密模式
        // 第二個參數:表示秘鑰規(guī)則
        cipher.init(Cipher.ENCRYPT_MODE,sks,iv);
        // 進行加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        return bytesToHexString(bytes);
    }

    private String decryptByAES(String input,String key)throws Exception{
        // 算法
        String algorithm = "AES";
        String transformation = "AES/CBC/PKCS5Padding";
        // Cipher:密碼,獲取加密對象
        // transformation:參數表示使用什么類型加密
        Cipher cipher = Cipher.getInstance(transformation);
        // 指定秘鑰規(guī)則
        // 第一個參數表示:密鑰,key的字節(jié)數組 長度必須是16位
        // 第二個參數表示:算法
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        // 初始向量值長度必須是16位
        String ivStr = "2222222222222221";
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        // 對加密進行初始化
        // 第一個參數:表示模式,有加密模式和解密模式
        // 第二個參數:表示秘鑰規(guī)則
        cipher.init(Cipher.DECRYPT_MODE,sks,iv);
        // 進行解密
        byte [] inputBytes = hexStringToBytes(input);
        byte[] bytes = cipher.doFinal(inputBytes);
        return new String(bytes);
    }

總結

到此這篇關于Java中的對稱加密詳解的文章就介紹到這了,更多相關Java對稱加密內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Dom4j解析xml復雜多節(jié)點報文方式

    Dom4j解析xml復雜多節(jié)點報文方式

    這篇文章主要介紹了Dom4j解析xml復雜多節(jié)點報文方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • spring?data?jpa如何使用自定義repository實現類

    spring?data?jpa如何使用自定義repository實現類

    這篇文章主要介紹了spring?data?jpa如何使用自定義repository實現類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中的Semaphore信號量詳解

    Java中的Semaphore信號量詳解

    這篇文章主要介紹了Java中的Semaphore信號量詳解,Semaphore(信號量)是用來控制同時訪問特定資源的線程數量,通過協調各個線程以保證合理地使用公共資源,需要的朋友可以參考下
    2023-12-12
  • SpringBoot整合Apache?Pulsar教程示例

    SpringBoot整合Apache?Pulsar教程示例

    這篇文章主要為大家介紹了SpringBoot整合Apache?Pulsar教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 詳解IntelliJ IDEA中TortoiseSVN修改服務器地址的方法

    詳解IntelliJ IDEA中TortoiseSVN修改服務器地址的方法

    這篇文章主要介紹了詳解IntelliJ IDEA中TortoiseSVN修改服務器地址的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java動態(tài)代理機制詳解_動力節(jié)點Java學院整理

    Java動態(tài)代理機制詳解_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Java動態(tài)代理機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 基于jmeter實現跨線程組傳遞token過程圖解

    基于jmeter實現跨線程組傳遞token過程圖解

    這篇文章主要介紹了基于jmeter實現跨線程組傳遞token,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java class文件格式之特殊字符串_動力節(jié)點Java學院整理

    Java class文件格式之特殊字符串_動力節(jié)點Java學院整理

    特殊字符串出現在class文件中的常量池中,本著循序漸進和減少跨度的原則, 首先把class文件中的特殊字符串做一個詳細的介紹, 然后再回過頭來繼續(xù)講解常量池,對java class 文件格式相關知識感興趣的的朋友一起學習吧
    2017-06-06
  • Java字符拼接成字符串的注意點詳解

    Java字符拼接成字符串的注意點詳解

    這篇文章主要介紹了Java字符拼接成字符串的注意點詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 基于jenkins實現發(fā)布node.js項目

    基于jenkins實現發(fā)布node.js項目

    這篇文章主要介紹了基于jenkins實現發(fā)布node.js項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07

最新評論

泰顺县| 长岭县| 铜鼓县| 朝阳市| 门头沟区| 曲阜市| 舞阳县| 福安市| 罗江县| 辽源市| 红河县| 永定县| 延川县| 新沂市| 郓城县| 历史| 长寿区| 元朗区| 南昌县| 民权县| 陆良县| 宕昌县| 肥乡县| 永泰县| 乳山市| 崇仁县| 太湖县| 眉山市| 平潭县| 克东县| 霍城县| 库车县| 江北区| 霍山县| 大港区| 宾阳县| 积石山| 齐河县| 定边县| 河北省| 石楼县|