📄 tdes.c
字号:
/*******************************************************************************
* 版权所有 (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 + -