AES加密算法原理圖文_第1頁
AES加密算法原理圖文_第2頁
AES加密算法原理圖文_第3頁
AES加密算法原理圖文_第4頁
AES加密算法原理圖文_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-.zAES加密算法原理〔圖文〕隨著對稱密碼的開展,DES數據加密標準算法由于密鑰長度較小(56位),已經不適應當今分布式開放網絡對數據加密平安性的要求,因此1997年NIST公開征集新的數據加密標準,即AES[1]。經過三輪的篩選,比利時JoanDaeman和VincentRijmen提交的Rijndael算法被提議為AES的最終算法。此算法將成為美國新的數據加密標準而被廣泛應用在各個領域中。盡管人們對AES還有不同的看法,但總體來說,AES作為新一代的數據加密標準會聚了強平安性、高性能、高效率、易用和靈活等優(yōu)點。AES設計有三個密鑰長度:128,192,256位,相對而言,AES的128密鑰比DES的56密鑰強1021倍[2]。AES算法主要包括三個方面:輪變化、圈數和密鑰擴展。

AES是一個新的可以用于保護電子數據的加密算法。明確地說,AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,并且用128位〔16字節(jié)〕分組加密和解密數據。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用一樣的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據一樣。迭代加密使用一個循環(huán)構造,在該循環(huán)中重復置換〔permutations〕和替換(substitutions〕輸入數據。Figure1顯示了AES用192位密鑰對一個16位字節(jié)數據塊進展加密和解密的情形。Figure1局部數據AES算法概述AES算法是基于置換和代替的。置換是數據的重新排列,而代替是用一個單元數據替換另一個。AES使用了幾種不同的技術來實現(xiàn)置換和替換。為了說明這些技術,讓我們用Figure1所示的數據討論一個具體的AES加密例子。下面是你要加密的128位值以及它們對應的索引數組:00112233445566778899aabbccddeeff0123456789101112131415

192位密鑰的值是:000102030405060708090a0b0c0d0e0f101112131415161701234567891011121314151617181920212223Figure2S-盒〔Sbo*〕當AES的構造函數〔constructor〕被調用時,用于加密方法的兩個表被初始化。第一個表是代替盒稱為S-盒。它是一個16×16的矩陣。S-盒的前五行和前五列如Figure2所示。在幕后,加密例程獲取該密鑰數組并用它來生成一個名為w[]的密鑰調度表,F(xiàn)igure3所示。Figure3密鑰調度表〔KeySched〕w[]最初的Nk(6)行被作為種子,用原始密鑰值〔0*00到0*17〕。剩余行從種子密鑰來產生。變量Nk代表以32位字為單位的種子密鑰長度。稍后我分析AES實現(xiàn)時你將清楚地看到w[]是怎樣產生的。關鍵是這里現(xiàn)在有許多密鑰使用而不只是一個。這些新的密鑰被稱為輪密鑰〔roundkeys〕以將它們與原始種子密鑰區(qū)別開來。Figure4State〔態(tài)〕數組AES加密例程開場是拷貝16字節(jié)的輸入數組到一個名為State〔態(tài)〕的4×4字節(jié)矩陣中。〔參見Figure4〕。AES加密算法取名為Cipher,它操作State[],其過程描述的偽代碼參見Figure5。

在規(guī)中,加密算法實現(xiàn)的一個預備的處理步驟被稱為AddRoundKey〔輪密鑰加〕。AddRoundKey用密鑰調度表中的前四行對State矩陣實行一個字節(jié)一個字節(jié)的異或〔*OR〕操作,并用輪密鑰表w[c,r]異或輸入State[r,c]。

舉個例子,如果State矩陣的第一行保存的字節(jié)是{00,44,88,cc},第一列密鑰調度表是{00,04,08,0c},則新的State[0,2]值是用w[2,0](0*08或0*80)異或State[0,2](0*88)的結果:1000100000001000*OR10000000

AES算法的主循環(huán)對State矩陣執(zhí)行四個不同的操作,在規(guī)中被稱為SubBytes〔字節(jié)替換〕、ShiftRows〔行位移變換〕、Mi*Columns〔列混合變換〕和AddRoundKey。除了每次循環(huán)AddRoundKey都被調用并使用密鑰調度表的下面四行外,AddRoundKey與預備處理步驟中的AddRoundKey一樣。SubBytes例程是一個代替操作,它將State矩陣中的每個字節(jié)替換成一個由Sbo*決定的新字節(jié)。比方,如果State[0,1]的值是0*40如果你想找到它的代替者,你取State[0,1]的值(0*40)并讓*等于左邊的數字(4)并讓y等于右邊的數字(0)。然后你用*和y作為索引進到Sbo*表中尋找代替值,如Figure2所示。

ShiftRows是一個置換操作,它將State矩陣中的字節(jié)向左旋轉。Figure6示了ShiftRows如何操作State[]。State的第0行被向左旋轉0個位置,State的第1行被向左旋轉1個位置,State的第2行被向左旋轉2個位置,而State的第3行被向左旋轉3個位置。Figure6對State進展ShiftRows操作Mi*Columns是一個代替操作,它是理解AES算法時最具技巧〔或者說是最需要動腦筋的局部〕的局部。它用State字節(jié)列的值進展數學域加和域乘的結果代替每個字節(jié)。我將在下一節(jié)中詳細解釋專門的域加和域乘細節(jié)。

假設State[0,1]的值是0*09,并且列1上的其它值分別為0*60,0*e1和0*04,則State[0,1]的新值計算如下:

[cpp]viewplaincopyState[0,1]

=

(State[0,1]

*

0*01)

+

(State[1,1]

*

0*02)

+(State[2,1]

*

0*03)

+(State[3,1]

*

0*01)=

(0*09

*

0*01)

+

(0*60

*

0*02)

+

(0*e1

*

0*03)

+(0*04

*

0*01)=

0*57

此處加法和乘法是專門的數學域操作,而不是平常整數的加法和乘法。

SubBytes、ShiftRows、Mi*Columns和AddRoundKey四個操作在一個執(zhí)行Nr次的循環(huán)里被調用,Nr為給定密鑰大小的輪數減1。加密算法使用的輪數要么是10,12,要么是14,這依賴于種子密鑰長度是128位、192位還是256位。在這個例子中,因為Nr等于12,則這四個操作被調用11次。該迭代完成后,在拷貝State矩陣到輸出參數前,加密算法調用SubBytes、ShiftRows和AddRoundKey后完畢。

大致說來,AES加密算法的核心有四個操作。AddRoundKey使用從種子密鑰值中生成的輪密鑰代替4組字節(jié)。SubBytes替換用一個代替表替換單個字節(jié)。ShiftRows通過旋轉4字節(jié)行的4組字節(jié)進展序列置換。Mi*Columns用域加和域乘的組合來替換字節(jié)。有限域GF(28)的加法和乘法正如你所看到的,AES加密算法使用相當簡單明了的技術來代替和置換,除Mi*Columns例程以外。Mi*Columns使用特殊的加法和乘法。AES所用的加法和乘法是基于數學〔譯者注:近世代數〕的域論。尤其是AES基于有限域GF(28)。

GF(28)由一組從0*00到0*ff的256個值組成,加上加法和乘法,因此是(28)。GF代表伽羅瓦域,以創(chuàng)造這一理論的數學家的名字命名。GF(28)的一個特性是一個加法或乘法的操作的結果必須是在{0*00...0*ff}這組數中。雖然域論是相當深奧的,但GF(28)加法的最終結果卻很簡單。GF(28)加法就是異或〔*OR〕操作。

然而,GF(28)的乘法有點繁難。正如你稍后將在C*實現(xiàn)中所看到的,AES的加密和解密例程需要知道怎樣只用七個常量0*01、0*02、0*03、0*09、0*0b、0*0d和0*0e來相乘。所以我不全面介紹GF(28)的乘法,而只是針對這七種特殊情況進展說明。

在GF(28)中用0*01的乘法是特殊的;它相當于普通算術中用1做乘法并且結果也同樣—任何值乘0*01等于其自身。

現(xiàn)在讓我們看看用0*02做乘法。和加法的情況一樣,理論是深奧的,但最終結果十分簡單。只要被乘的值小于0*80,這時乘法的結果就是該值左移1比特位。如果被乘的值大于或等于0*80,這時乘法的結果就是左移1比特位再用值0*1b異或。它防止了“域溢出〞并保持乘法的乘積在圍以。

一旦你在GF(28)中用0*02建立了加法和乘法,你就可以用任何常量去定義乘法。用0*03做乘法時,你可以將0*03分解為2的冪之和。為了用0*03乘以任意字節(jié)b,因為0*03=0*02+0*01,因此:b*0*03=b*(0*02+0*01)=(b*0*02)+(b*0*01)這是可以行得通的,因為你知道如何用0*02和0*01相乘和相加,同哩,用0*0d去乘以任意字節(jié)b可以這樣做:[cpp]viewplaincopyb

*

0*0d

=

b

*

(0*08

+

0*04

+

0*01)

=

(b

*

0*08)

+

(b

*

0*04)

+

(b

*

0*01)

=

(b

*

0*02

*

0*02

*

0*02)

+

(b

*

0*02

*

0*02)

+

(b

*

0*01)

在加解密算法中,AESMi*Columns例程的其它乘法遵循大體一樣的模式,如下所示:[cpp]viewplaincopyb

*

0*09

=

b

*

(0*08

+

0*01)

=

(b

*

0*02

*

0*02

*

0*02)

+

(b

*

0*01)b

*

0*0b

=

b

*

(0*08

+

0*02

+

0*01)

=

(b

*

0*02

*

0*02

*

0*02)

+

(b

*

0*02)

+

(b

*

0*01)b

*

0*0e

=

b

*

(0*08

+

0*04

+

0*02)

=

(b

*

0*02

*

0*02

*

0*02)

+

(b

*

0*02

*

0*02)

+

(b

*

0*02)

總之,在GF(28)中,加法是異或操作。其乘法將分解成加法和用0*02做的乘法,而用0*02做的乘法是一個有條件的左移1比特位。AES規(guī)中包括大量有關GF(28)操作的附加信息。

密鑰擴展AES加密和解密算法使用了一個由種子密鑰字節(jié)數組生成的密鑰調度表。AES規(guī)中稱之為密鑰擴展例程〔KeyE*pansion〕。從本質上講,從一個原始密鑰中生成多重密鑰以代替使用單個密鑰大大增加了比特位的擴散。雖然不是無法抵御的困難,但理解KeyE*pansion仍是AES算法中的一個難點。KeyE*pansion例程高級偽代碼如下所示:KeyE*pansion(byte[]key,byte[][4]w){copytheseedkeyintothefirstrowsofwforeachremainingrowofw{usetwoofthepreviousrowstocreateanewrow}}“用前面兩行來產生一個新行〞〔“usetwoofthepreviousrowstocreateanewrow〞〕的例程用到了兩個子例程,RotWord和SubWord以及一個名為“Rcon〞的常數表〔作為“輪常數〞〕。讓我們先來逐個看一下這三東西,然后再回到整個KeyE*pansion的討論中來。

RotWord例程很簡單。它承受一個4個字節(jié)的數組并將它們向左旋轉一個位置。因為輪調度表w[]有四列,RotWord將w[]的1行左旋。注意KeyE*pansion使用的這個RotWord函數與加密算法使用的ShiftRows〔行位移變換〕例程非常相似,只是它處理的是單行密鑰調度w[],而不是整個加密狀態(tài)表State[]。

SubWord例程使用替換表Sbo*對一給定的一行密鑰調度表w[]進展逐字節(jié)替換。KeyE*pansion操作中的替換實際上就像在加密算法中的替換一樣。被代替的輸入字節(jié)被分成(*,y)對,它被當作進入替換表Sbo*的索引。舉例來說,0*27的代替結果是*=2和y=7,并且Sbo*[2,7]返回0*cc。

KeyE*pansion例程使用一個被稱為輪常數表的數組Rcon[]。這些常數都是4個字節(jié),每一個與密鑰調度表的*一行相匹配。AES的KeyE*pansion例程需要11個輪常數。你可以在Figure7中看到這些常數清單。

每個輪常數的最左邊的字節(jié)是GF(28)域中2的冪次方。它的另一個表示方法是其每個值是前一個值乘上0*02,正如前一局部討論GF(28)乘法時所描述的那樣。注意0*80×0*02=0*1b是0*80左移1個比特位后緊接著與0*1b進展異或,如前所述。

現(xiàn)在讓我們更進一步看看KeyE*pansion幕中的循環(huán)。這里所用的偽碼比以前更為詳細,這個循環(huán)是:[cpp]viewplaincopyfor

(row

=

Nk;

row

<

(4

*

Nr+1);

++row)

{

temp

=

w[row-1]

if

(row

%

Nk

==

0)

temp

=

SubWord(RotWord(temp))

*or

Rcon[row/Nk]

elseif

(Nk

==

8

and

row

%

Nk

==

4)

temp

=

SubWord(temp)

w[row]

=

w[row-Nk]

*or

temp

}

先不要去看if子句,你將看到密鑰調度表w[]的每一行都是前面一行與行Nk異或的結果〔4,6,或8取決于密鑰的長度〕。if條件的第一局部用SubWord、RotWord以及與輪常數的異或修改密鑰調度表的每個第4、第6或第8行,取決于是否密鑰的長度是128、192或256位。這個條件的第二局部將修改行12、20和28等等——對于256位密鑰而言——每一個第8行都將添加密鑰調度額外的可變性。

讓我們用本文開頭所舉的例子來考察KeyE*pansion是如何開場的。種子密鑰是192-bit/6-word值:000102030405060708090a0b0c0d0e0f1011121314151617密鑰調度字節(jié)表w[]的維數是4列并且Nb×(Nr+1)等于4×(12+1),或52行。KeyE*pansion將種子密鑰的值拷貝到密鑰調度字節(jié)表w[]的第一行。因為我的種子密鑰是192位〔24字節(jié)〕,并且w[]表總是4列,在這種情況下KeyE*apansion將種子密鑰拷貝到w[]的前面6行?,F(xiàn)在讓我們看看KeyE*apansion例程是如何填充密鑰調度表其余局部的。在我的例子里,第一個被計算的行是第6行,因為第0-5行已被種子密鑰的值填上了:temp=w[row-1]=14151617條件(row%Nk==0)為真,因此首先RotWord子程序被應用:

temp=15161714這時SubWord被應用:temp=5947f0fa用Rcon[row/Nk]=Rcon[6/6]=01000000進展異或:temp=5847f0fa這時用w[row-Nk]=w[6-6]=00010203異或,產生了下面結果:w[6]=5846f2f一.AES對稱加密:AES加密分組二.分組密碼的填充分組密碼的填充PKCS*5填充方式三.流密碼四.分組密碼加密中的四種模式:3.1ECB模式優(yōu)點:1.簡單;2.有利于并行計算;3.誤差不會被傳送;缺點:1.不能隱藏明文的模式;2.可能對明文進展主動攻擊;3.2CBC模式:優(yōu)點:1.不容易主動攻擊,平安性好于ECB,適合傳輸長度長的報文,是SSL、IPSec的標準。缺點:1.不利于并行計算;2.誤差傳遞;3.需要初始化向量IV3.3CFB模式:優(yōu)點:1.隱藏了明文模式;2.分組密碼轉化為流模式;3.可以及時加密傳送小于分組的數據;缺點:1.不利于并行計算;2.對明文的主動攻擊是可能的;3.誤差傳送:一個明文單元損壞影響多個單元;優(yōu)點:1.隱藏了明文模式;2.分組密碼轉化為流模式;3.可以及時加密傳送小于分組的數據;缺點:1.不利于并行計算;2.誤差傳送:一個明文單元損壞影響多個單元;3.唯一的IV;3.4OFB模式:下面是例如代碼:[java]viewplaincopypackage

mini.code.test.t20210810;

import

java*.crypto.*;

import

java*.crypto.spec.*;

publicclass

AES

{

publicstatic

String

asHe*(byte

buf[])

{

StringBuffer

strbuf

=

new

StringBuffer(buf.length

*

2);

int

i;

for

(i

=

0;

i

<

buf.length;

i++)

{

if

(((int)

buf[i]

&

0*ff)

<

0*10)

strbuf.append("0");

strbuf.append(Long.toString((int)

buf[i]

&

0*ff,

16));

}

return

strbuf.toString();

}

publicstaticvoid

main(String[]

args)

throws

E*ception

{

String

message

=

"這是個加密的例子";

System.out.println("

原文:

"

+

message);

System.out.println("

原文轉換格式顯示:"

+

asHe*(message.getBytes()));//

string=?byte=?He*

//

======生成密碼

KeyGenerator

kgen

=

KeyGenerator.getInstance("AES");//

獲取密

溫馨提示

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

評論

0/150

提交評論