详解DES算法原理与实现(5)

/*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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f623b421ca1b32ccaf22f3f01c926f02.html