key扩展算法:

先贴出密钥扩展算法,下面有讲解。

/** 对输入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位密钥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值