一、什麼是AES?
AES(Advanced Encryption Standard),是當今世界上使用最廣泛的對稱密鑰加密算法,用於加密和解密數據。該算法採用對稱加密的方式,意味着加密和解密使用同一個密鑰。
二、AES密鑰生成
AES密鑰生成是AES算法的關鍵步驟之一,它是在給定長度的密鑰中生成一個密鑰表用於加密和解密。密鑰的長度可以是128位、192位或256位,根據密鑰的長度的不同,密鑰表的數量也不同。我們將一步一步地展示如何生成AES密鑰。
三、生成AES密鑰的步驟
1、 密鑰擴展
在AES中,密鑰擴展算法會生成多個密鑰,稱為密鑰表。一個AES密鑰的長度決定了密鑰表的數量。密鑰表的每一個元素是一個4字節的字,即32位。密鑰擴展算法也叫密鑰表生成算法,它通過迭代生成每一個元素。具體算法是:
//設定常量 const uint8_t rcon[11] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36}; //對密鑰進行擴展 void expand_key(uint8_t *key, uint8_t *exp_key) { int i, j, k; //將原始密鑰拷貝到擴展密鑰中 for (i = 0; i < 16; i++) exp_key[i] = key[i]; //計算迭代次數 int count = 0; switch (key_size) { case 128: count = 10; break; case 192: count = 12; break; case 256: count = 14; break; } //迭代生成密鑰表 for (i = 16; i < 4 * (count + 1); i += 4) { uint8_t temp[4]; for (j = 0; j < 4; j++) temp[j] = exp_key[i - 4 + j]; if (i % 16 == 0) { uint8_t t = temp[0]; temp[0] = temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = t; for (j = 0; j < 4; j++) temp[j] = sbox[temp[j]]; temp[0] ^= rcon[i / 16 - 1]; } for (j = 0; j < 4; j++) exp_key[i + j] = exp_key[i - 16 + j] ^ temp[j]; } }
2、輪密鑰生成
輪密鑰是密鑰表的一部分,被用來加密輪次中的數據塊。在AES的加密和解密過程中,每一輪會使用一個輪密鑰。輪密鑰的長度與明文塊(或密文塊)長度相等。具體算法是:
//生成輪密鑰 void generate_round_key(uint8_t *exp_key, uint8_t *round_key, int round) { int i, j, k; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { round_key[i * 4 + j] = exp_key[round * 16 + i * 4 + j]; } } }
3、生成完整密鑰
AES算法加密過程中,每輪要使用不同的輪密鑰,因此需要在加密或解密前先生成足夠的輪密鑰。生成完整密鑰的算法是:
//生成完整密鑰 void generate_key(uint8_t *key, uint8_t *exp_key) { expand_key(key, exp_key); for (int i = 0; i < 10; i++) { generate_round_key(exp_key, round_key[i], i); } }
四、總結
AES密鑰生成是實現AES加密和解密的關鍵步驟之一。通過密鑰擴展、輪密鑰生成等步驟,可以生成完整的輪密鑰用於加密和解密數據。在代碼實現上,需要注意使用對應密鑰長度的算法,以及密鑰表迭代次數等參數的計算。
原創文章,作者:EWPPQ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/366330.html