📄 des2.cpp
字号:
// DES2.cpp : 实现文件
//
#include "stdafx.h"
#include "DES.h"
#include "DES2.h"
#include "DES_MAIN.h"
// CDES2 对话框
IMPLEMENT_DYNAMIC(CDES2, CDialog)
CDES2::CDES2(CWnd* pParent /*=NULL*/)
: CDialog(CDES2::IDD, pParent)
, input(_T(""))
, key(_T(""))
, m_out(_T(""))
, c_out(_T(""))
{
m_font.CreatePointFont(150,"宋体");
}
CDES2::~CDES2()
{
}
void CDES2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT3, input);
DDX_Text(pDX, IDC_EDIT4, key);
DDV_MaxChars(pDX, key, 16);
DDX_Text(pDX, IDC_EDIT1, m_out);
DDX_Text(pDX, IDC_EDIT2, c_out);
}
BEGIN_MESSAGE_MAP(CDES2, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CDES2::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CDES2::OnBnClickedButton2)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CDES2 消息处理程序
void CDES2::OnBnClickedButton1()
{
char keyHex[17]={0};//十六进制密钥
char cHex[17]={0};//十六进制密文
bool mBit[64];//二进制明文
bool cBit[64];//二进制密文
bool keyBit[64];//二进制密钥
char mChar[9]={0};//明文字符
char mTemp[1024]={0};//明文缓冲区
char cTemp[1024]={0};//密文缓冲区
int mlength,keylength,clength;//mlength 明文长度 keylength 密钥长度
int j,k;
bool FLAG=true;//容错性检测
char mlengthbuff[1024]={0};
char clengthbuff[1024]={0};
bool mBitend[64]={0};
char mCharend[9]={0};
GetDlgItemText(IDC_EDIT3,input);
GetDlgItemText(IDC_EDIT4,key);
memcpy(mTemp,input,1024);
mlength=input.GetLength();
keylength=key.GetLength();
k=mlength%8;
if (mlength==0)
{
FLAG=false;
AfxMessageBox("明文不能为空");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (keylength<16)
{
FLAG=false;
AfxMessageBox("密钥长度不足16位,请重新输入");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (FLAG==true)
{
//生成子密钥
memcpy(keyHex,key,16);
HexToBit(keyHex,keyBit);
CreateSubKey(keyBit);
if (weakkey(SubKey)==FALSE)
{
AfxMessageBox("您输的是弱密钥,请重新输入");
}
if (weakkey(SubKey)==TRUE)
{
if (mlength<8)
{
memcpy(mChar,mTemp,8);
//明文转化为二进制并加密成二进制密文
CharToBit(mChar,mBit,64);
Run(mBit,cBit,1);
//将二进制密文转化为十六进制密文
BitToHex(cBit,cHex);
strcat_s(cTemp,cHex);
SetDlgItemText(IDC_EDIT2,cTemp);
}
for(j=0;j<mlength/8;j++)
{
memcpy(mChar,mTemp+j*8,8);
//明文转化为二进制并加密成二进制密文
CharToBit(mChar,mBit,64);
Run(mBit,cBit,1);
//将二进制密文转化为十六进制密文
BitToHex(cBit,cHex);
strcat_s(cTemp,cHex);
//短块处理
if (j==(mlength/8-1)&&(k!=0))
{
//取出一部分上一块的密文
memcpy(mBitend,cBit+k*8,(8-k)*8);
//取出最后一块短块
memcpy(mCharend,mTemp+(j+1)*8,k);
//明文转化为二进制并加密成二进制密文
CharToBit(mCharend,mBit,k*8);
//连接成64bit二进制作为明文
memcpy(mBitend+(8-k)*8,mBit,k*8);
Run(mBitend,cBit,1);
//将二进制密文转化为十六进制密文
BitToHex(cBit,cHex);
//覆盖前面的一部分密文
memcpy(cTemp+j*16+k*2,cHex,16);
cTemp[j*16+k*2+16]='\0';
}
}
SetDlgItemText(IDC_EDIT2,cTemp);
if(k==0)
SetDlgItemText(IDC_DES1," 加密成功!!!");
else SetDlgItemText(IDC_DES1,"您输入的字符串中有短块\n短块加密成功!!!");
_itoa_s(mlength,mlengthbuff,10);
SetDlgItemText(IDC_MLENGTH,mlengthbuff);
if (mlength<8)
{clength=16;}
else clength=(j-1)*16+k*2+16;
_itoa_s(clength,clengthbuff,10);
SetDlgItemText(IDC_CLENGTH,clengthbuff);
}
}
}
void CDES2::OnBnClickedButton2()
{
char keyHex[17]={0};//十六进制密钥
char cHex[17]={0};//十六进制密文
bool mBit[64];//二进制明文
bool cBit[64];//二进制密文
bool keyBit[64];//二进制密钥
char mChar[9]={0};//明文字符
char mTemp[1024]={0};//明文缓冲区
char cTemp[1024]={0};//密文缓冲区
int mlength,keylength,clength;//mlength 明文长度 keylength 密钥长度
bool FLAG=true;//容错性检测
char mlengthbuff[1024]={0};
char clengthbuff[1024]={0};
int i,j,k;
GetDlgItemText(IDC_EDIT2,c_out);
GetDlgItemText(IDC_EDIT4,key);
memcpy(cTemp,c_out,1024);
keylength=key.GetLength();
clength=c_out.GetLength();
k=clength%16;
if (clength==0)
{
FLAG=false;
AfxMessageBox("密文为空");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (keylength<16)
{
FLAG=false;
AfxMessageBox("密钥长度不足16位,请重新输入");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (FLAG==true)
{
//生成子密钥
memcpy(keyHex,key,16);
HexToBit(keyHex,keyBit);
CreateSubKey(keyBit);
for(j=0;j<clength/16;j++)
{
char mChar1[9]={0};
char mChar2[9]={0};
char mChartemp[9]={0};
char cHextemp[19]={0};
//char cHex7[19]={0};
char mChar8[9]={0};
//短块解密
if(j==(clength/16)-1&&(k!=0))
{
//解密最后64bit
memcpy(cHex,cTemp+k+j*16,16);
//十六进制密文转化为二进制密文并解密成二进制明文
HexToBit(cHex,cBit);
Run(cBit,mBit,0);
//将二进制密文转化为明文
BitToHex(mBit,cHextemp);
//取出短块的明文
BitToChar(mBit,mChar1,64);
memcpy(mChartemp,mChar1+(16-k)/2,k/2);
//解密出来的密文与前面的密文连接组成64bit
memcpy(cHex,cTemp+j*16,k);
memcpy(cHex+k,cHextemp,16-k);
HexToBit(cHex,cBit);
Run(cBit,mBit,0);
//将二进制密文转化为明文
BitToChar(mBit,mChar2,64);
strcat_s(mTemp,mChar2);
strcat_s(mTemp,mChartemp);
}
else{
memcpy(cHex,cTemp+j*16,16);
//十六进制密文转化为二进制密文并解密成二进制明文
HexToBit(cHex,cBit);
Run(cBit,mBit,0);
//将二进制密文转化为明文
BitToChar(mBit,mChar8,64);
strcat_s(mTemp,mChar8);
}
}
SetDlgItemText(IDC_EDIT1,mTemp);
SetDlgItemText(IDC_DES1," 解密成功!!!");
for (i=0;;i++)
{
if (mTemp[i]=='\0')
break;
}
mlength=i;
_itoa_s(mlength,mlengthbuff,10);
SetDlgItemText(IDC_MLENGTH,mlengthbuff);
_itoa_s(clength,clengthbuff,10);
SetDlgItemText(IDC_CLENGTH,clengthbuff);
}
}
HBRUSH CDES2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
if (pWnd->GetDlgCtrlID()==IDC_DES1)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(RGB(0,197,205));
}
if (pWnd->GetDlgCtrlID()==IDC_CLENGTH)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(RGB(255,0,0));
}
if (pWnd->GetDlgCtrlID()==IDC_MLENGTH)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(RGB(255,0,0));
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -