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

📄 tdes.c

📁 用C语言写的TDES算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
* 版权所有 (C)2007, 中兴软件技术(南昌)有限公司。
* 
* 文件名称:  TDES.c
* 文件标识: 
* 内容摘要:  TDES算法模块
* 其它说明:  其它内容的说明
* 当前版本:  V1.0
* 作    者:  张迪 中兴软件技术(南昌)有限公司
* 完成日期:  2007-10-24
* 
* 修改记录1:
* 修改日期:  2008-5-8
* 版 本 号:  V1.1
* 修 改 人:  Dragon Cai
* 修改内容:  规范代码,添加部分注释
* 修改记录2:…
*******************************************************************************/

/******************************************************************************
* 包含的头文件
******************************************************************************/
#include <stdlib.h>

#include "TDES.h"

/******************************************************************************
* 常量表
******************************************************************************/
// Table - aucTab1
const BYTE aucTab1[TAB_M][TAB_N] = {
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};

// Table - aucTab2
const BYTE aucTab2[TAB_M][TAB_N] = {
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};

// Table - aucTab3
const BYTE aucTab3[TAB_M][TAB_N] = {
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};

// Table - aucTab4
const BYTE aucTab4[TAB_M][TAB_N] = {
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};

// Table - aucTab5
const BYTE aucTab5[TAB_M][TAB_N] = {
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};

// Table - aucTab6
const BYTE aucTab6[TAB_M][TAB_N] = {
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};

// Table - aucTab7
const BYTE aucTab7[TAB_M][TAB_N] = {
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};

// Table - aucTab8
const BYTE aucTab8[TAB_M][TAB_N] = {
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};


// Table - aucShift
const BYTE aucShift[TAB_N] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};


// Table - aucBinary
const BYTE aucBinary[64] = {
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,
0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1,
1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1,
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1};


/******************************************************************************
* 内部函数声明
******************************************************************************/

// DES加、解密
BYTE Des(BYTE *pucSource, BYTE *pucOutput, BYTE *pucKey, int iFlag); 

/******************************************************************************
* 函数名称:  Encrypt_TDES
* 功能描述:  进行TDES加密
* 输入参数:  UBYTE *pucSource  原文 8 字节
*             UBYTE *pucKey     密钥 16字节
* 输出参数:  UBYTE *pucOutput  密文 8 字节
* 返 回 值:  无函数返回值 
* 其它说明:  无
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2007/11/20	  V0.1	     张迪         
******************************************************************************/
void Encrypt_TDES(BYTE *pucSource, BYTE *pucKey, BYTE *pucOutput)
{
    BYTE pucKeyLeft[8]  = {0};
    BYTE pucKeyRight[8] = {0};
    BYTE pucOutput1[8]  = {0};
    BYTE pucOutput2[8]  = {0};
    
    int i = 0;

    // 将16字节的key分成两部分
    for (i = 0; i < 8; i++)
    {
       pucKeyLeft[i]  = pucKey[i];
       pucKeyRight[i] = pucKey[i + 8];
    }

    // 对原文进行加密,加密后的数据放在pucOutput1中
    Des(pucSource, pucOutput1, pucKeyLeft, 1);

    // 对pucOutput1进行解密,解密后的数据放在pucOutput2中
    Des(pucOutput1, pucOutput2, pucKeyRight, 0);
    
    // 对pucOutput2进行加密,加密后的数据放在pucOutput中
    Des(pucOutput2, pucOutput, pucKeyLeft, 1);
}

/******************************************************************************
* 函数名称:  Decrypt_TDES
* 功能描述:  进行TDES解密
* 输入参数:  UBYTE *pucSource  原文 8 字节
*             UBYTE *pucKey     密钥 16字节
* 输出参数:  UBYTE *pucOutput  密文 8 字节
* 返 回 值:  无函数返回值 
* 其它说明:  无
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2007/11/20	  V0.1	     张迪         
******************************************************************************/
void Decrypt_TDES(BYTE *pucSource, BYTE *pucKey, BYTE *pucOutput)
{
    BYTE pucKeyLeft[8]  = {0};
    BYTE pucKeyRight[8] = {0};
    BYTE pucOutput1[8]  = {0};
    BYTE pucOutput2[8]  = {0};
    
    int i = 0;

    // 将16字节的key分成两部分
    for (i = 0; i < 8; i++)
    {
       pucKeyLeft[i]  = pucKey[i];
       pucKeyRight[i] = pucKey[i + 8];
    }

    // 对原文进行解密,解密后的数据放在pucOutput1中
    Des(pucSource, pucOutput1, pucKeyLeft, 0);

    // 对pucOutput1进行加密,加密后的数据放在pucOutput2中
    Des(pucOutput1, pucOutput2, pucKeyRight, 1);
    
    // 对pucOutput2进行解密,解密后的数据放在pucOutput中
    Des(pucOutput2, pucOutput, pucKeyLeft, 0);
}

/******************************************************************************
* 函数名称:  Des
* 功能描述:  进行DES加解密
* 输入参数:  UBYTE *pucSource  输入源
*             UBYTE *pucKey     密钥
*             INT iFlag         处理标志1加密,0解密
* 输出参数:  UBYTE *pucOutput  输出结果
* 返 回 值:  无函数返回值 
* 其它说明:  无
* 修改日期        版本号     修改人	      修改内容
* -----------------------------------------------
* 2007/11/20	  V0.1	     张迪         
******************************************************************************/
BYTE Des(BYTE *pucSource, BYTE * pucOutput, BYTE * pucKey, int iFlag)
{
    BYTE aucBufOut[64] = {0};
    BYTE aucKwork[56]  = {0};
    BYTE aucWorka[48]  = {0};
    BYTE aucKn[48]     = {0};
    BYTE aucBuffer[64] = {0};
    BYTE aucKey[64]    = {0};

    BYTE ucBrofaucShift, ucTmp1, ucTmp2;

    int valindex;
    int m = 0, n = 0;
    
    register int i, j, k, iter;

    // MAIN PROCESS
    // Convert from 64-bit aucKey into 64-byte aucKey
    for (i = 0; i < 8; i++)
    {
        aucKey[8*i]   = ((j = *(pucKey + i)) / 128) % 2;
        aucKey[8*i+1] = (j / 64) % 2;
        aucKey[8*i+2] = (j / 32) % 2;
        aucKey[8*i+3] = (j / 16) % 2;
        aucKey[8*i+4] = (j / 8) % 2;
        aucKey[8*i+5] = (j / 4) % 2;
        aucKey[8*i+6] = (j / 2) % 2;
        aucKey[8*i+7] = j % 2;
    }

    // Convert from 64-bit data into 64-byte data
    for (i = 0; i < 8; i++)
    {
        aucBuffer[8*i]   = ((j = *(pucSource + i)) / 128) % 2;
        aucBuffer[8*i+1] = (j / 64) % 2;
        aucBuffer[8*i+2] = (j / 32) % 2;
        aucBuffer[8*i+3] = (j / 16) % 2;
        aucBuffer[8*i+4] = (j / 8) % 2;
        aucBuffer[8*i+5] = (j / 4) % 2;
        aucBuffer[8*i+6] = (j / 2) % 2;
        aucBuffer[8*i+7] = j % 2;
    }

    // Initial Permutation of Data
    aucBufOut[ 0] = aucBuffer[57];
    aucBufOut[ 1] = aucBuffer[49];
    aucBufOut[ 2] = aucBuffer[41];
    aucBufOut[ 3] = aucBuffer[33];
    aucBufOut[ 4] = aucBuffer[25];
    aucBufOut[ 5] = aucBuffer[17];
    aucBufOut[ 6] = aucBuffer[ 9];
    aucBufOut[ 7] = aucBuffer[ 1];
    aucBufOut[ 8] = aucBuffer[59];
    aucBufOut[ 9] = aucBuffer[51];
    aucBufOut[10] = aucBuffer[43];
    aucBufOut[11] = aucBuffer[35];
    aucBufOut[12] = aucBuffer[27];
    aucBufOut[13] = aucBuffer[19];
    aucBufOut[14] = aucBuffer[11];
    aucBufOut[15] = aucBuffer[ 3];
    aucBufOut[16] = aucBuffer[61];
    aucBufOut[17] = aucBuffer[53];
    aucBufOut[18] = aucBuffer[45];
    aucBufOut[19] = aucBuffer[37];
    aucBufOut[20] = aucBuffer[29];
    aucBufOut[21] = aucBuffer[21];
    aucBufOut[22] = aucBuffer[13];
    aucBufOut[23] = aucBuffer[ 5];
    aucBufOut[24] = aucBuffer[63];
    aucBufOut[25] = aucBuffer[55];
    aucBufOut[26] = aucBuffer[47];
    aucBufOut[27] = aucBuffer[39];
    aucBufOut[28] = aucBuffer[31];
    aucBufOut[29] = aucBuffer[23];
    aucBufOut[30] = aucBuffer[15];
    aucBufOut[31] = aucBuffer[ 7];
    aucBufOut[32] = aucBuffer[56];
    aucBufOut[33] = aucBuffer[48];
    aucBufOut[34] = aucBuffer[40];
    aucBufOut[35] = aucBuffer[32];
    aucBufOut[36] = aucBuffer[24];
    aucBufOut[37] = aucBuffer[16];
    aucBufOut[38] = aucBuffer[ 8];
    aucBufOut[39] = aucBuffer[ 0];
    aucBufOut[40] = aucBuffer[58];
    aucBufOut[41] = aucBuffer[50];
    aucBufOut[42] = aucBuffer[42];
    aucBufOut[43] = aucBuffer[34];
    aucBufOut[44] = aucBuffer[26];
    aucBufOut[45] = aucBuffer[18];
    aucBufOut[46] = aucBuffer[10];
    aucBufOut[47] = aucBuffer[ 2];
    aucBufOut[48] = aucBuffer[60];
    aucBufOut[49] = aucBuffer[52];
    aucBufOut[50] = aucBuffer[44];
    aucBufOut[51] = aucBuffer[36];
    aucBufOut[52] = aucBuffer[28];
    aucBufOut[53] = aucBuffer[20];
    aucBufOut[54] = aucBuffer[12];
    aucBufOut[55] = aucBuffer[ 4];
    aucBufOut[56] = aucBuffer[62];
    aucBufOut[57] = aucBuffer[54];
    aucBufOut[58] = aucBuffer[46];
    aucBufOut[59] = aucBuffer[38];
    aucBufOut[60] = aucBuffer[30];
    aucBufOut[61] = aucBuffer[22];
    aucBufOut[62] = aucBuffer[14];
    aucBufOut[63] = aucBuffer[ 6];

    // Initial Permutation of aucKey 56
    aucKwork[ 0] = aucKey[56];
    aucKwork[ 1] = aucKey[48];
    aucKwork[ 2] = aucKey[40];
    aucKwork[ 3] = aucKey[32];
    aucKwork[ 4] = aucKey[24];
    aucKwork[ 5] = aucKey[16];
    aucKwork[ 6] = aucKey[ 8];
    aucKwork[ 7] = aucKey[ 0];
    aucKwork[ 8] = aucKey[57];
    aucKwork[ 9] = aucKey[49];
    aucKwork[10] = aucKey[41];
    aucKwork[11] = aucKey[33];
    aucKwork[12] = aucKey[25];
    aucKwork[13] = aucKey[17];
    aucKwork[14] = aucKey[ 9];
    aucKwork[15] = aucKey[ 1];
    aucKwork[16] = aucKey[58];
    aucKwork[17] = aucKey[50];
    aucKwork[18] = aucKey[42];
    aucKwork[19] = aucKey[34];
    aucKwork[20] = aucKey[26];
    aucKwork[21] = aucKey[18];
    aucKwork[22] = aucKey[10];
    aucKwork[23] = aucKey[ 2];
    aucKwork[24] = aucKey[59];
    aucKwork[25] = aucKey[51];
    aucKwork[26] = aucKey[43];
    aucKwork[27] = aucKey[35];
    aucKwork[28] = aucKey[62];
    aucKwork[29] = aucKey[54];
    aucKwork[30] = aucKey[46];
    aucKwork[31] = aucKey[38];
    aucKwork[32] = aucKey[30];
    aucKwork[33] = aucKey[22];
    aucKwork[34] = aucKey[14];
    aucKwork[35] = aucKey[ 6];
    aucKwork[36] = aucKey[61];
    aucKwork[37] = aucKey[53];
    aucKwork[38] = aucKey[45];
    aucKwork[39] = aucKey[37];
    aucKwork[40] = aucKey[29];
    aucKwork[41] = aucKey[21];
    aucKwork[42] = aucKey[13];
    aucKwork[43] = aucKey[ 5];
    aucKwork[44] = aucKey[60];
    aucKwork[45] = aucKey[52];
    aucKwork[46] = aucKey[44];
    aucKwork[47] = aucKey[36];
    aucKwork[48] = aucKey[28];
    aucKwork[49] = aucKey[20];
    aucKwork[50] = aucKey[12];
    aucKwork[51] = aucKey[ 4];
    aucKwork[52] = aucKey[27];
    aucKwork[53] = aucKey[19];
    aucKwork[54] = aucKey[11];
    aucKwork[55] = aucKey[ 3];

    // 16 Iterations
    for (iter = 1; iter < 17; iter++)
    {
        for (i = 0; i < 32; i++)
          aucBuffer[i] = aucBufOut[32+i];

        // Calculation of F(R, K),4*8data convert to 6*8 data

⌨️ 快捷键说明

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