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...