AES C語言實現 與 原理分析

2021-08-04 13:23:44 字數 2411 閱讀 3588

aesadvanced encryption standard,高階加密標準

在密碼學上又稱:rijndael加密法。

rijndael輪函式是由3個不同的可逆均勻變換組成

aes常見3種方案:

功能:通過s盒完成1個位元組到另1個位元組的對映。

實現:

輸入1個位元組:a = a7a6a5a4a3a2a1a0

輸出1個位元組:b = s[a7a6a5a4][a3a2a1a0]

示例:

輸入a=0x00-> 輸出 s[0][0]=0x63 -> s』[6][3]=0x00

輸入a=0x83-> 輸出 s[8][3]=0xec -> s』[0x0e][0x0c]=0x83

實現**:

/*

* 加密 s盒 s-box

*/static uint8_t g_aes_sbox[256] =

;

/*

*解密s盒- invs_box

*/static uint8_t g_aes_invsbox[256] =

;

/*

* 函式名:aes_sub_bytes

*功能:位元組替代。通過s盒完成乙個位元組到另乙個位元組的對映。

*說明:設輸入位元組的值為a=a7a6a5a4a3a2a1a0,

* 則輸出值為: s[a7a6a5a4][a3a2a1a0]

* s盒為16x16的矩陣。

*/void aes_sub_bytes(uint8_t *state)

}}

/*

* 函式名:aes_inv_sub_bytes

*功能:位元組替代。通過s盒完成乙個位元組到另乙個位元組的對映。

*說明:設輸入位元組的值為a=a7a6a5a4a3a2a1a0,

* 則輸出值為: s[a7a6a5a4][a3a2a1a0]

* s盒為16x16的矩陣。

*/void aes_inv_sub_bytes(uint8_t *state)

}}

目的:將矩陣中的每個橫列進行迴圈式移位。

第0行迴圈左移0位,即不變;

第1行迴圈左移1位;

第2行迴圈左移2位;

第3行迴圈左移3位;

目的:利用gf(2^8)域上算術特性的乙個代替。

正向左乘矩陣和逆向左乘矩陣的關係:

注意:

1。byte(d7~d0)*2的結果:將該值的二進位制位左移 1位,若d7=1,移位結果異或0x1b(00011011)。

2。乘法對加法滿足分配率。

3。列混淆的矩陣乘法與一般意義上的矩陣乘法有所不同,各值在相加時使用模2加法(xor運算)。

目的:

矩陣中的每個位元組與該輪金鑰做xor運算。

操作:

加密過程,每輪的輸入與輪金鑰異或一次;

解密過程,每輪的輸入再異或上該輪金鑰即可恢復。

目的:

將初始金鑰生成n個子金鑰。n為加密輪數。

操作:

將初始金鑰以列為主,轉化為4個32bit的字(w0~w3)。依次求解w[j],其中j[4,43]

若j%4=0,則 w[j] = w[j-4] xor g(w[j-1])

否則:w[j] = w[j-4] xor w[j-1] .

函式g的流程:

將w迴圈左移1個位元組;

分別對每個位元組按s盒進行對映;

與32bits的常量(rc[j/4],0,0,0)

進行異或。

C語言實現簡單 詞法分析程式(編譯原理)

遇 為0,結束迴圈。void scaner token m 0 字元陣列結尾符號 回退乙個字元 此時的p代表 非字母或數字的字元的 下乙個字元 p 回退到 非字母或數字的那個字元 先預先設定為 識別符號的 種別碼 syn 10 for n 0 n 6 n if strcmp token,rwtab ...

r語言聚類分析 R語言實現tSNE聚類分析

t sne t distributed stochastic neighborembedding 是用於降維的一種無監督機器學習演算法,由 laurens van der maaten 和 geoffrey hinton在08年提出。t sne 作為一種非線性降維演算法,非常適用於高維資料降維到2維...

C 語言實現 演算法分析與設計 全排列問題

設a 是要進行排列的n個元素的集合 這裡用技巧性演算法,即觀察 當n 1時,輸出a1 當n 2時,輸出a1a2,a2a1 當n 3時,輸出 我們注意觀察,每種可能的排列的第乙個元素,我們發現第乙個元素的值只能是n 3時,出現的所有可能的元素,而後面則是另外剩下的3 1 2個數的全排列,而這另外剩下的...