1. 程式人生 > >AES內部加密原理

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 ,它有三個特點:

  1. 唯一且非線性
  2. 雙射的(唯一可逆)
  3. 任何輸入值都不等於輸出值

這層軟硬體實現都很簡單,查表替換即可。

例如:輸入值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)=x4x^4+1,這樣使得次數小於4的多項式的乘積仍然是一個次數小於4的多項式

將多項式的模m(x)=x4x^4+1乘運算記為⊗,設

a(x)= a3x3a_3x^3+a2x2a_2x^2+a1xa_1x+a0a_0

b(x)= b3x3b_3x^3+b2x2b_2x^2+b1xb_1x+b0b_0

c(x)= a(x)⊗b(x)=c3x3c_3x^3+c2x2c_2x^2+c1xc_1x+c0c_0(modx4x^4 +1)

由於xjx^j mod (x4x^4+1)=xjmod4x^{j mod 4}(j > 4),所以 在這裡插入圖片描述

即:

c0c_0=a0b0a_0b_0a3b1a_3b_1a2b2a_2b_2a1b3a_1b_3

c1c_1= a1b0a_1b_0a0b1a_0b_1a3b2a_3b_2a2b3a_2b_3

c2c_2= a2b0a_2b_0a1b1a_1b_1a0b2a_0b_2a3b3a_3b_3

c3c_3= a3b0a_3b_0a2b1a_2b_1a1b2a_1b_2a0b3a_0b_3

列混合的數學本質

將狀態矩陣的每列視為係數在GF(282^8)上的一元三次多項式,再與一個固定的係數在GF(282^8)上的一元三次多項式a(x)進行模x4x^4+1乘法

​ a(x) = 03x303x^3+01x201x^2+01x01x+02

a(x)是模x4x^4+1可逆的多項式(即a(x)是與x4x^4+1互素的),否則列混合變換就是不可逆的。

舉例:

B=(25,25,…,25)

在GF(282^8)上只需要計算02•25和03•25,

25hex25_{hex}化為多項式為x5x^5+x2x^2+1

所以:

02•25=x•(x5x^5+x2x^2+1)=x6x^6+x3x^3+x1x^1

03•25=(x+1)•(x5x^5+x2x^2+1)=x6x^6+x5x^5+x3x^3+x2x^2+x1x^1+1

01•25 = x5x^5+ x2x^2 +1

01•25 = x5x^5+ x2x^2 +1

02•25 =x6x^6+ x3x^3 +x1x^1