一、什麼是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
微信掃一掃
支付寶掃一掃