奇妙的安全旅行之DES算法(二)

hi,你們好,上一節咱們詳細介紹了對稱加密算法DES的基本內容,因爲明文的長度不固定,而加密算法只能處理特定長度的一塊數據,因此就須要對比較長的明文進行分組後再加密,可是分組後,最後一組的長度可能又會出現位數長度不夠的狀況,因此就又須要根據填充模式來對最後一組報文進行填充。html

對稱加密的分組模式

對稱加密一共有五種分組模式,下面咱們來介紹一下。git

1. ECB - Electronic Code Book, 電子密碼本模式

優勢github

  • 簡單,效率高
  • 有利於並行計算
  • 偏差不會被傳送

缺點算法

  • 密文有規律,容易被破解
  • 可能對明文進行主動攻擊

特性segmentfault

  • 最後一個明文分組必需要填充數組

    • des/3des -> 最後一個分組填充滿8字節
    • aes -> 最後一個分組填充滿16字節
  • 不須要初始化向量

ECB

2. CBC - Cipher Block Chaining, 密碼塊鏈模式(推薦使用)

優勢安全

  • 不容易被攻擊,安全性好
  • 適合傳輸長度長的報文
  • 是SSL、IPSec的標準

缺點微信

  • 不利於並行計算
  • 偏差會傳遞
  • 須要初始化向量

特性:併發

  • 最後一個明文分組須要填充post

    • des/3des -> 最後一個分組填充滿8字節
    • aes -> 最後一個分組填充滿16字節
  • 須要一個初始化向量 - 一個數組

    • 數組的長度: 與明文分組相等
    • 數據來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同

CBC

3. CFB - Cipher FeedBack, 密文反饋模式

優勢

  • 隱藏了明文模式,密文沒有規律
  • 分組密碼轉化爲流模式
  • 能夠及時加密傳送小於分組的數據

缺點

  • 不利於並行計算
  • 偏差傳遞:一個明文單一損壞影響多個單元
  • 須要初始化向量

特性: 明文分組是和一個數據流進行的按位異或操做, 最終生成了密文

  • 須要一個初始化向量 - 一個數組

    • 數組的長度: 與明文分組相等
    • 數據來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同
  • 不須要填充

CFB

4. OFB - Output-Feedback,輸出反饋模式

優勢:

  • 隱藏了明文模式
  • 分組密碼轉化爲流模式
  • 能夠及時加密傳送小於分組的數據

缺點:

  • 不利於並行計算
  • 對明文的主動攻擊是可能的
  • 偏差傳送:一個明文單元的損壞影響多個單元

特性: 密文沒有規律,明文分組是和一個數據流進行的按位異或操做,最終生成了密文

  • 須要一個初始化向量 - 一個數組

    • 數組的長度: 與明文分組相等
    • 數據來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同
  • 不須要填充

OFB

5. CTR - CounTeR,計數器模式(重點,推薦使用)

特性

  • 密文沒有規律,明文分組是和一個數據流進行的按位異或操做,最終生成了密文
  • 不須要初始化向量
  • 不須要填充

CTR

以上五種分組模式中,ECB模式很容易被破解,現在已經不多再使用,其他四種分組模式各有千秋。
但極力推薦CBC模式和CTR模式,尤爲是CTR模式,不須要填充,代碼實現起來很方便。並且加密和解密的方法是同樣的,而且能夠實現併發分組,效率高,安全性也有保障。

關於CBC模式中的向量:

在CBC(不光是DES算法)模式下,向量iv經過隨機數(或僞隨機)機制產生是一種比較常見的方法。iv的做用主要是用於產生密文的第一個block,以使最終生成的密文產生差別(明文相同的狀況下),使密碼攻擊變得更爲困難,除此以外iv並沒有其它用途。最大的好處是,即便相同的明文,相同的密鑰,也能產生不一樣的密文。

對稱加密的填充模式

數據填充常見的通常有四種,分別是:

  • NoPadding
  • PKCS5Padding (PKCS7Padding)
  • Zero Padding
  • ISO 10126 Padding
NoPadding

API或算法自己不對數據進行處理,加密數據由加密雙方約定填補算法。例如若對字符串數據進行加解密,能夠補充\0或者空格,解密後對數據進行trim 處理。

PKCS5Padding (PKCS7Padding)

PKCS5Padding 、PKCS7Padding分別爲Java和.Net中的默認填充方式,PKCS5Padding和PKCS7Padding實際只是協議不同,根據相關資料說明,PKCS5Padding明肯定義了加密塊是8字節,PKCS7Padding加密塊能夠是1-255之間。可是封裝的DES算法默認都是8字節,因此能夠認爲他們是同樣的。數據補位實際是在數據不滿8字節的倍數,才補充到8字節的倍數的填充過程。

加密前:數據字節長度對8取餘,餘數爲m,若m>0,則補足8-m個字節,字節數值爲8-m,即差幾個字節就補幾個字節,字節數值即爲補充的字節數,若爲0則補充8個字節的8

解密後:取最後一個字節,值爲m,則從數據尾部刪除m個字節,剩餘數據即爲加密前的原文

好比:加密字符串爲爲AAA,差5個字節,則補位爲AAA55555;加密字符串爲BBBBBB,差2個字節,則補位爲BBBBBB22;加密字符串爲CCCCCCCC,差0個字節,則補位爲CCCCCCCC88888888。

Zero Padding

0填充,顧名思義就是全部不足8位的均補0,不過0填充協議並無在加密算法中標準化,並且0填充可能會有問題,當明文自己有一個或多個0字節結尾時,就很難區分是填充的0仍是原報文。

例如:下面是一個以8字節爲單位的加密塊,最後四個字節不足位時,使用0來填充

... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
ISO 10126

ISO 10126 的填充模式定義了在報文最後一個字節填充以前的字節均可以隨機填充,在最後一個字節填充總共補充的字節數。

例如: 下面例子,最後一共須要補充4個字節,前三個字節都是隨機填充的字節,最後一個字節須要填充4,表示該填充總共填充了4字節。

... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
什麼時候須要填充,什麼時候不須要填充?

觀察分組模式的圖示能夠看出,加密後再進行亦或操做的不須要填充,而先進性亦或操做再加密的則不須要填充,這是由於亦或操做須要兩個相同長度的數據,一一對比計算!

總結

以上五種分組模式中,ECB模式很容易被破解,現在已經不多再使用,其他四種分組模式各有千秋。

但極力推薦CBC模式和CTR模式,尤爲是CTR模式,不須要填充,代碼實現起來很方便。並且加密和解密的方法是同樣的,而且能夠實現併發分組,效率高,安全性也有保障

參考文章

1,對稱加密算法經常使用的五種分組模式(ECB/CBC/CFB/OFB/CTR)

2,DES填充方式與初始向量IV的做用

3,DES算法的幾種加密模式和填補方式

關於做者
聯繫做者
  • 微信號:ForTheDeveloper
  • 公衆號:ForTheDevelopers
相關文章
相關標籤/搜索