對稱密碼體制

對稱密碼:要求加密與解密使用同一個共享密鑰。故要求通信雙方必須在通信前商定密鑰並妥善保存。

對稱密碼體制分兩種:

一、流密碼:對明文的單個位(或字節)進行運算,明文加密後密文基本保持和明文同樣長度。常用流密碼算法有RC4、SEAL等。

          同步流密碼發送方和接收方在傳遞信息時同步進行加解密操作,密文內容如果在傳輸過程中被篡改刪除或者插入,會導致同步失效,解密失敗。必須重新同步來實現解密,恢復密文。如果傳輸過程中一個加密位改變,則隻影響該位的恢復,對後續密文不影響。但是,主動攻擊者可以選擇性的對密文字符進行改動,並準確知道這些改動對明文的影響。因此,同步流密碼具有同步性,無錯誤傳遞性、主動攻擊性三種特性。適用於爲音頻或視頻數據提供版權保護。

        自同步流密碼與同步流密碼相比,是一種有記憶變換的密碼。每一個密鑰與已產生的固定數量的密文位有關,密鑰由已生成的密文決定。在密文傳輸過程中如果一個密文位發生改變,該位的變化會影響到後續有限位(如n位)的密文正確解密。

 

 

二、分組密碼:將明文信息劃分成不同的組(或塊),分別對每個組(或塊)進行運算。多用於網絡加密。分組長度越長,密碼分析越困難,越不利於操作和運算,分組長度應權衡安全性與實用性。常用的有DES、AES等

 

DES算法

        DES算法將明文分組的大小爲64比特的加密區塊,再以加密區塊爲單位進行加密處理,DES使用的密鑰長度爲64比特,但由於每隔7個比特設置一個奇偶校驗位,因此其密鑰長度實際爲56比特。奇偶校驗爲最簡單的錯誤檢測碼,即根據一組二進制代碼中1的個數是奇數或偶數來檢測錯誤。最後剩下的不足一塊的大小稱爲短塊,處理方法有填充法、流密碼加密法、密文挪用技術。

        根據數據加密時每個加密區塊的關聯方式不同,可分爲四種工作模式:電子密碼本模式(Electronic Code Book,ECB)、密文鏈接模式(Cipher Book Chaining,CBC)、密文反饋模式(Cipher Feed Back, CFB) 、輸出反饋模式(Output Feed Back, OFB)。AES標準除了以上四種工作模外還推薦了一種:計數器模式(Counter,CTR)

       1、 ECB:每次加密產生獨立密文分組,每組加密結果不對別組產生影響,相同明文加密產生相同密文,無初始化向量。

              優點:簡單易行,沒有誤差傳遞的問題

              缺點:不能隱藏明文的模式,明文重複密文也會重複,對明文進行主動攻擊的可能性較高

              用途:適合加密密鑰、隨機數等短數據,例如安全傳遞DES密鑰,ECB是最適合的模式

       2、CBC: 明文加密前先與前面的密文進行異或後再加密,因此只要選擇不同的初始向量,就會產生不同的密文。

              優點:加密後的密文上下文關聯,即使明文相同密文也不同;密文內容如果被替換、刪除或在網絡傳輸中發生錯誤,後                              續密文即被破壞,無法解密還原。

              缺點:不利於計算,誤差傳遞,如果在加密的過程中發生錯誤,錯誤將會被無限放大,導致加密失敗,需要初始化向量

              用途:可加密任意長度的數據,適用於計算產生監測數據完整性的消息認證碼MAC

       3、CFB: 類似於自同步流密碼,分組加密後將密文和明文進行移位異或狗得到輸出。

                        優點:隱藏了明文的模式,分組密碼轉換爲流模式,可產生密鑰流,可及時加密傳送小於分組的數據。

                        缺點:與CBC相似,不利於並行計算,誤差傳送,需要初始化向量。

                        用途:引錯誤傳播無界,可用於檢查發現明文密文的篡改

             4、OFB: 將分組密碼作爲同步流密碼運行,沒有錯誤擴散的問題。與明文分組進行異或的輸入部分是反覆加密後得到的

                             優點:隱藏明文模式;分組密碼轉換爲流模式;無誤差傳送問題;可及時加密傳送小於分組的數據。

                             缺點:不利於進行計算,對明文的主動攻擊是可能的;安全性低於CFB

                             用途:適用於加密冗餘性較大的數據,比如語音,圖像數據;

          5、CTR: 通過將逐次累加的計數器進行加密來生成密鑰流的流密碼,在CTR模式中,每個分組對應一個逐次累加的計數器,並通過對計數器進行加密來生成密鑰流。最終的密文分組是通過將計數器加密得到的比特序列與明文分組進行XOR而得到的。

               優點:可並行計算,安全性至少與CBC一樣;加密解密僅涉及密碼算法的加密;

               缺點:沒有錯誤傳播,不易確保數據完整性

               用途:各種加密應用

 

3DES算法

3DES是DES加密算法的一種模式,它使用3條64位的密鑰對數據進行三次加密。

3DES(即Triple DES)是DES向AES過渡的加密算法(1999年,NIST將3-DES指定爲過渡的加密標準),是DES的一個更安全的變形,可以理解爲DES的升級版。它以DES爲基本模塊,通過組合分組方法設計出分組加密算法。

設Ek()和Dk()代表DES算法的加密和解密過程,Kn代表DES算法使用的密鑰,P代表明文,C代表密表,這樣,

  3DES加密過程爲:C=Ek3(Dk2(Ek1(P)))

  3DES解密過程爲:P=Dk1((EK2(Dk3(C)))

K1、K2、K3決定了算法的安全性,若三個密鑰互不相同,本質上就相當於用一個長爲168位的密鑰進行加密。多年來,它在對付強力攻擊時是比較安全的。若數據對安全性要求不那麼高,K1可以等於K3。在這種情況下,密鑰的有效長度爲112位

 

”DESede“是3DES的標籤

SecretKey secretKey = new SecretKeySpec(keys, "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
cipher.doFinal(srcs);

AES 

高級加密標準(AES,Advanced Encryption Standard)爲最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。對稱加密算法也就是加密和解密用相同的密鑰。

AES爲分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數據,直到加密完整個明文。在AES標準規範中,分組長度只能是128位,也就是說,每個分組爲16個字節(每個字節8位)。密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數也不同,如下表所示:

AES 密鑰長度(32位比特字) 分組長度(32位比特字) 加密輪數
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

jce中提供了加解密的api: 

AES支持五種模式:CBC,CFB,ECB,OFB,PCBC

private void AES(String src) {
    try {
        //生成安全密鑰
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] key = secretKey.getEncoded();
        SecretKey key1 = new SecretKeySpec(key, "AES");

        //加密
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key1);
        byte[] content = src.getBytes("utf-8");
        byte[] encodeResult = cipher.doFinal(content);
        Log.i("AES", "AESEncode:" + Convert.toHexString(encodeResult));

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, key1);
        byte[] decodeResult = cipher.doFinal(encodeResult);
        Log.i("AES", "AESDecode:" + new String(decodeResult));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章