AES加密
AES是一個(gè)對(duì)稱密碼嬉挡,旨在取代DES成為廣泛使用的標(biāo)準(zhǔn)。
二汇恤、AES的數(shù)據(jù)結(jié)構(gòu)
加密解密算法的輸入是一個(gè)128位分組庞钢。這些分組被描述成4×4的字節(jié)方陣,這個(gè)分組被復(fù)制到state數(shù)組中屁置,并在加密和解密的每一階段都被修改焊夸。在字節(jié)方陣中,每一格都是一個(gè)字蓝角,包含了4字節(jié)阱穗。在矩陣中字是按列排序的饭冬。
三、加密解密的詳細(xì)結(jié)構(gòu)
AES未使用Feistel結(jié)構(gòu)揪阶。其前N-1輪由4個(gè)不同的變換組成:字節(jié)代替昌抠、行移位、列混淆和輪密鑰加鲁僚。最后一輪僅包含三個(gè)變換炊苫。而在第一輪前面有一個(gè)起始的單變換(輪密鑰加),可以視為0輪冰沙。
字節(jié)代替(SubBytes):用一個(gè)S盒完成分組的字節(jié)到字節(jié)的代替侨艾。
行移位(ShiftRows):一個(gè)簡單的置換。
列混淆(MixColumns):利用域GF(28)上的算術(shù)特性的一個(gè)代替拓挥。
輪密鑰加(AddRoundKey):當(dāng)前分組和擴(kuò)展密鑰的一部分進(jìn)行按位異或XOR唠梨。
首尾使用輪密鑰加的理由:若將其他不需要密鑰的階段放在首尾,在不知道密鑰的情況下就能計(jì)算其逆侥啤,這就不能增加算法的安全性当叭。
加密原理:輪密鑰加實(shí)際是一種Vernam密碼形式,其本身不難被破解盖灸。另外三個(gè)階段一起提供了混淆蚁鳖、擴(kuò)散和非線性功能。這三個(gè)階段沒有涉及密鑰赁炎,就它們自身而言醉箕,并未提供算法的安全性。然而甘邀,該算法經(jīng)歷一個(gè)分組的XOR加密(輪密鑰加)琅攘,再對(duì)該分組混淆擴(kuò)散(其他三個(gè)階段),再接著又是XOR加密松邪,如此交替進(jìn)行,這種方式非常有效非常安全哨查。
可逆原理:每個(gè)階段均可逆逗抑。對(duì)字節(jié)代替、行移位和列混淆寒亥,在解密算法中用它們相對(duì)應(yīng)的逆函數(shù)邮府。輪密鑰加的逆就是用同樣的輪密鑰和分組相異或,其原理就是A⊕B⊕B = A溉奕。和大多數(shù)分組密碼一樣褂傀,AES解密算法按逆序利用擴(kuò)展密鑰,然而其解密算法和加密算法并不一樣加勤,這是由AES的特定結(jié)構(gòu)決定的仙辟。圖5.3中加密和解密流程在縱向上是相反的同波,在每個(gè)水平點(diǎn)上,state數(shù)組在加密和解密函數(shù)中都是一樣的叠国。
四未檩、AES的變換函數(shù)
1、字節(jié)代替變換
字節(jié)代替變換是一個(gè)簡單的查表操作粟焊。AES定義了一個(gè)S盒冤狡,它是由16×16個(gè)字節(jié)組成是矩陣,包含了8位所能表示的256個(gè)數(shù)的一個(gè)置換项棠。State中每個(gè)字節(jié)按照如下方式映射為一個(gè)新的字節(jié):把該字節(jié)的高4位作為行值悲雳,低4位作為列值,以這些數(shù)值為索引從S盒的對(duì)應(yīng)位置取出元素作為輸出香追。如合瓢,十六進(jìn)制數(shù){95}所對(duì)應(yīng)的S盒行值是9,列值是5翅阵。S盒中在此位置的值是{2A}歪玲,相應(yīng)的,{95}被映射為{2A}掷匠。
S盒的構(gòu)造
(1)按字節(jié)值的升序逐行初始化S盒(相當(dāng)于每個(gè)值都代表了坐標(biāo))
(2)把S盒的每個(gè)字節(jié)映射為它在有限域GF(28)中的逆
(3)把S盒中的每個(gè)字節(jié)的8個(gè)構(gòu)成位記為(b7,b6,b5,b4,b3,b2,b1,b0)滥崩。對(duì)S盒的每個(gè)字節(jié)的每個(gè)位作如下變換:
逆S盒的構(gòu)造
(1)按字節(jié)值的升序逐行初始化S盒
(2)利用式5.1的逆變換,該逆變換如下:
可逆證明:
令字節(jié)代替變換和逆字節(jié)代替變換中的矩陣分別為X和Y讹语,常量c和d的向量表示分別為C和D钙皮。對(duì)于某個(gè)8位的向量B,式5.2變成了B’=XB⊕C顽决。我們需證明Y(XB⊕C)⊕D=B
與DES加密的S盒的區(qū)別:
1短条、AES的S盒的原理是運(yùn)用了GF(28)的乘法逆和矩陣的可逆運(yùn)算來保證加密與解密過程的可逆性。DES的S盒設(shè)計(jì)主要是為了確保非線性關(guān)系才菠,并不需要可逆茸时。因而在設(shè)計(jì)理念上有極大的不同。
2赋访、AES的S盒與DES的S盒形式上差別也很大可都,AES的S盒輸入和輸出的位數(shù)相同,均為128位蚓耽,大小為16×16的字節(jié)矩陣渠牲,且只有1組;而DES的S盒輸入6位步悠,輸出只有4位签杈,大小是4×16的位矩陣,并且有8組鼎兽。在輸入的坐標(biāo)選擇規(guī)定上亦有不同答姥。
2铣除、行移位變換
操作本身很簡單,將state數(shù)組的第一行保持不變踢涌,第二行循環(huán)左移一個(gè)字節(jié)通孽,第三行循環(huán)左移兩個(gè)字節(jié),第四行循環(huán)左移三個(gè)字節(jié)睁壁。
其逆變換則將移位的幾行執(zhí)行相反方向的移位操作即可背苦。
基本原理
由于輪密鑰加、字節(jié)代替變換都是逐列地作用在state數(shù)組上潘明,每一輪的行移位變換將會(huì)打亂列排列行剂,使得保密性得到很大的提升。
3钳降、列混淆變換
列混淆變換實(shí)際上是使用乘法矩陣(注意:其運(yùn)算中涉及的加法和乘法都是定義在GF(28)上的加法和乘法厚宰,目的就是為了確保運(yùn)算結(jié)果不會(huì)溢出定義域),可用以下式子描述遂填。
其可逆性可以簡單運(yùn)算得到證明
基本原理
式5.3中矩陣的系數(shù)是基于碼字間有最大距離的線性編碼铲觉,這使得在每列的所有字節(jié)中有良好的混淆性。列混淆變換和行移位變換使得經(jīng)過幾輪變換后吓坚,所有的輸入位和所有的輸出位相關(guān)撵幽。
此外,列混淆變換的系數(shù)礁击,即{01}{02}{03}是基于算法實(shí)現(xiàn)角度考慮的盐杂。不過,逆向列混淆變換的系數(shù)則更加難以實(shí)現(xiàn)哆窿,然而加密被視為比解密更重要链烈,因?yàn)椋?br>
1、對(duì)于CFB和OFB密碼模式挚躯,僅用到加密算法
2强衡、和任何其他分組密碼一樣,AES能用于構(gòu)造消息驗(yàn)證碼码荔,這僅僅用到了加密過程食侮。
4、輪密鑰加變換
這個(gè)比較簡單目胡,沒有太多好說的,密鑰擴(kuò)展的復(fù)雜性是確保算法安全性的重要部分链快。
以下是描述單輪AES的另一個(gè)視角誉己,強(qiáng)調(diào)各變換的機(jī)制和輸入。
五域蜗、AES的密鑰擴(kuò)展
AES密鑰擴(kuò)展算法的輸入值是4個(gè)字(16字節(jié))巨双,輸出值是一個(gè)由44個(gè)字組成(176字節(jié))的一維線性數(shù)組噪猾。以下偽碼描述了這個(gè)擴(kuò)展:
KeyExpansion(byte key[16], word w[44]){
word temp
for(i=0; i<4; i++) //將輸入的密鑰直接復(fù)制到擴(kuò)展密鑰數(shù)組的前四個(gè)字
w[i]=word(key[4i],key[4i+1],key[4i+2],key[4i+3]);
temp = w[i-1];
if(i mod 4 == 0) //對(duì)w數(shù)組下標(biāo)為4的倍數(shù)的元素采用更復(fù)雜的函數(shù)來計(jì)算
temp = SubWord(RotWord(temp))⊕Rcon[i/4];
w[i] = w[i-4] + temp; //每一個(gè)新增的字w[i]依賴于w[i-1] 和w[i-4]
}
RotWord的功能是字循環(huán),即使一個(gè)字的4個(gè)字節(jié)循環(huán)左移1個(gè)字節(jié)筑累。
SubWord是利用S盒對(duì)輸入字的每個(gè)字節(jié)進(jìn)行字節(jié)代替袱蜡。
Rcon[i]是輪常量,代表一個(gè)字慢宗,這個(gè)字最右邊三個(gè)字節(jié)總是0坪蚁,因此字與Rcon異或,其結(jié)果只是與該字最左邊的那個(gè)字節(jié)相異或镜沽。每一輪的輪常量都不相同敏晤,其定義為
Rcon[i] = (RC[i],0,0,0),其中RC[1] = 1缅茉,RC[i] = 2?RC[i-1] 乘法是定義在域GF(28)上的嘴脾。
RC[i]的值按照十六進(jìn)制表示為
輪常量取不同值就是為了消除不同輪密鑰產(chǎn)生方式上的對(duì)稱性或相似性。
密鑰擴(kuò)展算法的設(shè)計(jì)規(guī)范:
1蔬墩、找到密鑰或輪密鑰的部分位不足以計(jì)算出輪密鑰的其他位译打;
2、它是一個(gè)可逆的變換(即知道擴(kuò)展密鑰中任何連續(xù)的Nk個(gè)字能夠重新產(chǎn)生整個(gè)擴(kuò)展密鑰拇颅,Nk是構(gòu)成密鑰所需的字?jǐn)?shù))奏司;
3、能夠在各種處理器上有效地執(zhí)行蔬蕊;
4结澄、使用輪常量消除對(duì)稱性;
5岸夯、將密鑰差異性擴(kuò)散到輪密鑰中的能力麻献,即密鑰的每個(gè)位能影響輪密鑰的許多位;
6猜扮、足夠的非線性以防止輪密鑰的差異完全由密鑰的差異所決定勉吻。
改進(jìn)--等價(jià)的逆算法
上文所述的標(biāo)準(zhǔn)解密流程與標(biāo)準(zhǔn)加密流程并不完全一致,加密每一輪的流程是:字節(jié)代替-->行移位-->列混淆-->輪密加旅赢。而解密每一輪的流程是:逆向行移位-->逆向字節(jié)代替-->輪密加-->逆向列混淆齿桃。
可以對(duì)解密構(gòu)成進(jìn)行改進(jìn),使得解密流程與加密流程等效煮盼。
1短纵、交換逆向行移位和逆向字節(jié)代替:
由于逆向行移位并不影響state數(shù)組中字節(jié)的內(nèi)容,而逆向字節(jié)代替也不會(huì)影響state數(shù)組中字節(jié)的位置僵控,因而兩者可以交換順序而不影響解密香到。
2、交換輪密鑰加和逆向列混淆:
這兩種操作均不會(huì)改變state中字節(jié)的順序,給定狀態(tài)Si和給定輪密鑰wi悠就,可證明
逆向列混淆(Si⊕wi)= [逆向列混淆(Si)]⊕[逆向列混淆(wi)]
這個(gè)等式顯然是正確的千绪,因而如果要改變這兩種操作的順序,則必須改進(jìn)逆向列混淆的操作梗脾,即先對(duì)輪密鑰應(yīng)用逆向列混淆(注意荸型,無需對(duì)首尾的輪密鑰應(yīng)用逆向列混淆)。最終炸茧,改進(jìn)后的解密流程如下圖: