[DES] 可能有用的几个加密解密函数,先放着,调查完再来看

和 flex里面的as里面函数用的数据结构差不多,先放着,再慢慢比较。


这个算法是参考一个DELHI的加密库所使用的算法用C实现的. 


使用CBC模式对文件实行加密,速度大概是16M/SEC   .这是我所见最快的,请问谁还有更快的算法?不考虑空间问题,但求速度. 
不论何种语言. 

//DES函数 
void   SingledesFunc(unsigned   int   *Data,unsigned   int   *Key) 


    unsigned   int   L,R,X,Y,i; 

    L   =   Data[0]; 
    R   =   Data[1]; 
    _asm{ 
    mov   eax,[L] 
    BSWAP   eax 
    mov   [L],eax 

    mov   eax,[R] 
    BSWAP   eax 
    mov   [R],eax 
    } 
    ///SwapInteger(L); 
    //SwapInteger(R); 

    X   =   (L   > >     4   ^   R)   &   0x0F0F0F0F;   R   =   R   ^   X;   L   =   L   ^   X   < <     4; 
    X   =   (L   > >   16   ^   R)   &   0x0000FFFF;   R   =   R   ^   X;   L   =   L   ^   X   < <   16; 
    X   =   (R   > >     2   ^   L)   &   0x33333333;   L   =   L   ^   X;   R   =   R   ^   X   < <     2; 
    X   =   (R   > >     8   ^   L)   &   0x00FF00FF;   L   =   L   ^   X;   R   =   R   ^   X   < <     8; 

    R   =   R   < <   1   |   R   > >   31; 
    X   =   (L   ^   R)   &   0xAAAAAAAA; 
    R   =   R   ^   X; 
    L   =   L   ^   X; 
    L   =   L   < <   1   |   L   > >   31; 

    for(i=   0;i <8;i++) 
    { 
        X   =   (R   < <   28   |   R   > >   4)   ^   (*Key); 
Key++; 
        
Y   =   R   ^   (*Key);                     
Key   ++; 
        L   =   L   ^   (DES_Data[0][   X                 &   0x3F]   |   DES_Data[1][   X   > >     8   &   0x3F]   | 
  DES_Data[2][   X   > >   16   &   0x3F]     |   DES_Data[3][   X   > >   24   &   0x3F]   | 
                          DES_Data[4][   Y                 &   0x3F]   |   DES_Data[5][   Y   > >     8   &   0x3F]   | 
                          DES_Data[6][   Y   > >   16   &   0x3F]     |   DES_Data[7][   Y   > >   24   &   0x3F]); 

        X   =   (L   < <   28   |   L   > >   4)   ^   (*Key); 
Key++; 

        Y   =   L   ^   (*Key); 
Key++; 

        R   =   R   ^   (DES_Data[0][     X                 &   0x3F]   |   DES_Data[1][     X   > >     8   &   0x3F]   | 
                                DES_Data[2][   X   > >   16   &   0x3F]   |   DES_Data[3][     X   > >   24   &   0x3F]   | 
                                DES_Data[4][   Y                 &   0x3F]   |   DES_Data[5][   Y   > >     8   &   0x3F]   | 
                                DES_Data[6][   Y   > >   16   &   0x3F]   |   DES_Data[7][   Y   > >   24   &   0x3F]); 
    } 

    R   =   R   < <   31   |   R   > >   1; 
    X   =   (L   ^   R)   &   0xAAAAAAAA; 
    R   =   R   ^   X; 
    L   =   L   ^   X; 
    L   =   L   < <   31   |   L   > >   1; 

    X   =   (L   > >     8   ^   R)   &   0x00FF00FF;   R   =   R   ^   X;   L   =   L   ^   X   < <     8; 
    X   =   (L   > >     2   ^   R)   &   0x33333333;   R   =   R   ^   X;   L   =   L   ^   X   < <     2; 
    X   =   (R   > >   16   ^   L)   &   0x0000FFFF;   L   =   L   ^   X;   R   =   R   ^   X   < <   16; 
    X   =   (R   > >     4   ^   L)   &   0x0F0F0F0F;   L   =   L   ^   X;   R   =   R   ^   X   < <     4; 

    _asm{ 
    mov   eax,[L] 
    BSWAP   eax 
    mov   [L],eax 

    mov   eax,[R] 
    BSWAP   eax 
    mov   [R],eax 
    } 
    
    Data[0]   =   R; 
    Data[1]   =   L; 



void   desMakeKey(char   *Data,unsigned   int   *   Key   ,int   Reverse) 

  
    unsigned   int   I,J,L,M,N; 
    unsigned   char   PC_M[56],   PC_R[56]; 
    unsigned   int   K[32]; 

    memset(K,     0,sizeof(K)); 
    for(I=0;   I <56;I++) 
    { 
        if   ((Data[DES_PC1[I]   > >   3]   &   (0x80   > >   (DES_PC1[I]   &   0x07))   )!=   0) 
PC_M[I]   =   1; 
        else   
PC_M[I]   =   0; 
    } 

    for(I=0;I <16;I++) 
    { 
        if(Reverse   ) 
      M   =   (15   -   I)   < <   1; 
else   
      M   =   I   < <   1; 

        N   =   M   +   1; 

        for(J=0;J <28;J++) 
        { 
            L   =   J   +   ROT[I]; 
            if   (L   <   28)   
    PC_R[J]   =   PC_M[L]; 
    else   
    PC_R[J]   =   PC_M[L   -   28]; 
        } 

        for(J=28;J <56;J++) 
        { 
            L   =   J   +   ROT[I]; 
            if   (L   <   56) 
    PC_R[J]   =   PC_M[L]; 
    else   
    PC_R[J]   =   PC_M[L   -   28]; 
        } 

        L   =   0x1000000; 
        for(J=0;J <24;J++) 
        { 
            L   =   L   > >   1; 
            if(PC_R[DES_PC2[J           ]]   !=   0) 
    K[M]   =   K[M]   |     L; 
            if(PC_R[DES_PC2[J   +   24]]   !=   0) 
    K[N]   =   K[N]   |     L; 
        } 
    } 

    for(I=0;I <16;I++) 
    { 
        M   =   I   < <   1;   
N   =   M   +   1; 
        (*Key)   =   K[M]   &   0x00FC0000   < <     6   |   
                        K[M]   &   0x00000FC0   < <   10   |   
                        K[N]   &   0x00FC0000   > >   10   |   
                        K[N]   &   0x00000FC0   > >     6; 
        Key++; 
        (*Key)   =   K[M]   &   0x0003F000   < <   12   |   
                        K[M]   &   0x0000003F   < <   16   |   
                        K[N]   &   0x0003F000   > >     4   |   
                        K[N]   &   0x0000003F; 
        Key++; 
    } 


//缩小选择换位表 
const   static   unsigned   char   DES_PC1[56]   = 

56,   48,   40,   32,   24,   16,     8,     0,   57,   49,   41,   33,   25,   17, 
          9,     1,   58,   50,   42,   34,   26, 18,   10,     2,   59,   51,   43,   35, 
        62,   54,   46,   38,   30,   22,   14,   6,   61,   53,   45,   37,   29,   21, 
        13,     5,   60,   52,   44,   36,   28, 20,   12,     4,   27,   19,   11,     3 
}; 

//单纯置换规则     
const   static     unsigned   char   DES_PC2[48]   = 

13,   16,   10,   23,     0,     4,     2,   27,   14,     5,   20,     9, 
        22,   18,   11,     3,   25,     7,   15,     6,   26,   19,   12,     1, 
        40,   51,   30,   36,   46,   54,   29,   39,   50,   44,   32,   47, 
        43,   48,   38,   55,   33,   52,   45,   41,   49,   35,   28,   31 
}; 

//循环表 
const   static     unsigned   char   ROT[16]   =   
{1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28}; 

//用于DES运算的数据. 
const   static   unsigned   int   DES_Data[8][64]   =   { 
{0x00200000,0x04200002,0x04000802,0x00000000,0x00000800,0x04000802,0x00200802,0x04200800, 
        0x04200802,0x00200000,0x00000000,0x04000002,0x00000002,0x04000000,0x04200002,0x00000802, 
        0x04000800,0x00200802,0x00200002,0x04000800,0x04000002,0x04200000,0x04200800,0x00200002, 
        0x04200000,0x00000800,0x00000802,0x04200802,0x00200800,0x00000002,0x04000000,0x00200800, 
        0x04000000,0x00200800,0x00200000,0x04000802,0x04000802,0x04200002,0x04200002,0x00000002, 
        0x00200002,0x04000000,0x04000800,0x00200000,0x04200800,0x00000802,0x00200802,0x04200800, 
        0x00000802,0x04000002,0x04200802,0x04200000,0x00200800,0x00000000,0x00000002,0x04200802, 
        0x00000000,0x00200802,0x04200000,0x00000800,0x04000002,0x04000800,0x00000800,0x00200002}, 
{0x00000100,0x02080100,0x02080000,0x42000100,0x00080000,0x00000100,0x40000000,0x02080000, 
        0x40080100,0x00080000,0x02000100,0x40080100,0x42000100,0x42080000,0x00080100,0x40000000, 
        0x02000000,0x40080000,0x40080000,0x00000000,0x40000100,0x42080100,0x42080100,0x02000100, 
        0x42080000,0x40000100,0x00000000,0x42000000,0x02080100,0x02000000,0x42000000,0x00080100, 
        0x00080000,0x42000100,0x00000100,0x02000000,0x40000000,0x02080000,0x42000100,0x40080100, 
        0x02000100,0x40000000,0x42080000,0x02080100,0x40080100,0x00000100,0x02000000,0x42080000, 
        0x42080100,0x00080100,0x42000000,0x42080100,0x02080000,0x00000000,0x40080000,0x42000000, 
        0x00080100,0x02000100,0x40000100,0x00080000,0x00000000,0x40080000,0x02080100,0x40000100}, 
{0x00000208,0x08020200,0x00000000,0x08020008,0x08000200,0x00000000,0x00020208,0x08000200, 
        0x00020008,0x08000008,0x08000008,0x00020000,0x08020208,0x00020008,0x08020000,0x00000208, 
        0x08000000,0x00000008,0x08020200,0x00000200,0x00020200,0x08020000,0x08020008,0x00020208, 
        0x08000208,0x00020200,0x00020000,0x08000208,0x00000008,0x08020208,0x00000200,0x08000000, 
        0x08020200,0x08000000,0x00020008,0x00000208,0x00020000,0x08020200,0x08000200,0x00000000, 
        0x00000200,0x00020008,0x08020208,0x08000200,0x08000008,0x00000200,0x00000000,0x08020008, 
        0x08000208,0x00020000,0x08000000,0x08020208,0x00000008,0x00020208,0x00020200,0x08000008, 
        0x08020000,0x08000208,0x00000208,0x08020000,0x00020208,0x00000008,0x08020008,0x00020200}, 
{0x01010400,0x00000000,0x00010000,0x01010404,0x01010004,0x00010404,0x00000004,0x00010000, 
        0x00000400,0x01010400,0x01010404,0x00000400,0x01000404,0x01010004,0x01000000,0x00000004, 
        0x00000404,0x01000400,0x01000400,0x00010400,0x00010400,0x01010000,0x01010000,0x01000404, 
        0x00010004,0x01000004,0x01000004,0x00010004,0x00000000,0x00000404,0x00010404,0x01000000, 
        0x00010000,0x01010404,0x00000004,0x01010000,0x01010400,0x01000000,0x01000000,0x00000400, 
        0x01010004,0x00010000,0x00010400,0x01000004,0x00000400,0x00000004,0x01000404,0x00010404, 
        0x01010404,0x00010004,0x01010000,0x01000404,0x01000004,0x00000404,0x00010404,0x01010400, 
        0x00000404,0x01000400,0x01000400,0x00000000,0x00010004,0x00010400,0x00000000,0x01010004}, 
{0x10001040,0x00001000,0x00040000,0x10041040,0x10000000,0x10001040,0x00000040,0x10000000, 
        0x00040040,0x10040000,0x10041040,0x00041000,0x10041000,0x00041040,0x00001000,0x00000040, 
        0x10040000,0x10000040,0x10001000,0x00001040,0x00041000,0x00040040,0x10040040,0x10041000, 
        0x00001040,0x00000000,0x00000000,0x10040040,0x10000040,0x10001000,0x00041040,0x00040000, 
        0x00041040,0x00040000,0x10041000,0x00001000,0x00000040,0x10040040,0x00001000,0x00041040, 
        0x10001000,0x00000040,0x10000040,0x10040000,0x10040040,0x10000000,0x00040000,0x10001040, 
        0x00000000,0x10041040,0x00040040,0x10000040,0x10040000,0x10001000,0x10001040,0x00000000, 
        0x10041040,0x00041000,0x00041000,0x00001040,0x00001040,0x00040040,0x10000000,0x10041000}, 
      {0x20000010,0x20400000,0x00004000,0x20404010,0x20400000,0x00000010,0x20404010,0x00400000, 
        0x20004000,0x00404010,0x00400000,0x20000010,0x00400010,0x20004000,0x20000000,0x00004010, 
        0x00000000,0x00400010,0x20004010,0x00004000,0x00404000,0x20004010,0x00000010,0x20400010, 
        0x20400010,0x00000000,0x00404010,0x20404000,0x00004010,0x00404000,0x20404000,0x20000000, 
        0x20004000,0x00000010,0x20400010,0x00404000,0x20404010,0x00400000,0x00004010,0x20000010, 
        0x00400000,0x20004000,0x20000000,0x00004010,0x20000010,0x20404010,0x00404000,0x20400000, 
        0x00404010,0x20404000,0x00000000,0x20400010,0x00000010,0x00004000,0x20400000,0x00404010, 
        0x00004000,0x00400010,0x20004010,0x00000000,0x20404000,0x20000000,0x00400010,0x20004010}, 
      {0x00802001,0x00002081,0x00002081,0x00000080,0x00802080,0x00800081,0x00800001,0x00002001, 
        0x00000000,0x00802000,0x00802000,0x00802081,0x00000081,0x00000000,0x00800080,0x00800001, 
        0x00000001,0x00002000,0x00800000,0x00802001,0x00000080,0x00800000,0x00002001,0x00002080, 
        0x00800081,0x00000001,0x00002080,0x00800080,0x00002000,0x00802080,0x00802081,0x00000081, 
        0x00800080,0x00800001,0x00802000,0x00802081,0x00000081,0x00000000,0x00000000,0x00802000, 
        0x00002080,0x00800080,0x00800081,0x00000001,0x00802001,0x00002081,0x00002081,0x00000080, 
        0x00802081,0x00000081,0x00000001,0x00002000,0x00800001,0x00002001,0x00802080,0x00800081, 
        0x00002001,0x00002080,0x00800000,0x00802001,0x00000080,0x00800000,0x00002000,0x00802080}, 
      {0x80108020,0x80008000,0x00008000,0x00108020,0x00100000,0x00000020,0x80100020,0x80008020, 
        0x80000020,0x80108020,0x80108000,0x80000000,0x80008000,0x00100000,0x00000020,0x80100020, 
        0x00108000,0x00100020,0x80008020,0x00000000,0x80000000,0x00008000,0x00108020,0x80100000, 
        0x00100020,0x80000020,0x00000000,0x00108000,0x00008020,0x80108000,0x80100000,0x00008020, 
        0x00000000,0x00108020,0x80100020,0x00100000,0x80008020,0x80100000,0x80108000,0x00008000, 
        0x80100000,0x80008000,0x00000020,0x80108020,0x00108020,0x00000020,0x00008000,0x80000000, 
        0x00008020,0x80108000,0x00100000,0x80000020,0x00100020,0x80008020,0x80000020,0x00100020, 
        0x00108000,0x00000000,0x80008000,0x00008020,0x80000000,0x80100020,0x80108020,0x00108000}}; 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值