📄 des.cpp
字号:
// DES.cpp:DES类的实现
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ansi917.h"
#include "DES.h"
#include "datas.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDES::CDES()
{
}
CDES::~CDES()
{
}
//////////////////////////////////////////////////////////
//函数名: ToIP
//函数功能: 把64位的明文用IP表置换
//输入: BinMinWen[64](明文二进制)
//输出: LR[64](转换后的二进制)
//////////////////////////////////////////////////////////
void CDES::ToIP()
{
char i; //初始置换IP
for (i = 0; i < 64; ++i)
{
LR[i] = BinMinWen[IP[i] - 1];
}
}
/////////////////////////////////////////////////////////
//函数名: ToPC1
//函数功能: 把64位的密钥用PC_1表置换成56位的二进制
//输入: BinKey[64](密钥二进制)
//输出: CD[64](转换后的二进制)
////////////////////////////////////////////////////////
void CDES::ToPC1() //密钥置换
{
char i;
for(i=0;i<56;++i)
{
CD[i]=BinKey[PC_1[i]-1];
}
}
/////////////////////////////////////////////////////////
//函数名: LAndR
//函数功能: 把64位的LR[64]分开成L[32]和R[32]
//输入: LR[64]
//输出: L[32],R[32]
////////////////////////////////////////////////////////
void CDES::LAndR() //分开明文的L和R
{
char i;
for (i = 0; i < 32; ++i)
{
L[i] = LR[i];
R[i] = LR[i + 32];
}
}
/////////////////////////////////////////////////////////
//函数名: ToE
//函数功能: E表置换
//输入: R[32]
//输出: AfterE[48]
////////////////////////////////////////////////////////
void CDES::ToE() //明文选择扩展运算E
{
char i;
for (i = 0; i < 48; ++i)
{
AfterE[i] = R[E[i] - 1];
}
}
/////////////////////////////////////////////////////////
//函数名: LeftCD
//函数功能: CD和前28bit与后28bit要别左移n位
//输入: CD[64],n:左移位数
//输出: CD[64]
////////////////////////////////////////////////////////
void CDES::LeftCD(int n)
{
char i,c,Temp1,Temp2;
for (c = 1; c <= LeftCount[n]; ++c)
{
Temp1 = CD[0];
Temp2 = CD[28];
for (i = 1; i < 28; i++)
{
CD[i - 1] = CD[i];
CD[i + 28 - 1] = CD[i + 28];
}
CD[27] = Temp1;
CD[55] = Temp2;
}
}
/////////////////////////////////////////////////////////
//函数名: ToPC2
//函数功能: 密钥CD置换2
//输入: 左移后的CD
//输出: AfterPC2[48]
////////////////////////////////////////////////////////
void CDES::ToPC2() //密钥置换选择2
{
char i;
for (i = 0; i < 48; ++i)
{
AfterPC2[i] = CD[PC_2[i] - 1];
}
}
/////////////////////////////////////////////////////////
//函数名: XOR1
//函数功能: 第一次异或(见流程图)
//输入: AfterE[48],AfterPC2[48]
//输出: AfterXORq[48]
////////////////////////////////////////////////////////
void CDES::XOR1() // 第1次XOR运算
{
char i;
for (i = 0; i < 48; ++i)
{
AfterXOR1[i] = AfterE[i] ^ AfterPC2[i];
}
}
/////////////////////////////////////////////////////////
//函数名: ToS
//函数功能: S盒代换/选择(见流程图)
//输入: AfterXOR1[48]
//输出: AfterS[32]
////////////////////////////////////////////////////////
void CDES::ToS() //S盒运算
{
char i;
char Temp1,Temp2,Temp3,Temp4;
char Out;
for (i = 0; i < 8; ++i)
{
Temp1 = (i << 2) + (i << 1) + 1;//i * 6 + 1;
Temp2 = (i << 2) + (i << 1) + 6;//i * 6 + 6;
Temp3 = (AfterXOR1[Temp1 - 1] << 1) + AfterXOR1[Temp2 - 1];
Temp4 = (AfterXOR1[Temp1] << 3)
+ (AfterXOR1[Temp1 + 1] << 2)
+ (AfterXOR1[Temp1 + 2] << 1)
+ AfterXOR1[Temp1 + 3];
Out = S[i][Temp3][Temp4];
AfterS[(i << 2) - 1 + 1] = Out >> 3 & 0x01;
AfterS[(i << 2) - 1 + 2] = Out >> 2 & 0x01;
AfterS[(i << 2) - 1 + 3] = Out >> 1 & 0x01;
AfterS[(i << 2) - 1 + 4] = Out & 0x01;
}
}
/////////////////////////////////////////////////////////
//函数名: ToP
//函数功能: P置换(见流程图)
//输入: AfterS[32]
//输出: AfterP[32]
////////////////////////////////////////////////////////
void CDES::ToP() //P置换
{
char i;
for (i = 0; i < 32; ++i)
{
AfterP[i] = AfterS[P[i] - 1];
}
}
/////////////////////////////////////////////////////////
//函数名: AfterXOR2
//函数功能: 第二次异或
//输入: AfterP[32]
//输出: AfterXOR2[32]
////////////////////////////////////////////////////////
void CDES::ToXOR2() //第2次XOR运算
{
char i;
for (i = 0; i < 32; ++i)
{
AfterXOR2[i] = AfterP[i] ^ L[i];
}
}
/////////////////////////////////////////////////////////
//函数名: DES
//函数功能: DES加密
//输入: CD[64],n:左移位数
//输出: CD[64]
//调用函数: ToIP(),ToPC1(),LAndR(), ToE(),LeftCD(i),ToPC2(),XOR1(),ToS(),ToP(),ToXOR2();
//修改时间: 2006.11.23
//修改内容: 增加ToPC1()函数
////////////////////////////////////////////////////////
void CDES::DES16()
{
ToIP();//初始置换
ToPC1();
LAndR();//分开L,R
///开始16轮加密
for (int i = 0; i < 16; i++)
{
ToE();
LeftCD(i);
ToPC2();
XOR1();
ToS();
ToP();
ToXOR2();
for (int i = 0; i < 32; i++)
{
L[i] = R[i];
R[i] = AfterXOR2[i];
}
}//16轮加密结束
//合并L,R
for (i = 0; i < 32; i++)
{
LR[i] = L[i];
LR[i + 32] = R[i];
}
}
/////////////////////////////////////////////////////////
//函数名: EDE
//函数功能: 三重DES加密
//输入: M[64](明文),K1[56],K2[56](密钥)
//输出: char Result[64](密文)
//最新修改时间: 2006.11.23
//修改内容: K1,K2输入为64位,用ToPC1处理为56位
////////////////////////////////////////////////////////
void CDES::EDE(char M[], char K1[], char K2[], char Result[])
{
int i;
//E
for (i = 0; i < 64; i++)
{
BinMinWen[i] = M[i];
BinKey[i] = K1[i];
}
DES16();
//D
for (i = 0; i < 64; i++)
{
BinMinWen[i] = LR[i];
BinKey[i] = K2[i];
}
DES16();
//E
for(i = 0; i < 64; i++)
{
BinMinWen[i] = LR[i];
BinKey[i] = K1[i];
}
DES16();
//得出结果
for (i = 0; i < 64; i++)
{
Result[i] = LR[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -