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

📄 des.c

📁 des和3des加密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************************************
 file:         des.c
               library source file
 description:  DES and 3DES encrypt and decrypt
 author:       XieYongming
 version:      090722
 history:
***************************************************************************************************/
#define   _DES_C_
#include  "des.h"

static    const unsigned char const  m_bit8_tbl[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
/*build sub-ki_buf shift num*/
static    const unsigned char const  m_key_shift_tbl[16]= {1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28};
/*PC-1 tbl*/
static    const unsigned char const  m_pc1_tbl[56] = {
           7,  15,  23,  55,  51,  43,  35,
           6,  14,  22,  54,  50,  42,  34,
           5,  13,  21,  53,  49,  41,  33,
           4,  12,  20,  52,  48,  40,  32,
           3,  11,  19,  27,  47,  39,  31,
           2,  10,  18,  26,  46,  38,  30,
           1,   9,  17,  25,  45,  37,  29,
           0,   8,  16,  24,  44,  36,  28};
/*PC-2 tbl*/
static    const unsigned char const  m_pc2_tbl[56] = {
           4,  23,   6,  15,   5,   9,  19,  17,
          48,  11,   2,  14,  22,   0,   8,  18,
           1,  48,  13,  21,  10,  48,  12,   3,
          48,  16,  20,   7,  46,  30,  26,  47,
          34,  40,  48,  45,  27,  48,  38,  31,
          24,  43,  48,  36,  33,  42,  28,  35,
          37,  44,  32,  25,  41,  48,  29,  39};
/*IP tbl*/
static    const unsigned char const  m_ip_tbl[64] = {
          57,  49,  41,  33,  25,  17,  9,   1,
          59,  51,  43,  35,  27,  19,  11,  3,
          61,  53,  45,  37,  29,  21,  13,  5,
          63,  55,  47,  39,  31,  23,  15,  7,
          56,  48,  40,  32,  24,  16,   8,  0,
          58,  50,  42,  34,  26,  18,  10,  2,
          60,  52,  44,  36,  28,  20,  12,  4,
          62,  54,  46,  38,  30,  22,  14,  6 };
/*E tbl*/
static    const unsigned char const  m_e_tbl[48] = {
          31,   0,   1,    2,    3,   4,
           3,   4,   5,    6,    7,   8,
           7,   8,   9,   10,   11,  12,
          11,  12,  13,   14,   15,  16,
          15,  16,  17,   18,   19,  20,
          19,  20,  21,   22,   23,  24,
          23,  24,  25,   26,   27,  28,
          27,  28,  29,   30,   31,   0 };
/*S box*/
static    const unsigned char const  m_s1_tbl[4][16] = {
          14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
           0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
           4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
          15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13};
static    const unsigned char const  m_s2_tbl[4][16] = {
          15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
           3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
           0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
          13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14, 9};
static    const unsigned char const  m_s3_tbl[4][16] = {
          10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
          13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
          13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
           1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12};
static    const unsigned char const  m_s4_tbl[4][16] = {
           7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
          13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
          10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
           3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14};
static    const unsigned char const  m_s5_tbl[4][16] = {
           2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
          14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
           4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
          11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5, 3};
static    const unsigned char const  m_s6_tbl[4][16] = {
          12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
          10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
           9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
           4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13};
static    const unsigned char const  m_s7_tbl[4][16] = {
           4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
          13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
           1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
           6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12};
static    const unsigned char const  m_s8_tbl[4][16] = {
          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};
/*P tbl*/
static    const unsigned char const  m_p_tbl[32] = {
          15,   6,  19,  20,  28,  11,  27,  16,
           0,  14,  22,  25,   4,  17,  30,   9,
           1,   7,  23,  13,  31,  26,   2,   8,
          18,  12,  29,   5,  21,  10,   3,  24 };
/*IP_1 tbl*/
static    const unsigned char const  m_ip1_tbl[64] = {
          39,  7,  47,  15,  55,  23,  63,  31,
          38,  6,  46,  14,  54,  22,  62,  30,
          37,  5,  45,  13,  53,  21,  61,  29,
          36,  4,  44,  12,  52,  20,  60,  28,
          35,  3,  43,  11,  51,  19,  59,  27,
          34,  2,  42,  10,  50,  18,  58,  26,
          33,  1,  41,   9,  49,  17,  57,  25,
          32,  0,  40,   8,  48,  16,  56,  24 };

/***************************************************************************************************
 description:  build sub-ki
 input:        ks_buf[8]:  keyseed 8 bytes, MSB first
 output:       ki_buf[8]:  sub-ki[96]  96 bytes, 16 sub ki, 6 bytes per ki, MSB first
 return:
***************************************************************************************************/
void  f_build_ki (unsigned char ks_buf[], unsigned char ki_buf[])
{
    unsigned char i, j, k, byte_n, bit_n, byte_n1, bit_n1, shift_len;

    for (i=0; i<96; i++)
    {
        ki_buf[i] = 0;
    }
    for (i=0; i<16; i++)
    {
        byte_n  = 0;
        bit_n   = 0;
        shift_len = m_key_shift_tbl [i];
        for (j=0; j<56; j++)
        {
            if ((ks_buf[byte_n]&m_bit8_tbl [bit_n]) != 0)
            {
                k = m_pc1_tbl [j];
                if (k >= 28)
                {
                    k -= shift_len;
                    if (k < 28)
                    {
                        k += 28;
                    }
                }
                else
                {
                    k -= shift_len;
                    if (k > 28)
                    {
                        k += 28;
                    }
                }
                k = m_pc2_tbl [k];
                if (k < 48)
                {
                    byte_n1 = k >> 3;
                    bit_n1  = k & 0x07;
                    ki_buf[byte_n1+(i*6)] |= m_bit8_tbl [bit_n1];
                }
            }
            if (++bit_n >= 7)
            {
                bit_n = 0;
                byte_n++;
            }
        }
    }
}

/***************************************************************************************************
 description:  des fuction
 input:        pi_buf[8]:      plain input,     8 bytes,   MSB first
               ki_buf[8]:      sub-ki_buf,      8 bytes,   MSB first
               encry_decry:    1 encry    0 decry
 output:       co_buf[8]:      crypto output,   8 bytes,   MSB first
 return:
***************************************************************************************************/
void  f_des (unsigned char pi_buf[], unsigned char ki_buf[], unsigned char co_buf[], unsigned char encry_decry)
{
    unsigned char i, j, k;
    unsigned char byte_n, bit_n, byte_n1, bit_n1;
    unsigned char tmp_buf[8], s_out_buf[4];

    for (i=0; i<8; i++)
    {
        co_buf[i] = 0;
    }
    byte_n = 0; bit_n = 0;
    for (i=0; i<64; i++)
    {
        j       = m_ip_tbl [i];
        byte_n1 = j >> 3;
        bit_n1  = j & 0x07;
        if ((pi_buf[byte_n1]&m_bit8_tbl [bit_n1]) != 0)
        {
            co_buf[byte_n] |= m_bit8_tbl [bit_n];
        }
        if (++bit_n >= 8)
        {
            bit_n = 0;
            byte_n++;
        }
    }
    for (i=0; i<16; i++)
    {
        byte_n = 0;  bit_n = 0;
        for (j=0; j<6; j++)
        {
            tmp_buf[j] = 0;

⌨️ 快捷键说明

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