在設計安全協議或其他使用加解密演算法的場景中,經常會用到AES演算法,關于在什么樣的場景下使用AES可能不是一個值得深入討論的問題,但是在如何選擇加密模式的問題上,筆者認為需要反復思量,
知所先后,則近道矣!
想要區分不同加密模式的適用場景,首先需要對加密模式的原理有一定的了解,而要想了解加密模式,最合適的切入點便是最原始、最簡單的ECB模式,

(圖片來自維基百科)
ECB模式全程電子密碼本模式,其原理如上圖所示,使用ECB模式,首先需要將明文分組,每個分組長度與密鑰Key的長度相同,然后每個分組使用相同的密鑰進行AES加密,在了解了ECB模式的基本原理之后,我們至少應該提出如下兩個問題:
1)明文為什么要分組?
2)何為加密模式?
之所以要對明文進行分組,是因為AES只能加密固定長度的資料,為16個位元組,128個位元位,所以我們對明文進行分組,就是將明文資料分割成固定的長度,以滿足AES對輸入資料的要求,這也引出了我們需要思考的第三個問題:
3)最后一個分組不足16個位元組的時候怎么辦?
答案是填充,將最后一個分組填充為16個位元組長度,關于填充的方式,筆者打算寫一篇專題進行討論,但本文不打算就此展開,(實際上,當最后一個分組長度剛好為16位元組時,也會進行填充,即增加一個分組的填充)
在回答完第一個問題和第三個問題之后,我們自然可以推匯出第二個問題的答案——加密模式就是在進行加解密計算的程序中,對明文和相關資訊進行處理的方式,
現在我們對分組加密模式有了初步的認識,但是這還遠遠不夠,因為分組加密模式多達十幾二十種,我們僅僅了解了最原始的ECB模式,話說至此,問題又來了:
4)為什么需要這么多的加密模式?ECB不夠香嗎?
從前,車馬很慢,書信很遠,一生只夠愛一人,如今,高鐵飛快,微信咫尺,一天能約幾個妹,車馬當然不香了,所有落后了的技術,都將被新的技術以效率、安全和方便的名義取而代之,
ECB被取而代之的重要名目就是不夠安全,因為每個分組的加密方式和Key完全相同,在明文相同的情況下,密文將會完全一樣,這便是攻擊者手里的刀,防御者眼里的沙子,當然需要改進,而CBC就是ECB的改進版本,

(圖片來自維基百科)
CBC全稱密文分組鏈接模式,在CBC模式中,明文分組不會直接進行加密,而是經過一次異或之后再進入加密流程,第一個分組的明文與初始向量(IV)進行異或,然后使用AES加密,加密的結果與下一個明文分組異或,如此向下進行鏈式傳導,因為在演算法中引入了IV,相同的明文不再會得到相同的密文,安全性得到了很大的提升,CBC模式也因此成為最常用的分組加密模式,
甘瓜苦蒂,天下物無全美!
CBC也不是萬能膏藥,哪里痛都能貼,比如如下幾個痛點便是CBC也無法解決的:
- 加解密場景需要密文長度與明文相同
- 需要并行實作加解密
- 在保證機密性的同時,還需要保證完整性
看來,CBC不適用的場景還是蠻多的,針對第一個問題,我們可以使用CFB模式:

(圖片來自維基百科)
CBC與ECB模式一脈相承,它們都需要將明文分組成16位元組的資料塊,然后進行填充,即密文長度始終大于明文,為解決這個問題,CFB模式棄用了直接加密明文的方式,轉而將加密作用在IV和Key上,再將結果與明文進行異或,所以這個時候明文不必再滿足16位元組的要求,因為異或運算的輸入可以是任意長度,這就引出同時回答了本文關心的第五個問題:
5)CFB模式是如何將塊密碼轉換成流密碼的?
因為明文分組可以是任意長度,所以我們可以將明文分組長度設為1個位元組,讓加解密程序看起來像是流式運算,而最最重要的,此時明文不再需要填充了,密文長度完全與明文長度一致,
地形有通者、有掛者、有支者、有隘者、有險者、有遠者,
AES的運用場景之多決定了加密模式不會僅限于如上三種,當我們使用多處理器實作帶硬體加速功能的SE芯片時,便會想到CTR模式,即計數器模式,

(圖片來自維基百科)
計數器模式通過遞增一個加密計數器以產生連續的密鑰流,其中,計數器即可實作為遞增的函式,也可實作為隨機函式,由于加密和解密程序中,計數器序列可以預生成,因此均可以進行并行處理,特別適合運用于多處理器的硬體上,CTR的另一個優點是密文中的錯誤位不會傳播,解密時僅影響對應的明文位,
如果需要進一步保證密文的完整性,單純只是用加密就不能解決問題了,而GCM模式就是用來滿足這種需求的:

GCM可以理解為在CTR模式的基礎上增加了一個GMAC演算法,因此在生成的密文后將會附加一個Auth Tag,用來保證傳輸程序中的完整性,
到此為止我們一共介紹了五種常用的加密模式,最后我們將介紹的幾乎是一個專用的加密模式——XTS,XTS基本專為存盤加密設計,在磁盤加密的實作中運用廣泛,比如linux上赫赫有名的dm-crypt機制,便是使用XTS實作,
關于XTS的原理我們將不再深入探討,介紹它是因為加密磁盤的應用場景十分普遍,我們需要了解,但是卻很少存在直接使用的場景,
道阻且長,行則降至,
關于原理的介紹且告一段落,筆者結合自己實際運用的經驗和業內人士的分享,整理了一份最常用加密模式的對照表:
如上表格高度概括了ECB、CBC、CFB、CTR、XTS和GCM六種主流加密模式的原理、優缺點和應用范圍,作為原理的總結,
相信絕大多數讀者學習加解密演算法的目的都是為了最終能夠運用,也只有在實際運用中才能夠真正領悟每種加密模式的特點,對其適用場景有更加深刻的理解,為了幫助大家進行選擇,筆者作了一張加密模式選擇的參考圖:

該選擇方案僅供參考,至于如何選擇最佳的加密模式,還需要根據具體的場景和要求進一步判斷,
紙上得來終覺淺,絕知此事要躬行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357196.html
標籤:其他
