/*permute函数 用于转换、改变位序列*/
static void permute(unsigned char *bits, const int *mapping, int n)
{
unsigned char *temp[8];
int i;
/*使用n位映射映射缓冲区*/
memset(temp, 0, (int)ceil(n/8));
for(i=0; i<n; i++)
bit_set(temp, i, bit_get(bits,mapping[i]-1));
memcpy(bits, temp, (int)ceil(n/8));
return;
}
/*des_main函数 加密或解密数据的计算函数*/
static int des_main(const unsigned char *source, unsigned char *target, const char *key, DesEorD direction)
{
static unsigned char subkeys[16][7];
unsigned char temp[8],
lkey[4],
rkey[4],
lblk[6],
rblk[6],
fblk[6],
xblk[6],
sblk;
int row,col,i,j,k,p;
/*如果key等于NULL,重用上次调用时计算出来的子密钥,否则计算子密钥*/
if(key != NULL)
{
/*创建一个key的副本*/
memcpy(temp,key,8);
/*将key转换并压缩至56位*/
permute(temp,DesTransform,56);
/*将key分为两个28位的组*/
memset(lkey,0,4);
memset(rkey,0,4);
for(j=0; j<28; j++)
bit_set(lkey, j, bit_get(temp,j));
for(j=0; j<28; j++)
bit_set(rkey, j, bit_get(temp,j+28));
/*计算每一轮的子密钥*/
for(i=0; i<16; i++)
{
/*根据定义好的位数对每一块进行旋转*/
bit_rot_left(lkey,28,DesRotations[i]);
bit_rot_left(rkey,28,DesRotations[i]);
/*重新合并两个块*/
for(j=0; j<28; j++)
bit_set(subkeys[i],j,bit_get(lkey,j));
for(j=0; j<28; j++)
bit_set(subkeys[i],j+28,bit_get(rkey,j));
/*对子密钥做转换选择并压缩至48位*/
permute(subkeys[i],DesPermuted,48);
}
}
/*创建source参数的副本*/
memcpy(temp, source, 8);
/*初始转换数据块*/
permute(temp, DesInitial, 64);
/*将源数据块分为大小为32位的左右两个数据块*/
memcpy(lblk, &temp[0], 4);
memcpy(rblk, &temp[4], 4);
/*加密或解密源数据*/
for(i=0; i<16; i++)
{
/*开始f缓冲冲的计算*/
memcpy(fblk,rblk,4);
/*置换、扩展右数据块的拷贝,使其达到48位*/
permute(fblk, DesExpansion, 48);
/*根据direction的值来应用适当的子密钥*/
if(direction == encipher)
{
/*加密数据,子密钥组以递增的顺序应用*/
bit_xor(fblk, subkeys[i], xblk, 48);
memcpy(fblk, xblk, 6);
}
else
{
/*解密数据,子密钥组以递减的顺序应用*/
bit_xor(fblk, subkeys[15-i], xblk, 48);
meycpy(fblk, xblk, 6);
}
/*执行S盒替换*/
p=0;
for(j=0; j<8; j++)
{
/*计算出S盒表中的行号和列号*/
row = (bit_get(fblk,(j*6)+0)*2) + (bit_get(fblk,(j*6)+5)*1);
col = (bit_get(fblk,(j*6)+1)*8) + (bit_get(fblk,(j*6)+2)*4) +
(bit_get(fblk,(j*6)+3)*2) + (bit_get(fblk,(j*6)+4)*1);
/*为当前的6位数据块做S盒替换*/
sblk = (unsigned char)DesSbox[j][row][col];
for (k=4; k<8; k++)
{
bit_set(fblk,p,bit_get(&sblk,k));
p++;
}
}
/*为f缓冲区执行P盒替换*/
permute(fblk, DesPbox, 32);
/*计算左数据块与f缓冲区的异或值*/
bit_xor(lblk, fblk, xblk, 32);