奇妙的安全旅行之DES算法(二)
hi,大家好,上一節我們詳細介紹了對稱加密算法DES的基本內容,由于明文的長度不固定,而加密算法只能處理特定長度的一塊數據,所以就需要對比較長的明文進行分組后再加密,但是分組后,最后一組的長度可能又會出現位數長度不夠的情況,所以就又需要根據填充模式來對最后一組報文進行填充。
對稱加密的分組模式
對稱加密一共有五種分組模式,下面我們來介紹一下。
1. ECB - Electronic Code Book, 電子密碼本模式
優點:
- 簡單,效率高
- 有利于并行計算
- 誤差不會被傳送
缺點:
-
密文有規律,容易被破解
-
可能對明文進行主動攻擊
特性:
- 最后一個明文分組必須要填充
- des/3des -> 最后一個分組填充滿8字節
- aes -> 最后一個分組填充滿16字節
- 不需要初始化向量
2. CBC - Cipher Block Chaining, 密碼塊鏈模式(推薦使用)
優點:
- 不容易被攻擊,安全性好
- 適合傳輸長度長的報文
- 是SSL、IPSec的標準
缺點:
- 不利于并行計算
- 誤差會傳遞
- 需要初始化向量
特性:
- 最后一個明文分組需要填充
- des/3des -> 最后一個分組填充滿8字節
- aes -> 最后一個分組填充滿16字節
- 需要一個初始化向量 - 一個數組
- 數組的長度: 與明文分組相等
- 數據來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
3. CFB - Cipher FeedBack, 密文反饋模式
優點:
- 隱藏了明文模式,密文沒有規律
- 分組密碼轉化為流模式
- 可以及時加密傳送小于分組的數據
缺點:
- 不利于并行計算
- 誤差傳遞:一個明文單一損壞影響多個單元
- 需要初始化向量
特性: 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
- 需要一個初始化向量 - 一個數組
- 數組的長度: 與明文分組相等
- 數據來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
- 不需要填充
4. OFB - Output-Feedback,輸出反饋模式
優點:
- 隱藏了明文模式
- 分組密碼轉化為流模式
- 可以及時加密傳送小于分組的數據
缺點:
- 不利于并行計算
- 對明文的主動攻擊是可能的
- 誤差傳送:一個明文單元的損壞影響多個單元
特性: 密文沒有規律,明文分組是和一個數據流進行的按位異或操作,最終生成了密文
- 需要一個初始化向量 - 一個數組
- 數組的長度: 與明文分組相等
- 數據來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
- 不需要填充
5. CTR - CounTeR,計數器模式(重點,推薦使用)
特性:
- 密文沒有規律,明文分組是和一個數據流進行的按位異或操作,最終生成了密文
- 不需要初始化向量
- 不需要填充
以上五種分組模式中,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算法的幾種加密模式和填補方式
歡迎大家關注「我是開發者FTD」公眾號,微信號:ForTheDevelopers
也歡迎大家添加我的個人微信交流,微信號:ForTheDeveloper
關注開發,更關注開發者!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的奇妙的安全旅行之DES算法(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩阵 II : 线性组的线性相关性
- 下一篇: IBinder获取手机服务信息异常