先贴出密钥扩展算法,下面有讲解。
/** 对输入64位密钥进行处理
pIn@指向输入的8字节密钥;
pOut@指向处理后返回的密钥。
**/
static void ProcKey(uint8_t *pIn, uint8_t *pOut)
{
uint8_t i, j, tmp[4], KeyBits[64], KeyPC1[56], pC[28], pD[28];
Byte2Bits(pIn, KeyBits); /* 8字节转换成64位 */
Permutation(KeyBits, KeyPC1, PC1, 56); /* 按PC1把64位置换成56位 */
DivideLR(KeyPC1, pC, pD, 56); /* 分成左右各28位 */
for(i=0; i<16; i++)
{
switch(i)
{
case 0:
case 1:
case 8:
case 15: /* 循环左移1位 */
{
tmp[0] = pC[0];
tmp[1] = pD[0];
for(j=0; j<27; j++)
{
pC[j] = pC[j+1];
pD[j] = pD[j+1];
}
pC[27] = tmp[0];
pD[27] = tmp[1];
break;
}
default: /* 循环左移2位 */
{
tmp[0] = pC[0];
tmp[1] = pC[1];
tmp[2] = pD[0];
tmp[3] = pD[1];
for(j=0; j<26; j++)
{
pC[j] = pC[j+2];
pD[j] = pD[j+2];
}
pC[26] = tmp[0];
pC[27] = tmp[1];
pD[26] = tmp[2];
pD[27] = tmp[3];
break;
}
} /* end switch */
for(j=0; j<28; j++) /* 合并成56位 */
{
KeyPC1[j] = pC[j];
KeyPC1[j+28] = pD[j];
}
Permutation(KeyPC1, &pOut[i*48], PC2, 48); /* 按PC2转换成48位返回,共进行16轮操作 */
}
}
key扩展算法:
1.8字节转为64位存储。
2.按PC1表把64位置换成56位。
3.把56位分成左右各28位。
注:共循环16次,得到16*48字节的扩展密钥
4.第0、1、8、15次循环时,对左右28位采用循环左移一位,其它次循环则采用循环左移2位(参见上面代码)
5.把每次循环得到的左右28位组合成56位,然后采用PC2进行置换,得到一轮48位密钥。
key扩展算法:
最新推荐文章于 2024-07-14 18:15:43 发布