什麼是AES算法?(整合版)

原文鏈接:https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653191726&idx=1&sn=c7856fe211471d01e9afdfea4a7f6b87&chksm=8c990cf4bbee85e28bb2ea63cb1f767dee4702ca8b9ef23db3467558a4b27ff5b6c1893c8771&scene=21#wechat_redirect

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

假設有一個發送方在向接收方發送消息。如果沒有任何加密算法,接收方發送的是一個明文消息:“我是小灰”

在這裏插入圖片描述

如果消息被中間人截獲到,即使中間人無法篡改消息,也可以窺探到消息的內容,從而暴露了通信雙方的私密。

因此我們不再直接傳送明文,而改用對稱加密的方式傳輸密文,畫風就變成了下面這樣:

在這裏插入圖片描述

具體工作的步驟如下:

1、發送方利用密鑰123456,加密明文“我是小灰”,加密結果爲TNYRvx+SNjZwEK+ZXFEcDw==。

2、發送方把加密後的內容TNYRvx+SNjZwEK+ZXFEcDw==傳輸給接收方。

3、接收方收到密文TNYRvx+SNjZwEK+ZXFEcDw==,利用密鑰123456還原爲明文“我是小灰”。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

1、密鑰

密鑰是AES算法實現加密和解密的根本。對稱加密算法之所以對稱,是因爲這類算法對明文的加密和解密需要使用同一個密鑰

AES支持三種長度的密鑰:
128位,192位,256位

平時大家所說的AES128,AES192,AES256,實際上就是指的AES算法對不同長度密鑰的使用。

在這裏插入圖片描述在這裏插入圖片描述

2、填充

要想了解填充的概念,我們先要了解AES的分組加密特性。

什麼是分組加密呢?我們來看看下面這張圖:

在這裏插入圖片描述

AES算法在對明文加密的時候,並不是把整個明文一股腦加密成一整段密文,而是把明文拆分成一個個獨立的明文塊,每一個明文塊長度128bit。

這些明文塊經過AES加密器的複雜處理,生成一個個獨立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結果。

但是這裏涉及到一個問題:

假如一段明文長度是192bit,如果按每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit。這時候怎麼辦呢?就需要對明文塊進行填充(Padding)

在這裏插入圖片描述在這裏插入圖片描述

NoPadding:

不做任何填充,但是要求明文必須是16字節的整數倍。

PKCS5Padding(默認):

如果明文塊少於16個字節(128bit),在明文塊末尾補足相應數量的字符,且每個字節的值等於缺少的字符數。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節,則補全爲{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:

如果明文塊少於16個字節(128bit),在明文塊末尾補足相應數量的字節,最後一個字符值等於缺少的字符數,其他字符填充隨機數。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個字節,則可能補全爲{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

在這裏插入圖片描述

3、模式

AES的工作模式,體現在把明文塊加密成密文塊的處理過程中。AES加密算法提供了五種不同的工作模式:

ECB、CBC、CTR、CFB、OFB

模式之間的主題思想是近似的,在處理細節上有一些差別。我們這一期只介紹各個模式的基本定義。

ECB模式(默認):
電碼本模式 Electronic Codebook Book

CBC模式:
密碼分組鏈接模式 Cipher Block Chaining

CTR模式:
計算器模式 Counter

CFB模式:
密碼反饋模式 Cipher FeedBack

OFB模式:
輸出反饋模式 Output FeedBack

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

  1. kgen.init傳入的第一個參數128決定了密鑰的長度是128bit

  2. Cipher.getInstance(“AES/CBC/NoPadding”)決定了AES選擇的填充方式是NoPadding,工作模式是CBC模式

幾點補充:

1.我們在調用封裝好的AES算法時,表面上使用的Key並不是真正用於AES加密解密的密鑰,而是用於生成真正密鑰的“種子”。

2.填充明文時,如果明文長度原本就是16字節的整數倍,那麼除了NoPadding以外,其他的填充方式都會填充一組額外的16字節明文塊。

以上就是AES的基本概念。但我們是有追求的程序員,不能知其然不知其所以然。下面來給大家講一講AES算法的底層原理

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏我們重新梳理一下:

1.把明文按照128bit拆分成若干個明文塊。

2.按照選擇的填充方式來填充最後一個明文塊。

3.每一個明文塊利用AES加密器和密鑰,加密成密文塊。

4.拼接所有的密文塊,成爲最終的密文結果。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

具體分成多少輪呢?

  • 初始輪(Initial Round) 1次
  • 普通輪(Rounds) N次
  • 最終輪(Final Round) 1次

上一期我們提到,AES的Key支持三種長度:AES128,AES192,AES256。Key的長度決定了AES加密的輪數。

除去初始輪,各種Key長度對應的輪數如下:

  • AES128:10輪
  • AES192:12輪
  • AES256:14輪

不同階段的Round有不同的處理步驟。

初始輪只有一個步驟:

  • 加輪密鑰(AddRoundKey)

普通輪有四個步驟:

  • 字節代替(SubBytes)
  • 行移位(ShiftRows)
  • 列混淆(MixColumns)
  • 加輪密鑰(AddRoundKey)

最終輪有三個步驟:

  • 字節代替(SubBytes)
  • 行移位(ShiftRows)
  • 加輪密鑰(AddRoundKey)

在這裏插入圖片描述
在這裏插入圖片描述

1.字節替代(SubBytes)

在這裏插入圖片描述

首先需要說明的是,16字節的明文塊在每一個處理步驟中都被排列成4X4的二維數組。

所謂字節替代,就是把明文塊的每一個字節都替代成另外一個字節。替代的依據是什麼呢?依據一個被稱爲S盒(Subtitution Box)的16X16大小的二維常量數組。

假設明文塊當中a[2,2] = 5B(一個字節是兩位16進制),那麼輸出值b[2,2] = S[5][11]。

2.行移位(ShiftRows)

在這裏插入圖片描述

這一步很簡單,就像圖中所描述的:

  • 第一行不變
  • 第二行循環左移1個字節
  • 第三行循環左移2個字節
  • 第四行循環左移3個字節

3.列混淆(MixColumns)

在這裏插入圖片描述

這一步,輸入數組的每一列要和一個名爲修補矩陣(fixed matrix)的二維常量數組做矩陣相乘,得到對應的輸出列。

4.加輪密鑰(AddRoundKey)

在這裏插入圖片描述

這一步是唯一利用到密鑰的一步,128bit的密鑰也同樣被排列成4X4的矩陣。

讓輸入數組的每一個字節a[i,j]與密鑰對應位置的字節k[i,j]異或一次,就生成了輸出值b[i,j]。

需要補充一點,加密的每一輪所用到的密鑰並不是相同的。這裏涉及到一個概念:擴展密鑰(KeyExpansions)。

擴展密鑰(KeyExpansions)

AES源代碼中用長度 4 * 4 *(10+1) 字節的數組W來存儲所有輪的密鑰。W{0-15}的值等同於原始密鑰的值,用於爲初始輪做處理。

後續每一個元素W[i]都是由W[i-4]和W[i-1]計算而來,直到數組W的所有元素都賦值完成。

W數組當中,W{0-15}用於初始輪的處理,W{16-31}用於第1輪的處理,W{32-47}用於第2輪的處理 …一直到W{160-175}用於最終輪(第10輪)的處理。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

1.ECB模式

ECB模式(Electronic Codebook Book)是最簡單的工作模式,在該模式下,每一個明文塊的加密都是完全獨立,互不干涉的。

在這裏插入圖片描述

這樣的好處是什麼呢?

  • 1.簡單
  • 2.有利於並行計算

缺點同樣也很明顯:

  • 相同的明文塊經過加密會變成相同的密文塊,因此安全性較差。

2.CBC模式

CBC模式(Cipher Block Chaining)引入了一個新的概念:初始向量IV(Initialization Vector)。

IV是做什麼用的呢?它的作用和MD5的“加鹽”有些類似,目的是防止同樣的明文塊始終加密成同樣的密文塊。

在這裏插入圖片描述

從圖中可以看出,CBC模式在每一個明文塊加密前會讓明文塊和一個值先做異或操作。IV作爲初始化變量,參與第一個明文塊的異或,後續的每一個明文塊和它前一個明文塊所加密出的密文塊相異或。

這樣以來,相同的明文塊加密出的密文塊顯然是不一樣的。

CBC模式的好處是什麼呢?

  • 安全性更高

壞處也很明顯:

  • 1.無法並行計算,性能上不如ECB
  • 2.引入初始化向量IV,增加複雜度。

在這裏插入圖片描述

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