if (x==1)
return t0;
q=y/x;
y=y%x;
t1+=q*t0;
} while (y!=1);
return low16(1-t1);
}
// 生成52个16位子密钥, userkey是128位密钥 Z是有52个元素的数组,存放生成的子密钥
static void en_key_idea(word16 *userkey, word16 *Z)
{
int i,j;
/* shifts */
for (j=0;j<8;j++)
Z[j]=*userkey++; // 第一组8个子密钥不移位
for (i=0;j<KEYLEN;j++)
{
i++; //实现循环左移25位, 主要思想:后一组8个子密钥的第一个子密钥,是前一组8个子密钥的第二个子密钥的低7位和第三个子密钥的高9位合并成
Z[i+7]=((Z[i&7] << 9) | (Z[i+1 & 7] >> 7)); // 左移9位得到低7位, 右移7位得到高9位, 用或"|"合并
Z+=i&8; // Z为数组基地址, 每8次向前加8个单位, 即数组基地址加8
i&=7; // i每8次复位一次
}
}
// 生成解密密钥
static void de_key_idea(IDEAkey Z,IDEAkey DK)
{
|