AES內部加密原理
0x01 AES概述
高階加密標準(Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高階加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日釋出於FIPS PUB 197,並在2002年5月26日成為有效的標準。2006年,高階加密標準已然成為對稱金鑰加密中最流行的演算法之一。
在這裡需要指出的一點就是祕鑰長度為128bit的Rijndael加密法被稱為標準AES,說起AES,我們一般認為它的的祕鑰長度為128bit。
AES要加密的明文資料必須為128bit,不足的會填充。祕鑰長度為128bit、192bit、256bit。AES加密包含很多輪的操作,每輪又包含四層(最後一輪只有三層)。
AES輸入輸出引數
Key length (祕鑰長度) | Number of rounds (輪數) | Number of key(子祕鑰個數) |
---|---|---|
128bit | 10 | 11 |
192bit | 12 | 13 |
256bit | 14 | 15 |
0x02內部結構
- Byte Substitution layer (位元組替換層)
- Diffusion layer (混淆層)
- ShiftRows Sublayer (行移位子層)
- MixColumn Sublayer (列混合子層)
- Key Addition layer (子祕鑰相加層)
為了理解資料在AES中是如何移動的,我們假設這樣一個state(狀態矩陣):
將128bit的明文資料想象為一個4*4的矩陣,矩陣中A0~A15是16個位元組。
Byte Substitution layer (位元組替換層)
該層包含有一個S-Boxes ,它有三個特點:
- 唯一且非線性
- 雙射的(唯一可逆)
- 任何輸入值都不等於輸出值
這層軟硬體實現都很簡單,查表替換即可。
例如:輸入值Ai=(C2)hex經過S-Box位元組替換得到輸出值(25)hex
S((C2)hex)=(25)hex
Diffusion layer (擴散層)
不像S-Box,混淆層表現一種線性操作,
DIFF(A) + DIFF(B) = DIFF(A + B)
該層包含兩個子層:
- ShiftRows Sublayer (行移位子層):在一個位元組層上置換資料
- MixColumn Sublayer (列混合子層):結合(混合)四個位元組塊的矩陣操作
ShiftRows Sublayer (行移位子層)
查詢替換表 輸入矩陣:
輸出矩陣:
注意:這裡的shift是迴圈左移。
MixColumn Sublayer (列混合子層)
-
混合狀態矩陣(state)每一列的線性操作
-
主擴散元素
-
每4位元組一列乘以一個4*4混合矩陣,如: 這裡01、02、03是十六進位制表示法。
-
所有的運算都是在GF(2^8)上進行。
係數在GF(2^8)上的多項式
•在AES的列混合操作中,將4個位元組構成的向量看成係數在GF(28)上的次數小於4的多項式 。
-
多項式的加法:
就是對應係數相加;換句話說,多項式的加法就是4位元組向量的逐位元異或
-
多項式的乘法 :
必須要取模m(x)=+1,這樣使得次數小於4的多項式的乘積仍然是一個次數小於4的多項式
將多項式的模m(x)=+1乘運算記為⊗,設
a(x)= +++
b(x)= +++
記
c(x)= a(x)⊗b(x)=+++(mod +1)
由於 mod (+1)=(j > 4),所以
即:
=⊕⊕⊕
= ⊕⊕⊕
= ⊕⊕⊕
= ⊕⊕⊕
列混合的數學本質
將狀態矩陣的每列視為係數在GF()上的一元三次多項式,再與一個固定的係數在GF()上的一元三次多項式a(x)進行模+1乘法
a(x) = +++02
a(x)是模+1可逆的多項式(即a(x)是與+1互素的),否則列混合變換就是不可逆的。
舉例:
B=(25,25,…,25)
在GF()上只需要計算02•25和03•25,
化為多項式為++1
所以:
02•25=x•(++1)=++
03•25=(x+1)•(++1)=+++++1
01•25 = + +1
01•25 = + +1
02•25 =+ +