《應用密碼學》課件第3章分組密碼2_第1頁
《應用密碼學》課件第3章分組密碼2_第2頁
《應用密碼學》課件第3章分組密碼2_第3頁
《應用密碼學》課件第3章分組密碼2_第4頁
《應用密碼學》課件第3章分組密碼2_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

主要內容:

分組密碼的基本概念

對稱密碼基本原理

數(shù)據(jù)標準加密(DES)

高級加密標準(AES)

對稱密碼體制工作模式

對稱密碼應用第三章分組密碼算法2025/8/1223.4.1AES的產生歷史背景20世紀70年代中期美國人開創(chuàng)的DES可以說經歷了漫長而輝煌的年代,并逐漸由繁榮走向衰落,它之所以走向衰落,由于20世紀未出現(xiàn)了差分密碼分析及線性密碼分析,使得破譯DES成為可能。NIST于1997年初發(fā)起并組織了在全世界范圍內廣泛征集新的加密標準算法的活動,同時要求每一種侯選算法的分組長度為128位,應當支持128,192和256比特的密鑰長度,經過了幾年的反復較量,對首輪入選的15種不同算法,進行了廣泛的評估與測試,篩選出5種算法(MARS、RC6、Rijndael、Serpent和Twofish)進入決賽。3.4AES(高級數(shù)據(jù)加密標準)2025/8/123最終,由比利時的密碼學專家JoanDaemen(ProtonWorldInternational公司)及VincentRijmen(Leuven大學)所提出的加密算法Rijndael(榮代爾)贏得了勝利,成為了21世紀新的數(shù)據(jù)加密標準AES(AdvancedEncryptionStandard)。

當美國宣布這一最后勝利的結果(2001年11月26日,NIST正式公布高級加密標準,并于2002年5月26日正式生效)時,出人意料,因為這是美國第一次將非美國公民提出的算法接受為密碼標準算法,值得我們深思。目前,Rijndael以其算法設計的簡潔、高效、安全而令世人關注,相信它會在國際上得到廣泛的應用。2025/8/124Rijndael算法是由兩位比利時的密碼專家發(fā)明的,它運算速度很快而且所需的內存不多,這個算法非??煽浚籖ijndael算法的設計策略是寬軌跡策略,是針對差分分析和線性分析提出來的,是一個分組迭代密碼,具有可變的分組長度和密鑰長度;

Rijndael匯聚了安全性能、效率、可實現(xiàn)性和靈活性等優(yōu)點-特色:2025/8/125但是,我們應該清楚自香農(于1949年)發(fā)表“保密系統(tǒng)的通信理論”并確定密碼學的科學體系以來,經過了1/4個世紀,RivestShamir和Adleman于1978年提出RSA公開密鑰算法,美國國家標準局(NBS)于1977年數(shù)據(jù)加密標準DES。

其后,由于差分攻擊及線性攻擊的出現(xiàn),又經過了近1/4個世紀,出現(xiàn)了代替DES的新的高級加密標準——Rijndael。

因此,我們應當相信Rijndael也不會是永恒的,也許經過若干年的研究會找出Rijndael致命的缺點,從而提出更安全的算法。

2025/8/126Rijndael密碼設計原則

Rijndael密碼的設計中考慮到的三條準則①抗擊目前已知的所有攻擊;-Rijndael密碼的迭代變換由三個不同的、可逆的、一致變換組成,這三種不同的可逆變換提供抗線性密碼分析和差分密碼分析能力。②在多個平臺上實現(xiàn)速度要快和編碼緊湊;③設計簡單。

-Rijndael中同樣使用了迭代變換,但與大多數(shù)分組密碼不同的是Rijndael沒有使用Feistel結構。

不可約多項式:一個多項式f(x)稱為是不可約的,如果不存在多項式f1(x),f2(x)∈Zp[x],滿足f(x)=f1(x)×f2(x),其中deg(f1)>0和deg(f2)>0,也即f1(x),f2(x)不能是常數(shù)。3.4.1AES的數(shù)學基礎-對于多項式f(x),設它的次數(shù)為n,表示為deg(f)=n。何謂有限域?-Zp[x]為變元x的所有多項式的集合,多項式的每一項的系數(shù)為整數(shù)且都小于p。對于非空集合元素F,若在F中定義了加和乘兩種運算,且滿足下述公理:(1)F關于加法構成交換群。其加法恒等元記為0。(2)F中非零元素全體對乘法構成交換群。其乘法恒等元(單位元)記為1。(3)加法和乘法間有如下分配律:a×(b+c)=a×b+a×c(b+c)×a=b×a+c×a則稱F為一個域。若F中的元素個數(shù)有限,稱F為有限域(FiniteField)。有限域也叫伽羅瓦(GaloisField)域。Zp[x]/f(x)是域當且僅當f(x)是不可約的,也就是說,如果f(x)是不可約的,則所有屬于Zp[x]的多項式,在modf(x)后的余式,組成的集合構成一個域。反之也成立。例如:計算Z2[x]/x3+x+1,可得所有余式構成八個元素的集合{0,1,x,x+1,x2,x2+1,x2+x,x2+x+1},這個集合構成一個有限域,加法單位元為0,乘法單位元為1。這八個域元素的系數(shù)為:(000,001,010,011,100,101,110,111)

很容易知道,1,x,x+1,x2,x2+1,x2+x,x2+x+1模x3+x+1就是自身。下面是進一步的例子:例如求x3modx3+x+1,因為x3+x+1≡0modx3+x+1,故x3≡x3+x3+x+1≡x+1modx3+x+1。又如求x4modx3+x+1,注意到x4=x3×x,故x4≡(x+1)×xmodx3+x+1≡x2+x.在AES中選擇的不可約多項式是p(x)=x8+x4+x3+x+1,余式的次數(shù)至多是7次,共28=256個多項式,這256個余式構成了一個有限域。字節(jié)b用二進制表示為b=b7b6b5b4b3b2b1b0為有限域GF(28)上的域元素,若用多項式表示,bi可看作是多項式的系數(shù),bi∈{0,1},則字節(jié)b對應多項式為:b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0例如:字節(jié)‘57’(十六進制數(shù))對應的二進制為01010111,為GF(28)上域元素,字節(jié)‘57’對應的多項式為x6+x4+x2+x+1。AES計算是在一個特別的有限域完成的。在有限域GF(28)上的字節(jié)運算和字運算是AES算法中的兩種基本運算。

-GF(28)上兩個域元素的和GF(28)上兩個域元素的和對應的多項式仍然是一個次數(shù)不超過7的多項式,其多項式系數(shù)等于兩個元素對應多項式系數(shù)的模2加,即域元素對應二進制按位異或運算。例如:‘57’+‘83’=‘D4’,用多項式表示為:(x6+x4+x2+x+1)+(x7+x+1)≡x7+x6+x4+x2(modp(x))-有限域GF(28)上的字節(jié)運算字節(jié)運算時,一個字節(jié)被看做有限域GF(28)上的元素。有限域GF(28)可以定義為三元組:

(F,+,.),其中,F={b7b6b5b4b3b2b1b0|bi=0,1;i=0,1,2,3,4,5,6,7}用二進制表示為:01010111⊕10000011=11010100由于每個元素的加法逆元等于自己,所以有限域減法和加法相同。-GF(28)上兩個域元素的乘要計算GF(28)上域元素的乘法,必須先確定一個GF(2)上的8次不可約多項式;GF(28)上兩個元素的乘積就是這兩個多項式的模乘。在Rijndael密碼中,這個8次不可約多項式確定為:p(x)=x8+x4+x3+x+1它的十六進制表示為‘11B’。例如,‘57’·‘83’=‘C1’可表示為多項式乘法:

(x6+x4+x2+x+1)·(x7+x+1)≡x7+x6+1(modp(x))即:注:乘法“?”

是普通多項式乘法,但系數(shù)運算可看作比特的乘法和異或運算,即看作域{0,1}上的運算。x7+x6+1的系數(shù)對應的二進制為11000001,即十六進制的C1。2025/8/1213-例2:(01110011)(10010101)所以,(01110011)(10010101)=(01110000)

2025/8/1214-乘法的實際計算方法-討論:2025/8/1215-X乘法:上述過程稱之為x乘法,其定義為:x·b(x)≡b7x8+b6x7+b5x6+b4x5+b3x4+b2x3+b1x2+b0x(modp(x))

如果b7=0,求模結果不變,由此得出x(十六進制數(shù)‘02’)乘b(x)為對b(x)在字節(jié)內左移一位(最后一位補0)。若b7=1,則再與‘1B’(其二進制為00011011)做逐比特異或來實現(xiàn),而任意常數(shù)乘法可以通過對中間結果相加實現(xiàn)。b7=0舉例02·54=(00000010)·(01010100)=(x)·(x6+x4+x2)(modp(x))=x7+x5+x3(modp(x))=x7+x5+x3(modp(x))

≡x7+x5+x3(modp(x))=(10101000)由上面的規(guī)則:相當于把字節(jié)(01010100)左移一位即得(10101000)(最后一位補0)。02·D4=(00000010)·(11010100)=(x)·(x7+x6+x4+x2)(modp(x))=x8+x7+x5+x3(modp(x))≡(x4+x3+x+1)+x7+x5+x3(modp(x))≡x7+x5+x4+x+1(modp(x))

多項式

x7+x5+x4+x+1映射為二進制即為:(10110011)由上面的規(guī)則:先把(11010100)在字節(jié)內左移一位即得(10101000)(最后一位補0),因為b7=1,故(10101000)再與(00011011)異或得(10110011)b7=1舉例例3:求‘57’·‘13’

因為:而:-再看前面的例2:(01110011)?(10010101)=[(00000001)+(00000010)+(00010000)+(00100000)+(01000000)]?(10010101)=(00000001)?(10010101)⊕(00000010)?(10010101)⊕(00010000)?(10010101)⊕(00100000)?(10010101)⊕(01000000)?(10010101)=(10010101)⊕[(00101010)⊕(00011011)]⊕(00010000)?(10010101)⊕(00100000)?(10010101)⊕(01000000)?(10010101)=(10010101)⊕(00110001)⊕[(10001000)⊕(00011011)]⊕(00100000)?(10010101)⊕(01000000)?(10010101)=(10010101)⊕(00110001)⊕(10010011)⊕[(00100110)⊕(00011011)]⊕(01000000)?(10010101)=(10010101)⊕(00110001)⊕(10010011)⊕(00111101)⊕(01111010)=(01110000)=(70)∴(01110011)?(10010101)=(01110000),即(73)?(95)=(70)1、整除補充2、同余

補充3、歐幾里得除法(帶余除法)補充4、最大公因數(shù)補充5、擴展的歐幾里得除法補充補充=(a,b)補充例-逆元

設m是正整數(shù),a是整數(shù),如果存在a’,使得a×a’≡1(modm)成立,則a叫模m的可逆元,a’

叫a模m的逆元。例如,設m為11,則8模11的逆元為7,因為8×7≡1(mod11)當a和m互素的情況下,即(a,m)=1,則a的模m的逆元總是存在的,且可以用下面的輾轉相除法(擴展的歐幾里得算法)求得。例如,知道89是素數(shù),求60模89的逆元,可以用下面方法。89=1×60+2960=2×29+229=14×2+1則1=29-14×2=29-14×(60-2×29)=29×29-14×60=(89-60)×29-14×60=89×29-60×43上頁等式兩端同時mod89得:60×(-43)≡1mod89故60模89的逆元為-43,為方便記為最小非負數(shù),因為-43≡46mod89,故一般說60模89的逆元為46。因此,求a(x)模p(x)的乘法逆元轉化為求兩個多項式b(x)和c(x),使得滿足b(x)a(x)+p(x)c(x)=1,即滿足a(x)·b(x)≡1modp(x),因此b(x)是a(x)模p(x)的乘法逆元。GF(28)上域元素的乘法逆元在有限域GF(28)中,域元素的乘法滿足交換律,且有單位元,并且每個域元素都有乘法逆元。在GF(28)中求乘法逆元也是利用多項式的擴展的歐幾里得算法計算出來。求次數(shù)小于8的非零多項式b(x)的乘法逆元,首先利用多項式的擴展歐幾里得算法得出兩個多項式a(x)和c(x),使得滿足b(x)a(x)+p(x)c(x)=1,即滿足a(x)·b(x)≡1modp(x),因此a(x)是b(x)的乘法逆元。求GF(28)上域元素‘F5’(十六進制)的乘法逆元。(1)‘F5’用對應二進制為11110101,則用多項式表示為b(x)=x7+x6+x5+x4+x2+1然后計算兩個多項式a(x)和c(x)滿足(x7+x6+x5+x4+x2+1)·a(x)+p(x)c(x)=1(2)采用多項式的擴展歐幾里得算法按照如下步驟計算:-乘法逆元舉例因為:(x8+x4+x3+x+1)=(x7+x6+x5+x4+x2+1)(x+1)+x2(x7+x6+x5+x4+x2+1)=x2(x5+x4+x3+x2+1)+11=(x7+x6+x5+x4+x2+1)-x2(x5+x4+x3+x2+1)=(x7+x6+x5+x4+x2+1)-[(x8+x4+x3+x+1)-(x7+x6+x5+x4+x2+1)(x+1)](x5+x4+x3+x2+1)=(x8+x4+x3+x+1)(x5+x4+x3+x2+1)-(x7+x6+x5+x4+x2+1)[1+(x+1)(x5+x4+x3+x2+1)]=(x8+x4+x3+x+1)(x5+x4+x3+x2+1)-(x7+x6+x5+x4+x2+1)(x6+x2+x)-課堂作業(yè)1:請使用有限域GF(28)上的字節(jié)運算方法計算:(1)16進制的“12”與“59”的加法,即計算“12+59”的值;(2)16進制的“12”與“59”的乘法,即計算“12?59”的值。2025/8/12333.4.3AES算法描述

Rijndael是一種靈活的算法,加密明文分組塊的長度可變、密鑰長度也可變的分組密碼。分組長度、密鑰長度彼此獨立地確定為128、192、256比特,因而Rijndael算法可以9種不同的版本,而迭代次數(shù)與明文分組塊的大小和密鑰有關(如下表)。

輪數(shù)(Round)分組長度128bit分組長度192bit分組長度256bit密鑰128比特101214密鑰192比特121214密鑰256比特141414對于AES,只用了第一列,即明文長度固定為128比特2025/8/1234Rijndael算法不像DES算法,采用包含置換操作的典型的Feistel輪結構,而是進行多輪的替換、列混合和密鑰加操作,因此Rijndael本質上是采用代替/置換網(wǎng)絡的對稱分組密碼體制。

AES和Rijndael密碼算法并不完全一樣,AES算法限定了明文分組大小為128比特,而密鑰長度可為128、192、256比特,因而實際上AES有三個版本:AES-128、AES-192、AES-256,相應的迭代輪數(shù)為10輪、12輪、14輪。

AES算法是Rijndael算法的子集,但實際應用中,術語AES和Rijndael視為等價,可以交替使用。

AES加密過程是在一個4×4的字節(jié)矩陣上運作,這個矩陣又稱為“體(state)”或者“狀態(tài)”,其初值就是一個明文區(qū)塊(矩陣中一個元素單位大小就是明文區(qū)塊中的一個Byte(8比特))。加密時,明文塊與子密鑰首先進行一次輪密鑰加,然后各輪AES加密循環(huán)(除最后一輪外)均包含4個步驟,其結構如下頁圖所示。2025/8/12351.字節(jié)代替(SubBytes):通過一個非線性的替換函數(shù),用查找表的方式把每個字節(jié)替換成對應的字節(jié)。

2.行移位(ShiftRows):將矩陣中的每個橫列進行循環(huán)式移位。

3.列混合(MixColumns):為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每行內的四個字節(jié)。2025/8/12364.輪密鑰加(AddRoundKey):矩陣中的每一個字節(jié)都與該次循環(huán)的子密鑰(roundkey)做XOR邏輯運算;每個子密鑰由密鑰生成方案產生。

最后一個加密循環(huán)中沒有列混合(MixColumns)步驟,而以另一個輪密鑰加(AddRoundKey)取代。大多數(shù)AES計算是在由不可約多項式x8+x4+x3+x+1構造的有限域上完成的。AES的加密過程演示2025/8/12373.4.4基本變換

AES算法每次明文分組以及每次變換的中間結果分組稱為狀態(tài)(State)。

狀態(tài)用以字節(jié)(8比特位)為基本構成元素的矩陣陣列來表示,該陣列有4行,即每列為32比特,因而列數(shù)為分組長度除以32,通常記為Nb。

列數(shù):

Nb=分組長度(比特)÷32

Rijndael算法列數(shù)Nb可以取的值為4,6,8,對應的分組長度為128,192,256比特。

而AES算法的分組長度固定為128比特,以字節(jié)為基本單位轉換為狀態(tài)字節(jié),依順序

a00,a10,a20,a30,a01,…a23,a33,前4個字節(jié)組成第1列,后四個字節(jié)組成第2列,依次類推,AES算法明文分組可以構成一個4×4的字節(jié)矩陣,如下頁圖所示,加密結束時,輸出也是從狀態(tài)字節(jié)中按相同的順序提取。

2025/8/1238陣列狀態(tài)圖:

AES算法加密和解密過程中密碼密鑰(CipherKey)同樣以字節(jié)為基本單位轉換,因而依順序

k00,k10,k20,k30,k01,…k23,k33,…,為類似地用一個4行的矩陣陣列來表示,前4個字節(jié)組成第1列,后四個字節(jié)組成第2列,依次類推,列數(shù)記為Nk。

Nk=密鑰長度(比特)÷322025/8/1239

Rijndael算法和AES算法的密碼密鑰的列數(shù)Nk可以取的值為4、6、8,對應的密鑰長度為128、192、256bits,因而密碼密鑰構成一個4×4、4×6、4×8的密鑰字節(jié)矩陣。如下圖所示,192比特密鑰的密碼密鑰矩陣,Nk為6。密碼密鑰陣列狀態(tài)

2025/8/1240下面我們以一個128位塊為例,介紹AES加密算法基本變換的具體過程。若示例塊是由0和1組成的,輸入的128位塊為10000000010111100110101000110110010100110010010100111010011001100110001100110101011010010000001100100000011011000010100000000110為了表達簡潔,下面的AES算法基本變換的中間結果都用16進制來表示。則128比特二進制示例塊用16進制表示則對應為805E6A3653253A6663356903206C2806(如下表

所示)。2025/8/1241在進行AES加密算法過程中,首先把輸入明文128比特示例塊805E6A3653253A6663356903206C2806按照AES算法規(guī)則構成一個構成一個4×4的字節(jié)矩陣,如下圖所示。陣列狀態(tài)

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

Rijndael算法的字節(jié)變換(SubBytes)使用一個S盒(不像DES算法使用8個S盒)進行非線性置換。如下頁表所示,它將輸入或中間態(tài)的每一個字節(jié)通過一個簡單的查表操作,映射為另外一個字節(jié)。2025/8/1242映射方法:輸入字節(jié)前4位指定S盒的行值,后4位指定S盒的列值。有行和列所確定S盒位置的元素作為輸出(如下頁圖所示)。例如輸入字節(jié)“03”,行值為0,列值為3;根據(jù)上表可以查得第0行第3列對應的值為“7B”,輸出字節(jié)為“7B”。

2025/8/1243Rijndael算法字節(jié)代替操作

例如,輸入矩陣(用16進制表示)進入S盒替換操作,則相應的輸出如下所示:

2025/8/1244其實S盒是一個復雜的代數(shù)結構,S盒的設計是有一定限制條件的,其中的一些限制條件是:它應當是可逆的,不能存在這種情況:行i列j位置上的值為ij。實際Rijndael的S盒字節(jié)替代操作它包括兩個代數(shù)變換:2025/8/1245上面仿射變換用矩陣可以表示如下:

下面以輸入“F5”為示例來說明S盒替代操作它包括兩個變換,不通過查S盒表,而通過代數(shù)計算求解。首先求解“F5”由f(x)=x8+x4+x3+x+1構造GF(28)有限域上的乘法逆元,然后進行上式的變換。

2025/8/1246

1)其輸入十六進制“F5”對應二進制為“11110101”,多項式為(x7+x6+x5+x4+x2+1),求其模f(x)=x8+x4+x3+x+1的逆,即求b(x):

(x7+x6+x5+x4+x2+1)·b(x)≡1(modf(x))通過多項式歐幾里得擴展算法,求解得:

(x7+x6+x5+x4+x2+1)(x6+x2+x)≡1mod(x8+x4+x3+x+1)即:(x7+x6+x5+x4+x2+1)模(x8+x4+x3+x+1)的乘法逆元為x6+x2+x

,即‘F5’的乘法逆元為‘46’

2)十六進制‘46’其二進制為01000110,進行第2步的仿射變換,代入矩陣運算運行:即二進制結果為11100110,對應十六進制結果為“E6”,與查表S盒替代操作結果一樣。2025/8/12472.行移位(ShiftRows)

在Rijndael算法中,行移位操作作用于S盒的輸出。其中,狀態(tài)陣列的4個行循環(huán)以字節(jié)為基本單位進行左移,而每1行循環(huán)做移的偏移量是由明文分組的大小和所在行數(shù)共同確定,即列數(shù)Nb和行號確定。設狀態(tài)陣列的每行用Ci來表示,那么每行偏移量如下表所示:

AES算法中Nb為4,即第1行循環(huán)左移0字節(jié),第二行循環(huán)左移1字節(jié),第三行循環(huán)左移2字節(jié),第四行循環(huán)左移3字節(jié),如下頁圖。從該圖中可以看出,這使得列完全進行了重排。2025/8/1248行移位操作

例如,輸入矩陣(用16進制表示)進入行移位操作,則相應的輸出如下所示:2025/8/12493.列混合(MixColumns)

列混合操作可以將輸入的狀態(tài)矩陣的每列看作是有限域GF(28)上的多項式b(x),與多項式s(x)=03x3+01x2+01x+02相乘然后模x4+1,其中多項式的系數(shù)為有限域GF(28)的運算。其方法為令c(x)=s(x)×b(x)mod(x4+1),因而列混合是可以表示為矩陣相乘來實現(xiàn),進行移位后的矩陣與固定矩陣(十六進制表示)相乘,如下所示:2025/8/1250列混合操作如下圖所示:例如,輸入矩陣(用16進制表示)進入列混合操作,則相應的輸出如下所示:2025/8/1251例如:第1行02,03,01,01與第1列E6,1B,50,18相乘,其中符號“*”和“⊕”分別為有限域GF(28)的乘法和加法運算,具體操作如下:可以看到通過列混合操作第1列包含字節(jié)為B2、38、75、4A,經過這些操作明文經過幾輪迭代后高度打亂了,同時還保證輸入和輸出之間關聯(lián)很少了。2025/8/12524.輪密鑰加(AddRoundKey)

最后一階段是將列混合的狀態(tài)矩陣與子密鑰進行XOR邏輯運算(子密鑰是從初始密鑰派生而來的),即將輪密鑰與狀態(tài)按比特異或。輪密鑰是通過密鑰調度過程從密碼密鑰中得到的,輪密鑰長度等于分組長度。如下圖,這完成了算法的一次迭代。2025/8/1253例如,輸入狀態(tài)矩陣和子密鑰矩陣(用16進制表示)進入輪密鑰加操作,則相應的輸出如下所示:2025/8/1254-AES加密過程的流程圖(如右):加密算法的描述及實現(xiàn)Rijndael解密算法用偽C語言表示如下:Rijndael-Chiper(bytein[4*Nb],byteout[4*Nb],wordw[Nb*Nr+1])Beginbytestate[4,Nb]state=inAddRoundKey(State,w[0,Nb-1])forround=1step1toNr-1SubBytes(state)ShiftRows(state)MixColumn(state)AddRoundKey(State,w[round*Nb,(round+1)*Nb-1])EndforSubBytes(state)ShiftRows(state)AddRoundKey(State,w[Nr*Nb,(round+1)*Nb-1])Out=stateend-加密的具體過程:首先將明文分組復制到矩陣中,經過初始輪密鑰加后,在執(zhí)行Nr-1次輪變換來轉變狀態(tài)矩陣,最后一輪與前Nr-1輪不同之處在于這一輪沒有列混合變換;最后將狀態(tài)矩陣中的各個字節(jié)按順序輸出就得到密文分組。2025/8/12563.4.5密鑰擴展

Rijndael算法的密鑰按照矩陣的列進行分組,密鑰比特的總數(shù)等于明文分組長度乘以輪數(shù)加1,即密鑰bit的總數(shù)=分組長度×(輪數(shù)Round+1)。例如當明文分組長度為128bits和輪數(shù)Round為10時,輪密鑰長度為128×(10+1)=1408bits,則需要添加40個新列來進行擴充;當明文分組為128bits和輪數(shù)Round為12時,輪密鑰長度為128×(12+1)=1664bits,則需要添加46個新列來進行擴充。

Rijndael算法由于密碼密鑰Nk列數(shù)的不同,其密鑰擴展算法有所不同。2025/8/1257下面以密鑰長度128比特為例,Nk=4,其密鑰擴展示意圖如下圖。首先初始密鑰按照矩陣列進行分組,前4列初始密鑰計為K0,K1,K2,K3,那么新的列如下遞歸:

(1)如果Ki中,i不是4的倍數(shù),那么i列由如下等式確定:

Ki=Ki-4XORKi-1

NK=4的密鑰擴展示意圖

2025/8/1258其中T[Ki-1]是Ki-1的一種轉換形式,按以下方式實現(xiàn):

循環(huán)地將Ki-1的元素左移位,每次一個字節(jié),如

abcd變成bcda②

將這4個字節(jié)作為S盒的輸入,輸出新的4個字節(jié)efgh③

計算一輪的常量

r(i)=Rcon(j/NK)④

這樣生成轉換后的列:[eXORr(i),f,g,h]第i輪的輪密鑰組成了列K4i,K4i+1,K4i+2,K4i+3.

(2)如果Ki中,i是4的倍數(shù),那么i列由如下等式確定:

Ki=Ki-4XORT[Ki-1]

實例:設初始種子密鑰為

K0=75356B99,K1=05613956,K2=73620531,K3=00550932,下一個子密鑰段為K4,由于i是4的倍數(shù),所以K4計算如下:

K4=K0XORT[K3]2025/8/1259T[K3]的計算要涉及Rcon數(shù)組,下面解釋下Rcon數(shù)組的計算。

密鑰擴展中:Rcon[i]=(RC[i],

’00’,’00’,’00’)RC[1]=1(即’01’)RC[i]=2*RC[i-1]=(02)(i-1);i=2,3,......也即RC[i]=x(i-1)modp(x);i=2,3,......其中,p(x)=x8+x4+x3+x+1-Rcon[i]的計算:RC[1]=’01’(00000001)Rcon[1]=(’01’,00,00,00)RC[2]=‘02’(00000010)Rcon[2]=(’02’,00,00,00)RC[3]=‘04’(00000100)Rcon[3]=(’04’,00,00,00)RC[4]=‘08’(00001000)Rcon[4]=(’08’,00,00,00)RC[5]=‘10’(00010000)Rcon[5]=(’10’,00,00,00)RC[6]=‘20’(00100000)Rcon[6]=(’20’,00,00,00)RC[7]=‘40’(01000000)Rcon[7]=(’40’,00,00,00)RC[8]=‘80’(01000000)Rcon[8]=(’80’,00,00,00)RC[9]=‘1b’(00011011)Rcon[9]=(’1b’,00,00,00)RC[10]=‘36’(00110110)Rcon[10]=(’36’,00,00,00)RC[i]2025/8/1261實例:設初始種子密鑰為

K0=75356B99,K1=05613956,K2=73620531,K3=00550932,下一個子密鑰段為K4,由于i是4的倍數(shù),所以K4計算如下:

K4=K0XORT[K3]2025/8/1262T[K3]的計算步驟如下:

(1)循環(huán)將K3按照字節(jié)為單位左移1字節(jié),00550932變成了55093200

(2)將55093200作為S盒的輸入,查表得到輸出

fc012363

(3)計算常量Rcon(i)=(RC[i],00,00,00)異或,RC[i/NK]=RC[4/4]RC[1]=0x01(十六進制)(4)將01000000與fc012363異或運算得fd012363

因此,T[K3]=fd012363

K4=75356B99XORfd012363=883448fa

接著三列密鑰計算如下:

K5=Ki-4XORKi-1=K1XORK4=05613956XOR883448fa=8d5571ac;K6=Ki-4

XORKi-1=K2XORK5=73620531XOR8d5571ac=fe37749d;K7=Ki-4

XORKi-1=K3XORK6=00550932XORfe37749d=fe627daf;2025/8/1263

因此下一輪得密鑰為:883448fa8d5571acfe37749dfe627daf按照上述算法依次擴展,128位密鑰由種子密鑰擴展K4,K5,…,

K43為止。密鑰擴展完成之后,進行輪密鑰選取。

密鑰選取非常簡單,從擴展密鑰中取出輪密鑰:第一個輪密鑰由擴展密鑰的第一個Nb個字(其實就是Nb列),第二個輪密鑰由接下來的Nb個字組成,以此類推。其結構如下圖所示:輪密鑰選擇

Wi-4Wi-3Wi-2Wi-1WiByteSubstituionByteRotate+Rcons+密鑰擴展(128)4=<i<4(Rnd+1)imod4=0imod4!=0Wi-6Wi-5Wi-4Wi-3Wi-2ByteSubstituionByteRotate+Rcons+6=<i<6(Rnd+1)imod6=0imod6!=0Wi-1Wi密鑰擴展(192)Nk<=6若Nk<=6,則有:

KeyExpansion(byteKey[4*Nk],W[Nb*(Nr+1)]){for(i=0;i<Nk;i++)W[i]=(Key[4*i],Key[4*i+1],Key[4*i+2],Key[4*i+3]);for(i=Nk;i<Nb*(Nr+1);i++){temp=W[i-1];

if(i%Nk==0)

temp=SubByte(RotByte(temp))^Rcon[i/Nk];W[i]=W[i-Nk]^temp;}}Wi-6Wi-5Wi-4Wi-3Wi-2ByteSubstituion++密鑰擴展8=<i<8(Rnd+1)imod8=0imod4!=0Wi-1WiWi-8Wi-7ByteSubstituionByteRotate+Rconsimod4=0密鑰擴展(256)Nk=8時的密鑰擴展KeyExpansion(byteKey[4*Nk],W[Nb*(Nr+1)]){for(i=0;i<Nk;i++)W[i]=(Key[4*i],Key[4*i+1],Key[4*i+2],Key[4*i+3]);for(i=Nk;i<Nb*(Nr+1);i++){temp=W[i-1];

if(i%Nk==0)temp=SubByte(RotByte(temp))^Rcon[i/Nk];

elseif(i%Nk==4)temp=SubByte(temp);W[i]=W[i-Nk]^temp;}}Rijndael密鑰擴展算法用偽C語言表示如下:Rijndael-KeyExpansion(bytekey[4*Nk],wordw[Nb*(Nr+1]),Nk)Beginwordtempi=0while(i<Nk)w[i]=word(key(4*i],key(4*i+1],key(4*i+2],key(4*i+3])i=i+1endwhilei=Nkwhile(i<Nb*(Nr+1))temp=w[i-1]if(imodNk=0)temp=Subword(RotWord(temp))xorRcon[i/Nk]elseifw[i]=w[i-Nk]xortempi=i+1endwhileend密鑰擴展算法的描述及實現(xiàn)(Nk=4或6)

2025/8/12703.4.6解密過程

由AES解密過程中的基本運算,除了輪密鑰加AddRoundKey與AES加密算法中一樣,其它基本運算字節(jié)替代SubBytes、行移位ShiftRows、列混合MixColumns都要求逆,解密過程中的基本運算為逆字節(jié)替代InvSubBytes、逆行移位InvShiftRows、逆列混合InvMixColumns。解密結構如下圖所示。2025/8/12711.逆字節(jié)代替(InvSubBytes)

Rijndael算法的逆字節(jié)變換(InvSubBytes)是與字節(jié)替代一樣,它將輸入或中間狀態(tài)的每一個字節(jié)通過一個簡單查表操作,只是查表操作變?yōu)椴槟鍿盒,逆S盒如右表所示。映射方法是:輸入字節(jié)前4位指定逆S盒的行值,后4位指定逆S盒的列值,有行和列所確定逆S盒位置的元素作為輸出。

2025/8/1272同樣,Rijndael的逆S盒替代操作它包括兩個變換,其變換順序與S盒剛好相反,先進行仿射變換的逆變換,然后進行求逆運算:(1)在GF(2)上進行下面的仿射變換,每個字節(jié)可以依次記為(b7,b6,b5,b4,b3,b2,b1,b0),依次做下面的仿射變換:其中di是指字節(jié)(05=00000101)中的第i位的值。上面逆仿射變換用矩陣可以表示為:

2025/8/12732025/8/12742.逆行移位(InvShiftRows)

在Rijndael算法中,逆行移位操作與行移位操作相反,行移位操作循環(huán)左移,而逆行移位操作則循環(huán)向右移。若AES算法中Nb為4,即第1行循環(huán)右移0字節(jié),第2行循環(huán)右移1字節(jié),第3行循環(huán)右移2字節(jié),第4行循環(huán)右移3字節(jié),如下圖所示。從該圖中可以看出,這使得列完全進行了重排。

2025/8/12753.逆列混合(InvMixColumns)

逆列混合操作與列混合操作一樣,只是多項式不同,則逆列混合操作多項式d(x)=0Bx3+0Dx2+09x+0E相乘然后模x4+1,因而逆列混合是可以表示為矩陣相乘來實現(xiàn),輸入的矩陣與固定矩陣(十六進制表示)相乘,如下所示:其圖形表示如下圖所示:

Rijndael加密算法用偽C語言表示如下:Rijndael-InvChiper(bytein[4*Nb],byteout[4*Nb],wordw[Nb*Nr+1])Beginbytestate[4,Nb]state=inAddRoundKey(State,w[Nr*Nb,(round+1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論