毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 报告 >> 正文

计算机安全技术DES算法实现上机报告 第2页

更新时间:2007-10-4:  来源:毕业论文

    13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,

        1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,

        7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,

     2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11

};

 

//////////////////////////////////////////////////////////////////////////

typedef bool    (*PSubKey)[16][48];

//////////////////////////////////////////////////////////////////////////

static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES/解密

static void SetKey(const char* Key, int len);// 设置密钥

static void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥

static void F_func(bool In[32], const bool Ki[48]);// f 函数

static void S_func(bool Out[32], const bool In[48]);// S 盒代替

static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换

static void Xor(bool *InA, const bool *InB, int len);// 异或

static void RotateL(bool *In, int len, int loop);// 循环左移

static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组

static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组

bool Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type)

{

    if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )

              return false;

       SetKey(Key, keylen);//设置密钥

       if( !Is3DES ) {   // 1DES

              for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)

                     DES(Out, In, &SubKey[0], Type);

       } else{   // 3DES 加密:(key0)-(key1)-(key0) 解密::(key0)-(key1)-(key0)

              for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {

                     DES(Out, In,  &SubKey[0], Type);

                     DES(Out, Out, &SubKey[1], !Type);

                     DES(Out, Out, &SubKey[0], Type);

              }

       }

       return true;

}

void SetKey(const char* Key, int len)

{

       memset(deskey, 0, 16);

       memcpy(deskey, Key, len>16?16:len);

       SetSubKey(&SubKey[0], &deskey[0]);

    if(Is3DES = len>8)

          Is3DES=(SetSubKey(&SubKey[1], &deskey[8]), true);

       else

          Is3DES=false;

             }

void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)

{

    static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32];

    ByteToBit(M, In, 64);

    Transform(M, M, IP_Table, 64);

    if( Type == jiami ){

        for(int i=0; i<16; ++i) {

            memcpy(tmp, Ri, 32);

            F_func(Ri, (*pSubKey)[i]);

            Xor(Ri, Li, 32);

            memcpy(Li, tmp, 32);

        }

    }else{

        for(int i=15; i>=0; --i) {

            memcpy(tmp, Li, 32);

            F_func(Li, (*pSubKey)[i]);

            Xor(Li, Ri, 32);

            memcpy(Ri, tmp, 32);

        }

       }

    Transform(M, M, IPR_Table, 64);

    BitToByte(Out, M, 64);

}

void SetSubKey(PSubKey pSubKey, const char Key[8])

{

    static bool K[64], *KL=&K[0], *KR=&K[28];

    ByteToBit(K, Key, 64);

    Transform(K, K, PC1_Table, 56);

    for(int i=0; i<16; ++i) {

        RotateL(KL, 28, LOOP_Table[i]);

        RotateL(KR, 28, LOOP_Table[i]);

        Transform((*pSubKey)[i], K, PC2_Table, 48);

    }

}

void F_func(bool In[32], const bool Ki[48])

{

    static bool MR[48];

    Transform(MR, In, E_Table, 48);

    Xor(MR, Ki, 48);

    S_func(In, MR);

    Transform(In, In, P_Table, 32);

}

void S_func(bool Out[32], const bool In[48])  //S 盒代替

{

    for(char i=0,j,k; i<8; ++i,In+=6,Out+=4) {

        j = (In[0]<<1) + In[5];                             //计算1位与6位组成的数

        k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];   // 计算2345位组成的数

              ByteToBit(Out, &S_Box[i][j][k], 4);      

    }

}

void Transform(bool *Out, bool *In, const char *Table, int len)//变换

{

    for(int i=0; i<len; ++i)

        Tmp[i] = In[ Table[i]-1 ]; //表中是以1为首

    memcpy(Out, Tmp, len);

}

void Xor(bool *InA, const bool *InB, int len) //位异或

{

    for(int i=0; i<len; ++i)

       {

              InA[i]=InA[i] ^ InB[i];

       }

       // InA[i] ^= InB[i];

}

void RotateL(bool *In, int len, int loop)   //循环左移

{

    memcpy(Tmp, In, loop);

    memcpy(In, In+loop, len-loop);

    memcpy(In+len-loop, Tmp, loop);

}

void ByteToBit(bool *Out, const char *In, int bits)  //字节转换为位

{

    for(int i=0; i<bits; ++i)

        Out[i] = (In[i>>3]>>(i&7)) & 1;

}

void BitToByte(char *Out, const bool *In, int bits)//位转换为字节

{

    memset(Out, 0, bits>>3);     

    for(int i=0; i<bits; ++i)    

       {

              Out[i>>3]=(Out[i>>3] | In[i]<<(i&7));

       }

        //Out[i>>3] |= In[i]<<(i&7);

}

五,运行结果:若图片无法显示请联系站长QQ752018766

辣、参考书目

   《计算机网络安全应用基础》

    杨富国  主编

    清华大学出版社  北京交通大学出版社  

20052月第1

了解了加密算法的使用

上一页  [1] [2] 

计算机安全技术DES算法实现上机报告 第2页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。