📄 des.cpp
字号:
#include "StdAfx.h"
#include ".\des.h"
//块信息
unsigned char IP[ BLOCK_SIZE ]=
{
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
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
};
unsigned char REV_IP[ BLOCK_SIZE ]=
{
40, 8, 48, 16, 56, 24, 64, 32,
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
};
unsigned char E[ BLOCK_SIZE1 ]=
{
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1
};
unsigned char P[ BLOCK_SIZE1 ]=
{
16, 7, 20, 21,
29, 12, 28, 17,
1, 15, 23, 26,
5, 18, 31, 10,
2, 8, 24, 14,
32, 27, 3, 9,
19, 13, 30, 6,
22, 11, 4, 25
};
unsigned char S[8][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}
},
{
{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}
},
{
{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}
},
{
{ 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}
},
{
{ 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}
},
{
{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}
},
{
{ 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}
},
{
{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}
}
};
unsigned char PC_1[ BLOCK_SIZE1 ]=
{
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4
};
unsigned char PC_2[ BLOCK_SIZE2 ]=
{
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32
};
unsigned char LS[16]=
{
1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
};
// 初始化操作
CDES::CDES(void)
{
}
CDES::~CDES(void)
{
}
void CDES::DES_Compute(unsigned char _message[], unsigned char _key[], bool isEncode)
{
unsigned char *message = new unsigned char [BLOCK_SIZE];
unsigned char *key = new unsigned char [BLOCK_SIZE];
for(int i = 0; i < 8; ++i)
{
ConvertByteToBit(&message[8*i], _message[i]);
ConvertByteToBit(&key[8*i], _key[i]);
}
if(!(_key[7]))
{
unsigned char temp;
int j = 7;
for(int i = 62; i > 7 ; i--)
{
key[i] = key[i - j];
if( (i%8)== 7 )
{
key[i-1] = key[i - j];
i--;
j--;
}
}
}
//IP变换
InitialProcess(IP, message);
m_leftBlock = &message[0];
m_rightBlock = &message[BLOCK_SIZE/2];//初始化 m_rightBlock 和 m_leftBlock
if(isEncode == DECODE)
{
Exchange_HalfBlock();
}
//16轮变换
//先对密钥作变换PC_1处理
InitialProcess(PC_1, key, BLOCK_SIZE1);
for(int i = 0; i < 16; ++i)
{
if(isEncode == ENCODE)
{
TurnConvert(key, i, ENCODE);
//
cout<<"第"<<i<<"轮:"<<endl;
ShowBlock();
}
else
{
TurnConvert(key, i, DECODE);
//
cout<<"第"<<i<<"轮:"<<endl;
ShowBlock();
}
}
//IP逆变换
//其中作了15次交换,即将结果的message左边和右边块做交换即可
unsigned char swap_char;
for(int i = 0; i < BLOCK_SIZE/2; ++i )
{
swap_char = message[i];
message[i] = message[ (i+BLOCK_SIZE/2) ];
message[ (i+BLOCK_SIZE/2) ] = swap_char;
}
InitialProcess(REV_IP, message);
//再将Bit串转成Byte格式
for(int i = 0; i < 8; ++i)
{
ConvertBitToByte(_message[i], &message[8*i]);
}
delete [] message;
delete [] key;
}
//作IP变换或反变换,以达混乱的目的
void CDES::InitialProcess(unsigned char IP_RIP[], unsigned char message[], int IP_RIP_size, int msg_size)
{
unsigned char *temp_msg = new unsigned char [ msg_size ];
memcpy( temp_msg, message, msg_size );
for(int i = 0; i < IP_RIP_size; ++i)
{
message[i] = temp_msg[ (IP_RIP[i] - 1) ];
}
}
//块交换
void CDES::Exchange_HalfBlock(void)
{
unsigned char * ptr = m_leftBlock;
m_leftBlock = m_rightBlock;
m_rightBlock = ptr;
}
// 轮变换
void CDES::TurnConvert(unsigned char key[], int turn_num, bool isEncode)
{
//产生子密钥
unsigned char sub_key[BLOCK_SIZE1];
if(isEncode == ENCODE)
{
GenSubKey(key, sub_key, turn_num);
}
else
{
GenSubKey(key, sub_key, 15-turn_num);
}
//信息之右半块作E盒变换
unsigned char *newBlock = new unsigned char[ BLOCK_SIZE2 ];
if(isEncode == ENCODE)
{
memcpy(newBlock, m_rightBlock, BLOCK_SIZE/2);
}
else
{
memcpy(newBlock, m_leftBlock, BLOCK_SIZE/2);
}
InitialProcess(E, newBlock, BLOCK_SIZE2, BLOCK_SIZE/2);
//与子密钥作异或运算
Array_XOR(newBlock, sub_key, BLOCK_SIZE2);
//作S盒变换
SBoxConvert(newBlock, BLOCK_SIZE2);
//作P盒变换
InitialProcess(P, newBlock, BLOCK_SIZE/2, BLOCK_SIZE/2);
if(isEncode == ENCODE)
{
//与左块做异或运算
Array_XOR(newBlock, m_leftBlock, BLOCK_SIZE/2);
//将新块交给右块
memcpy(m_leftBlock, newBlock, BLOCK_SIZE/2);
}
else
{
Array_XOR(newBlock, m_rightBlock, BLOCK_SIZE/2);
//将新块交给右块
memcpy(m_rightBlock, newBlock, BLOCK_SIZE/2);
}
//交换左右块标志
Exchange_HalfBlock();
//释放newBlock
delete [] newBlock;
}
// 块之间作异或运算
void CDES::Array_XOR(unsigned char blockdest[], unsigned char blocksource[], int block_size)
{
for(int i = 0; i < block_size; ++i)
{
blockdest[i] ^= blocksource[i];
}
}
//子密钥生成
void CDES::GenSubKey(unsigned char key[], unsigned char sub_key[], int order, int keyLen, bool isEncode)
{
memcpy(sub_key, key, keyLen);
ShiftKey(&sub_key[0], keyLen/2, LS[order]);
ShiftKey(&sub_key[(int)(keyLen/2)], keyLen/2, LS[order]);
InitialProcess(PC_2, sub_key, BLOCK_SIZE2, BLOCK_SIZE1);
// ShowSubKey(sub_key);
//sub_key的前48位即位子密钥
}
// 对子密钥等作循环移位操作
void CDES::ShiftKey(unsigned char key[], int keyLen, int shiftTimes, int isLShift)
{
if(isLShift == RIGHTSHIFT)
{
shiftTimes = keyLen - shiftTimes;//将循环右移转化为循环左移
}
//-------Point---Point---
int *prokey = new int [shiftTimes];//prokey指密钥的前面部分
for(int i=0; i<shiftTimes; i++)
{
prokey[i] = key[i];
}
for(int i=shiftTimes; i<keyLen; i++)
{
key[i-shiftTimes] = key[i];
}
for(int i = keyLen-shiftTimes, int j=0; j<shiftTimes; j++, i++)
{
key[i] = prokey[j];
}
delete [] prokey;
}
// 用于计算S盒
//当message(48bit)返回时,应为32bit长
void CDES::SBoxConvert(unsigned char message[], int msgLen)
{
unsigned char firstPart, secondPart, result;
for(int i = 0; i < msgLen/6; ++i)//作8次S变化
{
firstPart = 0;
secondPart = 0;
//firstPart...
firstPart |= message[i*6 + 0];
firstPart <<= 1;
firstPart |= message[i*6 + 5];
//secondPart...
for(int j = 1; j <=4; ++j)
{
secondPart <<= 1;
secondPart |= message[i*6 + j];
}
//result...
result = S[i][firstPart][secondPart];
for(int j = 3; j >= 0; --j)
{
message[4*i + j] = result & 0x01;
result >>= 1;
}
}
}
// 将Byte流转化成Bit流
void CDES::ConvertByteToBit(unsigned char destBitValue[], unsigned char sourceByteValue)
{
for(int i = 0;i < 8; ++i)
{
destBitValue[7 - i] = sourceByteValue & 0x01;
sourceByteValue >>= 1;
}
}
// 将Bit流转化成Byte
void CDES::ConvertBitToByte(unsigned char &destByte, unsigned char sourceBits[])
{
destByte = 0;
for(int i = 0; i < 8; ++i)
{
destByte <<= 1;
destByte |= sourceBits[i];
}
}
void CDES::ShowBlock(void)
{
cout<<"Left :";
for(int i = 0; i < 32; ++i)cout<<(int)m_leftBlock[i];
cout<<endl<<"Right:";
for(int i = 0; i < 32; ++i)cout<<(int)m_rightBlock[i];
cout<<endl;
}
void CDES::ShowSubKey(unsigned char sub_key[], int size)
{
cout<<"Sub_key[Left]:";
for(int i = 0; i < size;++i)
{
cout<<(int)sub_key[i];
if(i == (size/2)-1 )
{
cout<<endl<<"Sub_key[Right]:";
}
}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -