AES演算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES使用幾種不同的方法來執行排列和置換運算。AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,並且用128位(16位元組)分組加密和解密數據。與公共密鑰加密使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。密碼學簡介據記載,公元前400年,古希臘人發明了置換密碼。1881年世界上的第一個電話保密專利出現。在第二次世界大戰期間,德國軍方啟用「恩尼格瑪」密碼機,密碼學在戰爭中起著非常重要的作用。
AES加密演算法主要步驟
1.1 AES演算法整體描述
l 給定一個明文x,將State初始化為x,並進行AddRoundKey操作,將RoundKey與State異或。
l 對前Nr-1輪中的每一輪,用S盒對進行一次代換操作,稱為SubBytes;對State做一置換ShiftRows;再對State做一次操作MixColumns;然後進行AddRoundKey操作。
l 依次進行SubBytes、ShiftRows和AddRoundKey操作。
l 將State定義為密文y。
1.2 偽代碼
Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
byte state[4,Nb]
state = in
AddRoundKey(state, w[0, Nb-1])
for round = 1 step 1 to Nr-1
SubBytes(state)
ShiftRows(state)
MixColumns(state)
AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
end for
SubBytes(state)
ShiftRows(state)
AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
out = state
end
2 KeyExpansion()實現
2.1要求
將128 bit的密鑰擴展至加密過程中的9輪循環,再上初始及最後2輪,需構造11輪密鑰。每一輪密鑰由4個字組成。每個字由4個byte組成。
2.2 演算法設計
輸入:byte[] key, byte[] w //key為密鑰 w為擴展的密鑰
輸出:byte[] w //擴展密鑰 長度為4 * 4 * 11
處理:
1)建立一個4 byte的一維數組,存放一個字。Byte[] temp;
2)將密鑰key[0..15]送至w[0..15];//已賦值4個字給w。
3) for I = 4 to 43
//以下每次處理一個字(32 bit)
temp = w[I-1];
if (I = 0 mod 4) //處理一個字 then
for j = 1 to 4 //字的4 byte處理
在此循環中取temp數組下標的次序為1,2,3,0 //RotWord 操作
如果是字的首byte,取Rcon常數Rcon(I/4);
temp[j] = Sbox(temp[ (j + 1) /4]^Rcon常數
end for
temp = SubWord(RotWord(temp))⊕Rcon[i/4]
end if
w[I] = w[I-4]⊕temp;
end for
4) 輸出w
3多項式乘法mod GF(28)運算
3.1要求
將兩個byte在有限域GF(28)按多項式乘法,並mod 不可約多項式m(x)=x8+x4+x3+x+1。
3.2 演算法設計
輸入:byte a ,byte b
輸出:byte r
數學基礎:
GF(28)有限域性質:兩個元素的加法與兩個位元組按位模2加是一致的;乘法滿足結合律;
考慮多項式中的一項aixi(i∈0-7),用一次x乘以多項式:
b(x) = b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x + b0,
得到
b7x8 + b6x7 + b5x6 + b4x5 + b3x4 + b2x3 + b1x2 + b0x (式1)
將結果模m(x)求余得到x*b(x)。
如果b7 = 0,則式1就是x*b(x)。
如果b7 不等於0,則必須從式1中減去m(x)後結果為x*b(x)。用x乘一個多項式簡稱x乘。
由此得出,aixi 乘以b(x),可以作i次x乘。x(十六進製表示為0x02)乘可以用位元組內左移一位和緊接著的一個與0x1b的按位模2加來實現,該運算暫記為xtime()。X的更高次的乘法可以通過重復應用xtime()來實現。通過將中間結果相加,任意乘法都可以利用xtime()來實現。例如:
57 * 13 = fe ,這是因為:
57 * 02 = xtime(57) = ae
57 * 04 = xtime(ae) = 47
57 * 08 = xtime(47) = 8e
57 * 10 = xtime(8e) = 07
所以
57 * 13 = 57 * ( 01⊕ 02 ⊕10 )
= 57⊕ ae⊕ 07
= fe
4 Sbox生成
4.1要求
一個位元組byte看作為一個在有限域GF(28)的多項式,求出它關於模m(x)的乘法逆,之後將該乘法逆在GF(2)上作仿射變換。
4.2 演算法設計
輸入:byte a
輸出:byte[] S
數學邏輯:
由有限域GF(28)性質。某個生成元(也是本原元)a,其a^(28-1) ≡ 1 mod m(x)。或a255 ≡ 1 mod m(x)。另外,a的從1到28-1的冪的值是構成了有限域GF(28)。
由乘法逆的性質b * b -1 ≡ 1。求乘法逆可簡化如下
設 x = am ,設y是x的乘法逆,則y = a255-m
處理:
建立三個一組數組,分別為:byte S[255],byte L[255],byte E[255]。
取本原元為a = 0x03,
將a的0,1,2…255次方mod m(x)分另送至數組L中。a的運算參考前面的多項式乘法運算。如下偽碼:
For i = 0 to 255
L[i] = ai (式2)
End for
為方便計算乘法逆的指數,數組E存放ai的冪指數i。將式2中ai值為數組E的下標,而將ai在數組L中的下標i作為數組E中對應的值。對應(式2)每一項有E[ai] = i。
由上面兩個數組L,E,可得到GF(28)域中的任一byte的乘法逆。
設位元組c它由ai生成的。其中a是GF(28)域中的生成元。欲求c的乘法逆。只需要找到a255-i即可。在數組E中可以由c查出生成元a的冪指數i。c-1的冪指數255-i。所以c-1 = L[255-i]。
對每一個位元組byte根據以上內容得到乘法逆,作仿射變換得到數組S。即為Sbox
Ⅱ AES演算法原理
AES加密過程是在一個4×4的位元組矩陣上運作,這個矩陣又稱為「體(state)」,其初值就是一個明文區塊(矩陣中一個
元素大小就是明文區塊中的一個Byte)。(Rijndael加密法因支持更大的區塊,其矩陣行數可視情況增加)加密時,
各輪AES加密循環(除最後一輪外)均包含4個步驟:
矩陣中的各位元組通過一個8位的S-box進行轉換。這個步驟提供了加密法非線性的變換能力。S-box與GF(28)上的乘法反元素有關,已知具有良好的非線性特性。為了避免簡單代數性質的攻擊,S-box結合了乘法反元素及一個可逆的仿射變換矩陣建構而成。此外在建構S-box時,刻意避開了固定點與反固定點,即以S-box替換位元組的結果會相當於錯排的結果。AES演算法中的S盒如圖2.2所示
例如一個位元組為0x19,經過S盒變換查找n(1,9) = 0xd4,所以就替換為0xd4。
ShiftRows描述矩陣的行操作。在此步驟中,每一行都向左循環位移某偏移量。在AES中(區塊大小128位),第一行維持不變,第二行里的每個位元組都向左循環移動一格。同理,第三行及第四行向左循環位移的偏移量就分別是2和3。經過ShiftRows之後,矩陣中每一豎列,都是由輸入矩陣中的每個不同列中的元素組成。
在MixColumns步驟,每一列的四個位元組通過線性變換互相結合。每一列的四個元素分別當作 的系數,合並即為GF(28)中的一個多項式,接著將此多項式和一個固定的多項式在molo 下相乘。此步驟亦可視為Rijndael有限域之下的矩陣乘法。MixColumns函數接受4個位元組的輸入,輸出4個位元組,每一個輸入的位元組都會對輸出的四個位元組造成影響。因此ShiftRows和MixColumns兩步驟為這個密碼系統提供了擴散性。
AES演算法利用外部輸入密鑰K(密鑰串的字數為Nk),通過密鑰的擴展程序得到共計4(Nr+1)字的擴展密鑰。它涉及如下三個模塊:
(1)位置變換(rotword)——把一個4位元組的序列[A,B,C,D]變化成[B,C,D,A];
(2)S盒變換(subword)——對一個4位元組進行S盒代替;
(3)變換Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。這里的x是(02),如 Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……
擴展密鑰的生成:擴展密鑰的前Nk個字就是外部密鑰K;以後的字W[[i]]等於它前一個字W[[i-1]]與前第Nk個字W[[i-Nk]]的「異或」,即W[[i]]=W[[i-1]]W[[i- Nk]]。但是若i為Nk的倍數,則W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。
Ⅲ des和aes 加解密演算法具體步驟有例子最好
隨著計算機網路和計算機通訊技術的發展,計算機密碼學得到前所未有的重視並迅速普及和發展起來。由於密碼系統的各種性能主要由密碼演算法所決定,不同的演算法決定了不同的密碼體制,而不同的密碼體制又有著不同的優缺點:有的密碼演算法高速簡便,但加解密密鑰相同,密鑰管理困難;有的密碼演算法密鑰管理方便安全,但計算開銷大、處理速度慢。基於此,本文針對兩種典型的密碼演算法DES和RSA的特點進行討論分析,並提出一種以這兩種密碼體制為基礎的混合密碼系統,來實現優勢互補。
1 密碼系統簡介
1.1 密碼系統分類
密碼系統從原理上可分為兩大類,即單密鑰系統和雙密鑰系統。單密鑰系統又稱為對稱密碼系統,其加密密鑰和解密密鑰或者相同,或者實質上相同,即易於從一個密鑰得出另一個,如圖1所示。雙密鑰系統又稱為公開密鑰密碼系統,它有兩個密鑰,一個是公開的,用K1表示,誰都可以使用;另一個是私人密鑰,用K2表示,只由採用此系統的人掌握。從公開的密鑰推不出私人密鑰,如圖2所示。
1.2 兩種密碼系統分析
1.2.1 對稱密碼系統(單鑰密碼系統)
對稱密碼系統中加密和解密均採用同一把密鑰,而且通信雙方必須都要獲得這把密鑰。這就帶來了一系列問題。首先,密鑰本身的發送就存在著風險,如果在發送中丟失,接受方就不可能重新得到密文的內容;其次,多人通信時密鑰的組合的數量會出現爆炸性的膨脹,N個人兩兩通信,需要N*(N-1)/2把密鑰,增加了分發密鑰的代價和難度;最後,由於通信雙方必須事先統一密鑰,才能發送保密的信息,這樣,陌生人之間就無法發送密文了。
1.2.2 公開密鑰密碼系統(雙鑰密碼系統)
公開密鑰密碼系統中,收信人生成兩把數學上關聯但又不同的公鑰和私鑰,私鑰自己保存,把公鑰公布出去,發信人使用收信人的公鑰對通信文件進行加密,收信人收到密文後用私鑰解密。公開密鑰密碼系統的優勢在於,首先,用戶可以把用於加密的鑰匙公開地發給任何人,並且除了持有私有密鑰的收信人之外,無人能解開密文;其次,用戶可以把公開鑰匙發表或刊登出來,使得陌生人之間可以互發保密的通信;最後,公開密鑰密碼系統提供了數字簽字的公開鑒定系統,而這是對稱密碼系統不具備的。
1.3 典型演算法
對稱密碼系統的演算法有DES,AES,RC系列,DEA等,公開密鑰密碼系統的演算法有RSA,Diffie-Hellman, Merkle-Hellman等。
2 DES演算法
DES (Data Encryption Standard,數據加密標准)是一個分組加密演算法,它以64 bit位(8 byte)為分組對數據加密,其中有8 bit奇偶校驗,有效密鑰長度為56 bit。64 位一組的明文從演算法的一端輸入,64 位的密文從另一端輸出。DES演算法的加密和解密用的是同一演算法,它的安全性依賴於所用的密鑰。DES 對64位的明文分組進行操作,通過一個初始置換,將明文分組成左半部分和右半部分,各32位長。然後進行16輪完全相同的運算,這些運算被稱為函數f,在運算過程中數據與密鑰結合。經過16輪後,左、右半部分合在一起經過一個末置換(初始置換的逆置換),完成演算法。在每一輪中,密鑰位移位,然後再從密鑰的56位中選出48位。通過一個擴展置換將數據的右半部分擴展成48位,並通過一個異或操作與48位密鑰結合,通過8個s盒將這48位替代成新的32位數據,再將其置換一次。這些運算構成了函數f。然後,通過另一個異或運算,函數f輸出與左半部分結合,其結果即成為新的右半部分, 原來的右半部分成為新的左半部分。將該操作重復16次,實現DES的16輪運算。
3 RSA演算法
RSA演算法使用兩個密鑰,一個公共密鑰,一個私有密鑰。如用其中一個加密,則可用另一個解密。密鑰長度從40到2048 bit可變。加密時把明文分成塊,塊的大小可變,但不能超過密鑰的長度,RSA演算法把每一塊明文轉化為與密鑰長度相同的密文塊。密鑰越長,加密效果越好,但加密解密的開銷也大,所以要在安全與性能之間折衷考慮,一般64位是較合適的。RSA演算法利用了陷門單向函數的一種可逆模指數運算,描述如下:(1)選擇兩個大素數p和q;(2)計算乘積n=pq和φ(n)=(p-1)(q-1);(3)選擇大於1小於φ(n)的隨機整數e,使得
gcd(e,φ(n))=1;(4)計算d使得de=1modφ(n);(5)對每一個密鑰k=(n,p,q,d,e),定義加密變換為Ek(x)=xemodn,解密變換為Dk(y)=ydmodn,這里x,y∈Zn;(6)以{e,n}為公開密鑰,{p,q,d}為私有密鑰。
4 基於DES和RSA的混合密碼系統
4.1 概述
混合密碼系統充分利用了公鑰密碼和對稱密碼演算法的優點,克服其缺點,解決了每次傳送更新密鑰的問題。發送者自動生成對稱密鑰,用對稱密鑰按照DES演算法加密發送的信息,將生成的密文連同用接受方的公鑰按照RSA演算法加密後的對稱密鑰一起傳送出去。收信者用其密鑰按照RSA演算法解密被加密的密鑰來得到對稱密鑰,並用它來按照DES演算法解密密文。
4.2 具體實現步驟
(1)發信方選擇對稱密鑰K(一般為64位,目前可以達到192位)
(2)發信方加密消息:對明文按64位分組進行操作,通過一個初始置換,將明文分組成左半部分和右半部分。然後進行16輪完全相同的運算,最後,左、右半部分合在一起經過一個末置換(初始置換的逆置換),完成演算法。在每一輪中,密鑰位移位,然後再從密鑰的56位中選出48位。通過一個擴展置換將數據的右半部分擴展成48位,並通過一個異或操作與48位密鑰結合,通過8個S盒將這48位替代成新的32位數據,再將其置換一次。然後通過另一個異或運算,輸出結果與左半部分結合,其結果即成為新的右半部分,原來的右半部分成為新的左半部分。如圖3所示。
(3)收信方產生兩個足夠大的強質數p、q,計算n=p×q和z=(p-1)×(q-1),然後再選取一個與z互素的奇數e,從這個e值找出另一個值d,使之滿足e×d=1 mod (z)條件。以兩組數(n,e) 和 (n,d)分別作為公鑰和私鑰。收信方將公鑰對外公開,從而收信方可以利用收信方的公鑰對 (1)中產生的對稱密鑰的每一位x進行加密變換Ek(x)=xemodn;
(4)發信方將步驟(2)和(3)中得到的消息的密文和對稱密鑰的密文一起發送給收信方;
(5)收信方用(3)中得到的私鑰來對對稱密鑰的每一位y進行解密變換Dk(y)=ydmodn,從而得到(1)中的K;
(6)收信方用對稱密鑰K和DES演算法的逆步驟來對消息進行解密,具體步驟和(2)中恰好相反,也是有16輪迭代。
(7)既可以由收信方保留對稱密鑰K來進行下一次數據通信,也可以由收信方產生新的對稱密鑰,從而使K作廢。
4.3 兩點說明
4.3.1 用公鑰演算法加密密鑰
在混合密碼系統中,公開密鑰演算法不用來加密消息,而用來加密密鑰,這樣做有兩個理由:第一,公鑰演算法比對稱演算法慢,對稱演算法一般比公鑰演算法快一千倍。計算機在大約15年後運行公開密鑰密碼演算法的速度才能比得上現在計算機運行對稱密碼的速度。並且,隨著帶寬需求的增加,比公開密鑰密碼處理更快的加密數據要求越來越多。第二,公開密鑰密碼系統對選擇明文攻擊是脆弱的。密碼分析者只需要加密所有可能的明文,將得到的所有密文與要破解的密文比較,這樣,雖然它不可能恢復解密密鑰,但它能夠確定當前密文所對應的明文。
4.3.2 安全性分析
如果攻擊者無論得到多少密文,都沒有足夠的信息去恢復明文,那麼該密碼系統就是無條件安全的。在理論上,只有一次一密的系統才能真正實現這一點。而在本文所討論的混合密碼系統中,發信方每次可以自由選擇對稱密鑰來加密消息,然後用公鑰演算法來加密對稱密鑰,即用戶可以採用一次一密的方式來進行數據通信,達到上述的無條件安全。
5 小結
基於DES和RSA的混合密碼系統結合了公鑰密碼體制易於密鑰分配的特點和對稱密碼體制易於計算、速度快的特點,為信息的安全傳輸提供了良好的、快捷的途徑,使數據傳輸的密文被破解的幾率大大降低,從而對數據傳輸的安全性形成更有力的保障,並且發信方和收信方對密鑰的操作自由度得到了很大的發揮。
Ⅳ aes演算法步驟
aes演算法由四個不同的變換組成,包括一個置換和三個替代:
位元組代替(SubBytes):用一個S盒完成分組的位元組到位元組的代替。
行移位(ShiftRows):一個簡單的置換。
列混淆(MixColumns):利用域GF(28)上的算術特性的一個代替。
輪密鑰加(AddRoundKey):當前分組和擴展密鑰的一部分進行按位XOR(異或)。
輸入的密鑰被擴展成由44個32位子所組成的數組w[i],由上圖可知,每輪有四個不同的字(128位)作為該輪到密鑰。
對加密和解密的操作,演算法由輪密鑰加開始,接著執行9輪迭代運算,每輪都包含所有4個階段的代替,接著是第10輪的三個階段。
僅僅在輪密鑰加階段使用密鑰。由於這個原因,該演算法以輪密鑰加開始,以輪密鑰加結束。
Ⅳ 簡述aes演算法的加密過程
AES加密過程涉及到 4 種操作,分別是位元組替代、行移位、列混淆和輪密鑰加。
1.位元組替換:位元組代替的主要功能是通過S盒完成一個位元組到另外一個位元組的映射。
2.行移位:行移位的功能是實現一個4x4矩陣內部位元組之間的置換。
4.輪密鑰加:加密過程中,每輪的輸入與輪密鑰異或一次(當前分組和擴展密鑰的一部分進行按位異或);因為二進制數連續異或一個數結果是不變的,所以在解密時再異或上該輪的密鑰即可恢復輸入。
5.密鑰擴展:其復雜性是確保演算法安全性的重要部分。當分組長度和密鑰長度都是128位時,AES的加密演算法共迭代10輪,需要10個子密鑰。AES的密鑰擴展的目的是將輸入的128位密鑰擴展成11個128位的子密鑰。AES的密鑰擴展演算法是以字為一個基本單位(一個字為4個位元組),剛好是密鑰矩陣的一列。因此4個字(128位)密鑰需要擴展成11個子密鑰,共44個字。