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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

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

假設(shè)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

此處加法和乘法是專門的數(shù)學(xué)域操作,而不是平常整數(shù)的加法和乘法。

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

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

GF(28)由一組從0*00到0*ff的256個值組成,加上加法和乘法,因此是(28)。GF代表伽羅瓦域,以創(chuàng)造這一理論的數(shù)學(xué)家的名字命名。GF(28)的一個特性是一個加法或乘法的操作的結(jié)果必須是在{0*00...0*ff}這組數(shù)中。雖然域論是相當(dāng)深奧的,但GF(28)加法的最終結(jié)果卻很簡單。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)的乘法,而只是針對這七種特殊情況進(jìn)展說明。

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

現(xiàn)在讓我們看看用0*02做乘法。和加法的情況一樣,理論是深奧的,但最終結(jié)果十分簡單。只要被乘的值小于0*80,這時乘法的結(jié)果就是該值左移1比特位。如果被乘的值大于或等于0*80,這時乘法的結(jié)果就是左移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ī)中包括大量有關(guān)GF(28)操作的附加信息。

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

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

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

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

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

現(xiàn)在讓我們更進(jìn)一步看看KeyE*pansion幕中的循環(huán)。這里所用的偽碼比以前更為詳細(xì),這個循環(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子句,你將看到密鑰調(diào)度表w[]的每一行都是前面一行與行Nk異或的結(jié)果〔4,6,或8取決于密鑰的長度〕。if條件的第一局部用SubWord、RotWord以及與輪常數(shù)的異或修改密鑰調(diào)度表的每個第4、第6或第8行,取決于是否密鑰的長度是128、192或256位。這個條件的第二局部將修改行12、20和28等等——對于256位密鑰而言——每一個第8行都將添加密鑰調(diào)度額外的可變性。

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

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

原文轉(zhuǎn)換格式顯示:"

+

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

string=?byte=?He*

//

======生成密碼

KeyGenerator

kgen

=

KeyGenerator.getInstance("AES");//

獲取密

溫馨提示

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

評論

0/150

提交評論