微信公眾號:龍躍十二
持續(xù)更新,歡迎關(guān)注!
用心分享,共同成長
沒有什么比你每天進步一點點更實在了
本文已經(jīng)收錄至我的GitHub,歡迎大家踴躍star??。
GitHub
哎,在這一周被迫營業(yè)的日子里呢,發(fā)生了一些讓人匪夷所思、琢磨不透的事情,你說我這么一個女孩子,除了看過李佳琪的直播,還沒著迷過別的男主播,這不,夢想照進現(xiàn)實,是什么逼迫我的老師們也成了主播,而我成了在直播間刷禮物的<font face="黑體" color=orange size=3>精神小伙</font>。
<img src="https://tva1.sinaimg.cn/large/00831rSTly1gci2h5o0daj307s06v3yl.jpg" style="zoom:67%;" />
雖然學(xué)校得要正常營業(yè),但是日常輸出也必不可少,今天分享的是一個對于密碼學(xué)界來說非常重要的算法,這么說你是不是還是體會不到它的重要性,那就比如說,它就像是口紅里的Dior,包包里的愛馬仕......不說了,錢包疼
AES算法:(Advanced Encryption Standard)
??介紹:
AES(Advanced Encryption Standard)算法,高級加密標(biāo)準(zhǔn),在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。
在對 AES 設(shè)計之初呢,就有三個基本要求:
比三重DES 快
至少與三重 DES 一樣安全
數(shù)據(jù)分組長度為 128 比特、密鑰長度為 128/ 192/ 256 比特。
對DES還有疑問的朋友可以看看我之前的文章 聊聊密碼學(xué)中的DES算法、 二重DES、三重DES詳解
??說明:
其實,從嚴格意義上講,AES和Rijndael加密法又不完全一樣,但是在實際應(yīng)用中,我們常常將兩者交換使用。
我們來看一組對比數(shù)據(jù):
- AES的分組長度為128 比特,密鑰長度則可以是128,192或256比特;
- 而Rijndael算法的分組長度和密鑰長度可以是32比特的整數(shù)倍(下限:128bit,上限:256bit)
相對于AES來說,Rijndael算法使用更加不受約束。Rijndael算法可以支持更大范圍的分組長度和密鑰長度。
類似于明文分組和密文分組,算法的中間結(jié)果也須分組,將這種分組成為“狀態(tài)”, 所有的操作都在狀態(tài)上進行。例如:AES加密過程是在一個4×4的字節(jié)矩陣上運作,這個矩陣就稱為“狀態(tài)”,其初值就是一個明文分組(矩陣中一個元素大小就是明文分組中的一個Byte)。對于Rijndael算法來說,其加密時明文分組長度不定,其矩陣的大小需要根據(jù)具體情況來定。
加密時,AES算法的加密過程都包含4個步驟:
SubBytes(字節(jié)代替):通過非線性替換函數(shù),用查找表的方式,獨立的對每個字節(jié)進行替換。代換表 (也就是S-盒) 都是可逆(也就是說替換以后的字節(jié)可以通過查表找到原始的字節(jié))。
ShiftRows(行移位):目的就是將矩陣中的橫和列,進行循環(huán)式移位。
MixColumns(列混淆):列混淆的方法就是使用線性轉(zhuǎn)換將每列的四個字節(jié)進行混合。為了充分混合矩陣中各個行,而進行的一步。
AddRoundKey(輪密鑰加):矩陣中的各個字節(jié)都要與輪秘鑰進行異或(XOR)運算,從而生產(chǎn)子密鑰。
最后一個加密循環(huán)中略微有所不同。
綜上所述,組成 Rijndael 輪函數(shù)的計算部件簡捷快速,功能互補。輪函數(shù)的偽 C 代碼如下:
Round (State , RoundKey)
{
ByteSub (State ) ;
ShiftRow (State ) ;
MixColumn (Sta te) ;
AddRoundKey (State , RoundKey)
}
最后一個加密循環(huán)的輪函數(shù)與前面各輪不同,需要將 MixColumn 這一步去掉,其偽 C 代碼如下:
FinalRound ( State , RoundKey)
{
ByteSub (State ) ;
ShiftRow (State ) ;
AddRoundKey (State , RoundKey)
}
注:在以上偽 C 代碼記法中, State、RoundKey 可用指針類型,函數(shù) Round、FinalRound、 ByteSub、Shift Row、MixColumn、AddRoundKey 都在指針 State、RoundKey 所指向的陣列上進行運算。
加密標(biāo)準(zhǔn):
AES為分組密碼,在加密時需要把明文分成長度相等的小組,每次對一組數(shù)據(jù)進行加密。在AES標(biāo)準(zhǔn)規(guī)范中,分組長度只能是128位,也就是說,每個分組為16個字節(jié)(每個字節(jié)8位)。AES的密鑰長度可以是128bit、192bit或256bit。密鑰的長度不同,所需要的加密輪數(shù)也會不相同,具體情況如下圖所示:
| AES | 密鑰長度(32位比特字) | 分組長度(32位比特字) | 加密輪數(shù) |
|---|---|---|---|
| AES-128 | 4 | 4 | 10 |
| AES-192 | 6 | 4 | 12 |
| AES-256 | 8 | 4 | 14 |
密鑰編排
密鑰編排指從種子密鑰得到輪密鑰的過程, 它由密鑰擴展和輪密鑰選取兩部分組成。
其基本原則如下:
輪密鑰的比特數(shù)等于分組長度乘以輪數(shù)加 1。
種子密鑰被擴展成為擴展密鑰。
加密算法:
加密算法的操作順序:初始的密鑰加,( Nr-1) 輪迭代,一個結(jié)尾輪。即:
Rijndael (State , Ciphe rKey)
{
KeyExpansion (Ciphe rKey , ExpandedKey) ;
AddRoundKey (State , ExpandedKey) ;
for ( i=1; i< Nr; i++) Round (State , ExpandedKey + Nb*i) ;
FinalRound (State, ExpandedKey + Nb*Nr)
}
其中 CipherKey 是種子密鑰,ExpandedKey 是擴展密鑰。密鑰擴展可以事先進行 ( 預(yù)算) ,且 Rijndael 密碼的加密算法可以用這一擴展密鑰來描述, 即 :
Rijndael (State , ExpandedKey)
{
AddRoundKey (State , ExpandedKey) ;
for ( i=1; i< Nr ; i++) Round (State , ExpandedKey+Nb*i) ;
FinalRound (State, ExpandedKey + Nb*Nr)
}
解密算法:
解密算法的操作順序: 初始的密鑰加,( Nr-1) 輪迭代, 一個結(jié)尾輪。
其中解密算法的輪函數(shù)為 :
InvRound (Sta te, RoundKey)
{
InvByteSub ( State ) ;
InvShiftRow ( State ) ;
InvMixColumn (State ) ;
AddRoundKey (State , RoundKey)
}
解密算法的結(jié)尾輪為 :
InvFinalRound (State, RoundKey)
{
InvByteSub ( State ) ;
InvShiftRow ( State ) ;
AddRoundKey (State , RoundKey)
}
關(guān)于AES算法最主要的就是要明白它的加密步驟,明文分組,以及密鑰的使用,給大家貼了很多關(guān)于輪函數(shù)在AES算使用所需的代碼塊,需要的小伙伴自取哦!
關(guān)于文章中有任何問題,都可以關(guān)注公眾號【龍躍十二】,在后臺聯(lián)系作者!