DES加密算法模块

来源:互联网 发布:手机淘宝怎么查询等级 编辑:程序博客网 时间:2024/05/15 16:11
DES.h/*----------------------------------------------------------------------------


                              DES加密算法模块


                                                         2008.10.12


----------------------------------------------------------------------------*/


#include"DefineDESdata.h"


#define ENCRYPT 0


#define DECRYPT 1 


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


static bool SubKey[2][16][48];/*两个密钥的16轮子密钥*/


static char Tmp[256], deskey[16]; 


/*通用置换函数*/


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


{


        bool Tmp[64];


        for(int i = 0; i < len; ++ i) Tmp = In[ Table - 1 ];


        memcpy(Out, Tmp, len);


}






/*字节转换成位*/


void Byte2Bit(bool *Out, const char *In, int bits)


{


        for(int i = 0; i < bits; ++ i) Out = (In[i >> 3] >> (i & 7)) & 1;


}






/*位转换字节*/


void Bit2Byte(char *Out, const bool *In, int bits)


{


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


        for(int i = 0; i < bits; ++ i) Out[i >> 3] |= In << (i & 7);


}


/*异或运算*/


void Xor(bool *InA, const bool *InB, int len)


{


        for(int i = 0; i < len; ++ i) InA ^= InB;


}


/*循环左移*/


void MoveLeft(bool *In, int len, int loop)


{


        memcpy(Tmp, In, loop);


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


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









/* S盒置换*/


void funS(bool Out[32], const bool In[48])


{


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


        {


                j = (In[0] << 1) + In[5];


                k = (In[1] << 3) + (In[2] << 2) + (In[3] << 1) + In[4];


                Byte2Bit(Out, &Box_S[j][k], 4);


        }





/* F函数*/


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


{


        bool MR[48];


        Transform(MR, In, Table_E, 48);


        Xor(MR, Ki, 48);


        funS(In, MR);


        Transform(In, In, Table_P, 32);





/*生成子密钥*/


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


{


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


        Byte2Bit(K, Key, 64);


        Transform(K, K, Table_PC1, 56);


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


        {


                MoveLeft(KL, 28, Table_Moveleft);


                MoveLeft(KR, 28, Table_Moveleft);


                Transform((*pSubKey), K, Table_PC2, 48);


        }





/*生成密钥*/


void MakeKey(const char* Key, int len)


{


        memset(deskey, 0, 16);


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


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


        MakeSubKey(&SubKey[1], &deskey[8]);





//一重DES加/解密


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


{


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


        Byte2Bit(M, In, 64);


        Transform(M, M, Table_IP, 64);


        if( Type == ENCRYPT )/*加密*/


        {


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


                {


                        memcpy(tmp, Ri, 32);


                        funF(Ri, (*pSubKey));


                        Xor(Ri, Li, 32);


                        memcpy(Li, tmp, 32);


                }


        }


        else /*解密*/


        {


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


                {


                        memcpy(tmp, Li, 32);


                        funF(Li, (*pSubKey));


                        Xor(Li, Ri, 32);


                        memcpy(Ri, tmp, 32);


                }


        }


        Transform(M, M, Table_InverseIP, 64);


        Bit2Byte(Out, M, 64);


}


/* 3次DES 加密:加(key0)-解(key1)-加(key0) 解密:解(key0)-加(key1)-解(key0)*/


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


{


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


        MakeKey(Key, keylen);


        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;


0 0