0 aes簡介
美國國家標準技術研究所在2023年發布了高階加密標準(aes)。aes是乙個對稱分組密碼演算法,旨在取代des成為廣泛使用的標準。
根據使用的密碼長度,aes最常見的有3種方案,用以適應不同的場景要求,分別是aes-128、aes-192和aes-256。本文主要對aes-128進行介紹,另外兩種的思路基本一樣,只是輪數會適當增加。
1 演算法流程
aes加解密的流程圖如下:
aes加密過程涉及到4種操作:位元組替代(subbytes)、行移位(shiftrows)、列混淆(mixcolumns)和輪金鑰加(addroundkey)。解密過程分別為對應的逆操作。由於每一步操作都是可逆的,按照相反的順序進行解密即可恢復明文。加解密中每輪的金鑰分別由初始金鑰擴充套件得到。演算法中16位元組的明文、密文和輪金鑰都以乙個4x4的矩陣表示。
接下來分別對上述5種操作進行介紹。
1.1 位元組代替
位元組代替的主要功能是通過s盒完成乙個位元組到另外乙個位元組的對映。s盒的詳細構造方法可以參考文獻[1]。
下圖(a)為s盒,圖(b)為s-1(s盒的逆)
s和s-1分別為16x16的矩陣。假設輸入位元組的值為a=a7a6a5a4a3a2a1a0,則輸出值為s[a7a6a5a4][a3a2a1a0],s-1的變換也同理。
例如:位元組00替換後的值為(s[0][0]=)63,再通過s-1即可得到替換前的值,(s-1 [6][3]=)00。
1.2 行移位
行移位的功能是實現乙個4x4矩陣內部位元組之間的置換。
1.2.1 正向行移位
正向行移位的原理圖如下:
實際移位的操作即是:第一行儲存不變,第二行迴圈左移1個位元組,第三行迴圈左移2個位元組,第四行迴圈左移3個位元組。假設矩陣的名字為state,用公式表示如下:state』[i][j] = state[i][(j+i)%4];其中i、j屬於[0,3]
1.2.2 逆向行移位
逆向行移位即是相反的操作,用公式表示如下:state』[i][j] = state[i][(4+j-i)%4];其中i、j屬於[0,3]
1.3 列混淆
列混淆:利用gf(28)域上算術特性的乙個代替。
1.3.1 正向列混淆
正向列混淆的原理圖如下:
根據矩陣的乘法可知,在列混淆的過程中,每個位元組對應的值只與該列的4個值有關係。此處的乘法和加法都是定義在gf(28)上的,需要注意如下幾點:
1) 將某個位元組所對應的值乘以2,其結果就是將該值的二進位制位左移一位,如果該值的最高位為1(表示該數值不小於128),則還需要將移位後的結果異或00011011;[1]
2) 乘法對加法滿足分配率,例如:07·s0,0=(01⊕02⊕04)·s0,0= s0,0⊕(02·s0,0)(04·s0,0)
3) 此處的矩陣乘法與一般意義上矩陣的乘法有所不同,各個值在相加時使用的是模2加法(相當於是異或運算)。
假設某一列的值如下圖,運算過程如下:
同理可以求出另外幾個值。
1.3.2 逆向列混淆
逆向列混淆的原理圖如下:
由於:
說明兩個矩陣互逆,經過一次逆向列混淆後即可恢復原文。
1.4 輪密碼加
任何數和自身的異或結果為0。加密過程中,每輪的輸入與輪金鑰異或一次;因此,解密時再異或上該輪的金鑰即可恢復輸入。
1.5 金鑰擴充套件
金鑰擴充套件的原理圖如下:
金鑰擴充套件過程說明:
1) 將初始金鑰以列為主,轉化為4個32 bits的字,分別記為w[0…3];
2) 按照如下方式,依次求解w[j],其中j是整數並且屬於[4,43];
3) 若j%4=0,則w[j]=w[j-4]⊕g(w[j-1]),否則w[j]=w[j-4]⊕w[j-1];
函式g的流程說明:
4) 將w迴圈左移乙個位元組;
5) 分別對每個位元組按s盒進行對映;
6) 與32 bits的常量(rc[j/4],0,0,0)進行異或,rc是乙個一維陣列,其值如下。(rc的值只需要有10個,而此處用了11個,實際上rc[0]在運算中沒有用到,增加rc[0]是為了便於程式中用陣列表示。由於j的最小取值是4,j/4的最小取值則是1,因此不會產生錯誤。)
rc =
2 原始碼
在github上找到的aes實現**,感覺寫得不錯。
3 參考文獻
[1] william stallings著;王張宜等譯. 密碼編碼學與網路安全——原理與實踐(第五版)[m]. 北京:電子工業出版社,2011.1.
AES加密加固
一 反編譯 1.定義 利用編譯程式從源語言編寫的源程式產生目標程式的過程。2.怎麼進行反編譯?先了解apk對檔案構造 二 加固方案的手段 1.反模擬器 模擬器執行apk,可以用模擬器監控到apk的各種行為,所以在實際的加固apk執行中,一旦發現模擬器在執行該apk,就停止核心 的執行。2.虛擬化 虛...
AES加密相關
aes是一種對稱加密演算法,即用同一把金鑰進行加密與解密。aes加密有以下幾個引數需要注意 1.key aes要求金鑰具有16byte 24byte或者32byte,位數越高,加密強度越大,加密輪數依次為10 12 14輪。以128位金鑰為例,金鑰首先擴充套件為44個字 32位 前4個字與明文進行一...
Aes加密解密
加密時 先對string進行utf8解析成陣列 對陣列進行加密 對加密結果用base64解析成string。那麼揭秘時,對字串的解析方式是必須要 倒 過來的,就成這樣子了 解密時 先對string進行base64解析成陣列 對陣列進行解密 對解密結果用utf8解析成string using syst...