AES演算法分析與實現

2021-05-10 21:22:53 字數 2741 閱讀 9481

aes演算法的主要數學基礎是抽象代數,其中演算法中的許多運算是按單位元組(

8bits)和4

位元組(32bits

)定義的,單位元組可看成有限域

gf(28)

中的乙個元素,而

4位元組則可以看成係數在

gf(28)

中並且次數小於

4的多項式(亦可以理解為:

gf(2564)

),單位元組上的運算有兩種:有限域

gf(28)

上乙個8

次不可約多項式的模加、點乘(為方便**實現,推出了

x乘的概念),其中,這個不可約多項式為:

m(x)= x8+x4+x3+x+1

,類似地,

4位元組運算也分為兩種:模加、乘法(為方便**實現,推出了模乘的概念),而此時使用的模取

m(x)=x4+1

,由於x4+1=( x2+1)( x2+1)= ( x+1) ( x+1) ( x+1) ( x+1)

,即非不可約,導致非

0多項式乘法逆元(逆元求取主要用到了歐幾里德(

euclid

)演算法)不一定存在,所以在

aes演算法中,只限於乘乙個固定的有逆元的多項式:

a(x)=x3+x2+x+。

aes(

128bits

金鑰)主要加解密流程如下圖所示:

圖中左邊是加密流程,右邊是解密流程,

其中,plaintext

為明文,

ciphertext

為密文,

金鑰長度可變,可指定為

128、

192、

256位元,不同金鑰長度決定了加解密演算法的輪數(

128位:

10輪,

192位:

12輪,

256位:

14輪),演算法徵集之初,

6輪迭代便可抵抗當時世界上已知的所有攻擊,

aes標準中至少留了

4輪餘量,按照這種說法,可以推知輪數越多,

aes破解難度越大,也就是金鑰越長越安全,所以今年

8月份有人說

256bits

金鑰長度的

aes演算法被破解,而

128bits

未被破解是沒有根據的。 理解

aes需要知道以下兩個概念: l

狀態:演算法中間的結果也需要分組,稱之為狀態,狀態可以用以位元組為元素的矩陣陣列表示,該陣列有

4行,列數

nb為分組長度除32;

l種子金鑰:以位元組為元素的矩陣陣列描述,陣列為

4行,列數

nk為金鑰長度除

32,其中根據種子金鑰,可以推導出

各輪子金鑰

w[ , ]

,此過程亦稱作金鑰擴充套件,針對不同金鑰長度的金鑰擴充套件演算法可以參照閱讀

aes演算法標準發布文件。 1

)下面簡單分析一下

aes(128bits金鑰)

的加密流程:

aesencrypt (state, expandedkey)

l加密輪函式:

round (state, roundkey)

l加密最後一輪輪函式:

finalround (state, roundkey)

以上加密過程具體演算法可參照

aes標準發布文件,需要注意的地方有以下幾點: l

位元組替代變換是一種非線性變換,主要有兩個可逆變換組成:求逆元、仿射變換,在具體實現中,根據兩個過程的特點,逐一計算

00~ff

共256

種位元組替代變換結果,可以推導出乙個固定的、加密用的

s盒表; l

列混合變換,即將狀態的每一列視為有限域

gf(28)

上的乙個多項式,並將此多項式與乙個具有逆元的多項式進行多項式乘法,這個具有逆元的多項式即為前述的

a(x)=x3+x2+x+

,它的逆元為:

a-1(x)=x3+x2+x+;

l基於種子金鑰的子金鑰擴充套件過程必須發生在呼叫加密函式之前,且加密完之後,傳送到解密方的是種子金鑰,也就是說,在呼叫解密函式之前也必須基於種子金鑰進行子金鑰擴充套件,此外,針對不同的金鑰長度有不同的子金鑰擴充套件演算法,具體參照

aes標準發布文件; l

最後一輪輪函式之所以去掉列混合,是因為最後一輪的列混合並未增加

aes演算法的安全性,反而增加其實現難度,降低演算法效率。 2

)下面簡單分析一下

aes(128bits金鑰)

的解密流程:

aesdecrypt (state, expandedkey)

l解密輪函式:

invround (state, roundkey)

l解密最後一輪輪函式:

invfinalround (state, roundkey)

以上解密過程具體演算法可參照

aes標準發布文件,需要注意的地方有以下幾點: l

加密過程中的子金鑰加的逆變換即為同一子金鑰繼續加,所以的解密演算法呼叫之前要對擴充套件後的子金鑰進行逆序; l

加解密是使用同乙個

s盒表?還是分別採用各自的

s盒表?是乙個時間複雜度和空間複雜度的權衡(作者在實現中將加解密

s盒表分開做); l

逆移位變換與逆位元組替代變換之間是可以相互調換位置的。

源**: 

java實現AES演算法

private static final int bit 128 public static void main string args catch transformerexception e system.out.println time system.nanotime start 1000 1...

python實現AES演算法

usr bin python coding utf 8 from crypto.cipher import aes from binascii import b2a hex,a2b hex class aes 自己實現了乙個aes類,用於aes的加密和解密 def init self,key,mod...

AES密碼演算法C實現

做實驗並寫實驗報告。修改例程cryptodemo.cpp為encfile.cpp 從命令列接受3個字串型別的引數 引數1,引數2,引數 3。引數1 encrypt表示加密,引數2 decrypt表示解密 引數2為待加密 解密的檔名 引數3為密碼。1 修改映象源為科大的,然後更新所有應用 sudo v...