AES中NK是什么意思
时间: 2023-07-14 17:56:21 浏览: 76
在AES(Advanced Encryption Standard)中,NK代表密钥扩展(key expansion)中使用的单词数。具体来说,NK是AES密钥长度(即128比特、192比特或256比特)除以32比特后的结果。例如,128比特AES密钥的NK值为4,192比特AES密钥的NK值为6,256比特AES密钥的NK值为8。NK值确定了密钥扩展需要使用的轮数(rounds)。
相关问题
AES round keys
AES轮密钥(round keys)是在AES加密算法中使用的密钥。最初的Nk行被作为种子,用原始密钥值。剩余行从种子密钥来产生。变量Nk代表以32位字为单位的种子密钥长度。这里需要注意的是,现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它们与原始种子密钥区别开来。在加密过程中,每轮的输入与轮密钥进行异或操作;因此,在解密时,只需再次与该轮的密钥进行异或操作即可恢复输入。根据使用的密码长度,AES最常见的有3种方案,分别是AES-128、AES-192和AES-256。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [AES加解密算法详解](https://blog.csdn.net/yxtxiaotian/article/details/52084123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
void AESInit(AESInfo_t *aesInfoP) { unsigned char i; unsigned char *pExpandKey;//扩展密钥 unsigned char Rcon[4] = {0x01, 0x00, 0x00, 0x00}; switch (aesInfoP->type) { case AES128: aesInfoP->Nr = 10; aesInfoP->Nk = 16; break; case AES192: aesInfoP->Nr = 12; aesInfoP->Nk = 24; break; case AES256: aesInfoP->Nr = 14; aesInfoP->Nk = 32; break; default: aesInfoP->Nr = 10; aesInfoP->Nk = 16; break; } //拓展密匙 memcpy(aesInfoP->expandKey, aesInfoP->key, 4 * aesInfoP->Nk);//第一个是原始密匙, pExpandKey = &aesInfoP->expandKey[4*aesInfoP->Nk]; //拓展密匙AES128:10个、AES192:12个、AES256:14个 for (i = aesInfoP->Nk; i < Nb*(aesInfoP->Nr + 1); pExpandKey += 4, i++) { memcpy(pExpandKey, pExpandKey - 4, 4); if (0 == i % aesInfoP->Nk) { RShiftWord(pExpandKey); SubstituteBytes(pExpandKey, 4, SBox); XorBytes(pExpandKey, Rcon, 4); Rcon[0] = GfMultBy02(Rcon[0]); } else if (6 < aesInfoP->Nk && i % aesInfoP->Nk == Nb) { SubstituteBytes(pExpandKey, 4, SBox); } XorBytes(pExpandKey, pExpandKey - 4 * aesInfoP->Nk, 4); } } 解释每段代码的意思
这段代码是AES加密算法的初始化函数,主要作用是填充AESInfo_t结构体的各项参数,并生成扩展密钥。具体解释如下:
```c++
void AESInit(AESInfo_t *aesInfoP) {
unsigned char i;
unsigned char *pExpandKey; // 指向扩展密钥的指针
unsigned char Rcon[4] = {0x01, 0x00, 0x00, 0x00}; // 轮常数数组
switch (aesInfoP->type) {
case AES128:
aesInfoP->Nr = 10; // 轮数
aesInfoP->Nk = 16; // 密钥长度(字节)
break;
case AES192:
aesInfoP->Nr = 12;
aesInfoP->Nk = 24;
break;
case AES256:
aesInfoP->Nr = 14;
aesInfoP->Nk = 32;
break;
default:
aesInfoP->Nr = 10;
aesInfoP->Nk = 16;
break;
}
// 拓展密匙
memcpy(aesInfoP->expandKey, aesInfoP->key, 4 * aesInfoP->Nk); // 复制原始密钥到扩展密钥的前Nk个字节
pExpandKey = &aesInfoP->expandKey[4*aesInfoP->Nk]; // 指向扩展密钥的第Nk个字节(即原始密钥之后)
for (i = aesInfoP->Nk; i < Nb*(aesInfoP->Nr + 1); pExpandKey += 4, i++) {
memcpy(pExpandKey, pExpandKey - 4, 4); // 复制前一个4字节到当前位置
if (0 == i % aesInfoP->Nk) { // 每Nk个字节进行一次特殊处理
RShiftWord(pExpandKey); // 字节循环左移一位
SubstituteBytes(pExpandKey, 4, SBox); // 字节替换
XorBytes(pExpandKey, Rcon, 4); // 字节异或轮常数
Rcon[0] = GfMultBy02(Rcon[0]); // 计算下一个轮常数
} else if (6 < aesInfoP->Nk && i % aesInfoP->Nk == Nb) { // 对于AES-256而言,每4*Nk个字节进行一次特殊处理
SubstituteBytes(pExpandKey, 4, SBox); // 字节替换
}
XorBytes(pExpandKey, pExpandKey - 4 * aesInfoP->Nk, 4); // 与前Nk个字节异或
}
}
```
上述代码中,Nb表示列数,对于AES而言,Nb=4。而SBox和GfMultBy02是AES算法中使用的两个表格和一个算法,用于字节替换和轮常数计算。具体实现细节可以参考AES算法的原理和流程。