日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是AES算法?(整合版) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?玻璃貓 程序員小灰

?

?

?

?

?

?

?

?

?

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

?

?

?

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

?

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

?

?

?

?

具體工作的步驟如下:

?

1.發(fā)送方利用密鑰123456,加密明文“我是小灰”,加密結(jié)果為TNYRvx+SNjZwEK+ZXFEcDw==。

?

2.發(fā)送方把加密后的內(nèi)容TNYRvx+SNjZwEK+ZXFEcDw==傳輸給接收方。

?

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

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

1.密鑰

?

密鑰是AES算法實(shí)現(xiàn)加密和解密的根本。對(duì)稱加密算法之所以對(duì)稱,是因?yàn)檫@類算法對(duì)明文的加密和解密需要使用同一個(gè)密鑰。

?

AES支持三種長度的密鑰:

128位,192位,256位

?

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

?

?

?

?

?

?

?

2.填充

?

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

?

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

?

?

?

?

?

AES算法在對(duì)明文加密的時(shí)候,并不是把整個(gè)明文一股腦加密成一整段密文,而是把明文拆分成一個(gè)個(gè)獨(dú)立的明文塊,每一個(gè)明文塊長度128bit。

?

這些明文塊經(jīng)過AES加密器的復(fù)雜處理,生成一個(gè)個(gè)獨(dú)立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結(jié)果。

?

但是這里涉及到一個(gè)問題:

?

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

?

?

?

?

?

?

?

NoPadding:不做任何填充,但是要求明文必須是16字節(jié)的整數(shù)倍。

?

PKCS5Padding(默認(rèn)):如果明文塊少于16個(gè)字節(jié)(128bit),在明文塊末尾補(bǔ)足相應(yīng)數(shù)量的字符,且每個(gè)字節(jié)的值等于缺少的字符數(shù)。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個(gè)字節(jié),則補(bǔ)全為{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6} ISO10126Padding:如果明文塊少于16個(gè)字節(jié)(128bit),在明文塊末尾補(bǔ)足相應(yīng)數(shù)量的字節(jié),最后一個(gè)字符值等于缺少的字符數(shù),其他字符填充隨機(jī)數(shù)。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個(gè)字節(jié),則可能補(bǔ)全為{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6} ?

?

?

?

3.模式

?

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

?

ECB、CBC、CTR、CFB、OFB

?

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

?

ECB模式(默認(rèn)):

電碼本模式????Electronic?Codebook?Book

?

?

CBC模式:

密碼分組鏈接模式????Cipher Block Chaining

?

?

CTR模式:

計(jì)算器模式????Counter

?

?

CFB模式:

密碼反饋模式????Cipher FeedBack

?

?

OFB模式:

輸出反饋模式????Output FeedBack

?

?

?

?

?

?

?

?

?

?

?

?

1. kgen.init傳入的第一個(gè)參數(shù)128決定了密鑰的長度是128bit。

?

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

?

?

?

幾點(diǎn)補(bǔ)充:

?

1.我們?cè)谡{(diào)用封裝好的AES算法時(shí),表面上使用的Key并不是真正用于AES加密解密的密鑰,而是用于生成真正密鑰的“種子”。

?

2.填充明文時(shí),如果明文長度原本就是16字節(jié)的整數(shù)倍,那么除了NoPadding以外,其他的填充方式都會(huì)填充一組額外的16字節(jié)明文塊。

?

?

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

?

?

?

?

?

?

?

?

?

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

?

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

?

2.按照選擇的填充方式來填充最后一個(gè)明文塊。

?

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

?

4.拼接所有的密文塊,成為最終的密文結(jié)果。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

具體分成多少輪呢?

初始輪(Initial Round)? 1次

普通輪(Rounds)? ? ? ? ? N次

最終輪(Final?Round)???1次

?

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

?

除去初始輪,各種Key長度對(duì)應(yīng)的輪數(shù)如下:

AES128:10輪

AES192:12輪

AES256:14輪

?

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

?

初始輪只有一個(gè)步驟:

加輪密鑰(AddRoundKey)

?

?

普通輪有四個(gè)步驟:

字節(jié)代替(SubBytes)

行移位(ShiftRows)

列混淆(MixColumns)

加輪密鑰(AddRoundKey)

?

?

最終輪有三個(gè)步驟:

字節(jié)代替(SubBytes)

行移位(ShiftRows)

加輪密鑰(AddRoundKey)

?

?

?

?

?

?

1.字節(jié)替代(SubBytes)

?

?

?

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

?

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

?

假設(shè)明文塊當(dāng)中a[2,2] = 5B(一個(gè)字節(jié)是兩位16進(jìn)制),那么輸出值b[2,2] = S[5][11]。

?

?

2.行移位(ShiftRows)

?

?

?

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

第一行不變

第二行循環(huán)左移1個(gè)字節(jié)

第三行循環(huán)左移2個(gè)字節(jié)

第四行循環(huán)左移3個(gè)字節(jié)

?

?

3.列混淆(MixColumns)

?

?

?

這一步,輸入數(shù)組的每一列要和一個(gè)名為修補(bǔ)矩陣(fixed matrix)的二維常量數(shù)組做矩陣相乘,得到對(duì)應(yīng)的輸出列。

?

?

4.加輪密鑰(AddRoundKey)

?

?

?

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

?

讓輸入數(shù)組的每一個(gè)字節(jié)a[i,j]與密鑰對(duì)應(yīng)位置的字節(jié)k[i,j]異或一次,就生成了輸出值b[i,j]。

?

需要補(bǔ)充一點(diǎn),加密的每一輪所用到的密鑰并不是相同的。這里涉及到一個(gè)概念:擴(kuò)展密鑰(KeyExpansions)。

?

?

擴(kuò)展密鑰(KeyExpansions)

?

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

?

后續(xù)每一個(gè)元素W[i]都是由W[i-4]和W[i-1]計(jì)算而來,直到數(shù)組W的所有元素都賦值完成。

?

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

?

?

?

?

?

?

?

?

?

?

?

?

1.ECB模式

?

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

?

?

?

?

?

這樣的好處是什么呢?

1.簡單

2.有利于并行計(jì)算

?

缺點(diǎn)同樣也很明顯:

相同的明文塊經(jīng)過加密會(huì)變成相同的密文塊,因此安全性較差。

?

?

2.CBC模式

?

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

?

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

?

?

?

?

從圖中可以看出,CBC模式在每一個(gè)明文塊加密前會(huì)讓明文塊和一個(gè)值先做異或操作。IV作為初始化變量,參與第一個(gè)明文塊的異或,后續(xù)的每一個(gè)明文塊和它前一個(gè)明文塊所加密出的密文塊相異或。

?

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

?

CBC模式的好處是什么呢?

安全性更高

?

壞處也很明顯:

1.無法并行計(jì)算,性能上不如ECB

2.引入初始化向量IV,增加復(fù)雜度。

?

?

?

?

?

?

—————END—————

?

?

總結(jié)

以上是生活随笔為你收集整理的什么是AES算法?(整合版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。