⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deal.c

📁 文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-1, SHA-224, SHA-256,
💻 C
字号:

/* This is an independent implementation of the encryption algorithm:   */
/*                                                                      */
/*         DEAL by Richard Outerbridge and Lars Knudsen                 */
/*                                                                      */
/* which is a candidate algorithm in the Advanced Encryption Standard   */
/* programme of the US National Institute of Standards and Technology.  */
/*                                                                      */
/* Copyright in this implementation is held by Dr B R Gladman but I     */
/* hereby give permission for its free direct or derivative use subject */
/* to acknowledgment of its origin and compliance with any conditions   */
/* that the originators of the algorithm place on its exploitation.     */
/*                                                                      */
/* Dr Brian Gladman  14th January 1999									*/

/* Timing Data for DEAL (deal.c)

With unmodified DES

128 bit key:
Key Setup:    8635 cycles
Encrypt:      2682 cycles =     9.5 mbits/sec
Decrypt:      2670 cycles =     9.6 mbits/sec
Mean:         2676 cycles =     9.6 mbits/sec

192 bit key:
Key Setup:    8651 cycles
Encrypt:      2677 cycles =     9.6 mbits/sec
Decrypt:      2669 cycles =     9.6 mbits/sec
Mean:         2673 cycles =     9.6 mbits/sec

256 bit key:
Key Setup:   11522 cycles
Encrypt:      3541 cycles =     7.2 mbits/sec
Decrypt:      3535 cycles =     7.2 mbits/sec
Mean:         3538 cycles =     7.2 mbits/sec

With modified DES

128 bit key:
Key Setup:    8635 cycles
Encrypt:      2339 cycles =    10.9 mbits/sec
Decrypt:      2365 cycles =    10.8 mbits/sec
Mean:         2352 cycles =    10.9 mbits/sec

192 bit key:
Key Setup:    8653 cycles
Encrypt:      2358 cycles =    10.9 mbits/sec
Decrypt:      2363 cycles =    10.8 mbits/sec
Mean:         2361 cycles =    10.8 mbits/sec

256 bit key:
Key Setup:   11698 cycles
Encrypt:      3115 cycles =     8.2 mbits/sec
Decrypt:      3088 cycles =     8.3 mbits/sec
Mean:         3102 cycles =     8.3 mbits/sec

*/

#define MODIFIED_DES

#include "../std_defs.h"
#include "../des/des.h"

#ifdef  MODIFIED_DES
  void des_ecm(const void *i_blk, void *o_blk, void *key);
#else
#  define   des_ecm des_ec
#endif

static char *alg_name[] = { "deal", "deal.c", "deal" };

char **cipher_name()
{
    return alg_name;
}

u4byte  ks_key[2] = { 0x67452301, 0xefcdab89 };

u4byte  ks_ks[32];  /* storage for the local key schedule   */
u4byte  ks_init = 0;

u4byte  k_len;      /* copy of key_length                   */ 
u4byte  l_key[256]; /* storage for key schedule             */

/* initialise the key schedule from the user supplied key   */

u4byte *set_key(const u4byte key_blk[], const u4byte key_len)
{   u4byte  lk[2];

    if(!ks_init)
    {
        des_ky(ks_key, ks_ks); ks_init = 1;
    }

    k_len = (key_len + 63) / 64;

    switch(k_len)
    {
        case 2:
            lk[0] = key_blk[0]; 
            lk[1] = key_blk[1]; 
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key);

            lk[0] ^= key_blk[2]; 
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key + 32);
              
            lk[0] ^= key_blk[0] ^ 0x00000080;  
            lk[1] ^= key_blk[1];
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key + 64);
              
            lk[0] ^= key_blk[2] ^ 0x00000040;  
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key + 96);
              
            lk[0] ^= key_blk[0] ^ 0x00000020;  
            lk[1] ^= key_blk[1];
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key + 128);
              
            lk[0] ^= key_blk[2] ^ 0x00000010;  
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key + 160);
            break;
        case 3:
            lk[0] = key_blk[0]; 
            lk[1] = key_blk[1]; 
            des_ec(lk, lk, ks_ks); 
            des_ky(lk, l_key);

            lk[0] ^= key_blk[2]; 
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 32);
              
            lk[0] ^= key_blk[4];  
            lk[1] ^= key_blk[5];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 64);
              
            lk[0] ^= key_blk[0] ^ 0x00000080;  
            lk[1] ^= key_blk[1];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 96);
              
            lk[0] ^= key_blk[2] ^ 0x00000040;  
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 128);
              
            lk[0] ^= key_blk[4] ^ 0x00000020;  
            lk[1] ^= key_blk[5];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 160);
            break;
        case 4:
            lk[0] = key_blk[0]; 
            lk[1] = key_blk[1]; 
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key);

            lk[0] ^= key_blk[2]; 
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 32);
              
            lk[0] ^= key_blk[4];  
            lk[1] ^= key_blk[5];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 64);
              
            lk[0] ^= key_blk[6];  
            lk[1] ^= key_blk[7];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 96);
              
            lk[0] ^= key_blk[0] ^ 0x00000080;  
            lk[1] ^= key_blk[1];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 128);
              
            lk[0] ^= key_blk[2] ^ 0x00000040;  
            lk[1] ^= key_blk[3];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 160);
            lk[0] ^= key_blk[4] ^ 0x00000020;  
            lk[1] ^= key_blk[5];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 192);
              
            lk[0] ^= key_blk[6] ^ 0x00000010;  
            lk[1] ^= key_blk[7];
            des_ec(lk, lk, ks_ks); des_ky(lk, l_key + 224);
            break;
    }   
    return l_key;
};

/* encrypt a block of text  */

void encrypt(const u4byte in_blk[4], u4byte out_blk[4])
{   u4byte  a[2], b[2], c[2], tt;

    a[0] = in_blk[0]; a[1] = in_blk[1];
    b[0] = in_blk[2]; b[1] = in_blk[3];
    
#ifdef  MODIFIED_DES
    ip(a[1], a[0]); ip(b[1], b[0]);
#endif

    des_ecm(a, c, l_key +   0); b[0] ^= c[0]; b[1] ^= c[1];
    des_ecm(b, c, l_key +  32); a[0] ^= c[0]; a[1] ^= c[1];

    des_ecm(a, c, l_key +  64); b[0] ^= c[0]; b[1] ^= c[1];
    des_ecm(b, c, l_key +  96); a[0] ^= c[0]; a[1] ^= c[1];

    des_ecm(a, c, l_key + 128); b[0] ^= c[0]; b[1] ^= c[1];
    des_ecm(b, c, l_key + 160); a[0] ^= c[0]; a[1] ^= c[1];

    if(k_len == 4)
    {
        des_ecm(a, c, l_key + 192); b[0] ^= c[0]; b[1] ^= c[1];
        des_ecm(b, c, l_key + 224); a[0] ^= c[0]; a[1] ^= c[1];

    }

#ifdef  MODIFIED_DES
    fp(a[1], a[0]); fp(b[1], b[0]);
#endif

    out_blk[0] = a[0]; out_blk[1] = a[1];
    out_blk[2] = b[0]; out_blk[3] = b[1];
};

/* decrypt a block of text  */

void decrypt(const u4byte in_blk[4], u4byte out_blk[4])
{   u4byte  a[2], b[2], c[2], tt;

    a[0] = in_blk[0]; a[1] = in_blk[1];
    b[0] = in_blk[2]; b[1] = in_blk[3];

#ifdef  MODIFIED_DES
    ip(a[1], a[0]); ip(b[1], b[0]);
#endif
     
    if(k_len == 4)
    {
        des_ecm(b, c, l_key + 224); a[0] ^= c[0]; a[1] ^= c[1];
        des_ecm(a, c, l_key + 192); b[0] ^= c[0]; b[1] ^= c[1];
    }

    des_ecm(b, c, l_key + 160); a[0] ^= c[0]; a[1] ^= c[1];
    des_ecm(a, c, l_key + 128); b[0] ^= c[0]; b[1] ^= c[1];

    des_ecm(b, c, l_key +  96); a[0] ^= c[0]; a[1] ^= c[1];
    des_ecm(a, c, l_key +  64); b[0] ^= c[0]; b[1] ^= c[1];

    des_ecm(b, c, l_key +  32); a[0] ^= c[0]; a[1] ^= c[1];
    des_ecm(a, c, l_key +   0); b[0] ^= c[0]; b[1] ^= c[1];

#ifdef  MODIFIED_DES
    fp(a[1], a[0]); fp(b[1], b[0]);
#endif

    out_blk[0] = a[0]; out_blk[1] = a[1];
    out_blk[2] = b[0]; out_blk[3] = b[1];
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -