hi,你們好,上一節咱們詳細介紹了對稱加密算法DES的基本內容,因爲明文的長度不固定,而加密算法只能處理特定長度的一塊數據,因此就須要對比較長的明文進行分組後再加密,可是分組後,最後一組的長度可能又會出現位數長度不夠的狀況,因此就又須要根據填充模式來對最後一組報文進行填充。html
對稱加密一共有五種分組模式,下面咱們來介紹一下。git
優勢:github
缺點:算法
特性:segmentfault
最後一個明文分組必需要填充數組
優勢:安全
缺點:微信
特性:併發
最後一個明文分組須要填充post
須要一個初始化向量 - 一個數組
優勢:
缺點:
特性: 明文分組是和一個數據流進行的按位異或操做, 最終生成了密文
須要一個初始化向量 - 一個數組
優勢:
缺點:
特性: 密文沒有規律,明文分組是和一個數據流進行的按位異或操做,最終生成了密文
須要一個初始化向量 - 一個數組
特性:
以上五種分組模式中,ECB模式很容易被破解,現在已經不多再使用,其他四種分組模式各有千秋。
但極力推薦CBC模式和CTR模式,尤爲是CTR模式,不須要填充,代碼實現起來很方便。並且加密和解密的方法是同樣的,而且能夠實現併發分組,效率高,安全性也有保障。
關於CBC模式中的向量:
在CBC(不光是DES算法)模式下,向量iv經過隨機數(或僞隨機)機制產生是一種比較常見的方法。iv的做用主要是用於產生密文的第一個block,以使最終生成的密文產生差別(明文相同的狀況下),使密碼攻擊變得更爲困難,除此以外iv並沒有其它用途。最大的好處是,即便相同的明文,相同的密鑰,也能產生不一樣的密文。
數據填充常見的通常有四種,分別是:
API或算法自己不對數據進行處理,加密數據由加密雙方約定填補算法。例如若對字符串數據進行加解密,能夠補充\0或者空格,解密後對數據進行trim 處理。
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。
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 的填充模式定義了在報文最後一個字節填充以前的字節均可以隨機填充,在最後一個字節填充總共補充的字節數。
例如: 下面例子,最後一共須要補充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)