📄 des1.cpp
字号:
// DES1.cpp : 实现文件
//
#include "stdafx.h"
#include "DES.h"
#include "DES1.h"
void CreateSubKey(bool *Key);
void HexToBit(char *input,bool *output);
void BitToChar(bool *in,char *out,int LengthOfBit);
void BitToHex(bool *input,char *output);
void CharToBit(char *in,bool *out,int LengthOfBit);
void Run(bool *input,bool *output,int FLAG);
// CDES1 对话框
IMPLEMENT_DYNAMIC(CDES1, CDialog)
CDES1::CDES1(CWnd* pParent /*=NULL*/)
: CDialog(CDES1::IDD, pParent)
, key(_T(""))
, input(_T(""))
, m_out(_T(""))
, c_out(_T(""))
{
m_font.CreatePointFont(150,"宋体");
}
CDES1::~CDES1()
{
}
void CDES1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT4, key);
DDV_MaxChars(pDX, key, 16);
DDX_Text(pDX, IDC_EDIT3, input);
DDX_Text(pDX, IDC_EDIT1, m_out);
DDX_Text(pDX, IDC_EDIT2, c_out);
}
BEGIN_MESSAGE_MAP(CDES1, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CDES1::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CDES1::OnBnClickedButton2)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
// CDES1 消息处理程序
void CDES1::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,k;//mlength 明文长度 k不足64bit短块 keylength 密钥长度
int j;
bool FLAG=true;//容错性检测
//获取明文密钥
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 (mlength<8)
{
memcpy(mChar,mTemp,8);
//明文转化为二进制并加密成二进制密文
CharToBit(mChar,mBit,64);
//DES加密
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);
}
SetDlgItemText(IDC_EDIT2,cTemp);
//状态信息显示
if(k==0)
SetDlgItemText(IDC_DES1," 加密成功!!!");
else SetDlgItemText(IDC_DES1,"您输入的字符串中有短块\n请选择短块加密!!!");
}
}
void CDES1::OnBnClickedButton2()
{
char keyHex[17]={0};//十六进制密钥
char cHex[17]={0};//十六进制密文
bool mBit[64];//二进制明文
bool cBit[64];//二进制密文
bool keyBit[64];//二进制密钥
char mTemp[1024]={0};//明文缓冲区
char cTemp[1024]={0};//密文缓冲区
int clength,keylength;//clength 密文长度 keylength 密钥长度
int j;
bool FLAG=true;//容错性检测
//获取密文密钥
GetDlgItemText(IDC_EDIT2,c_out);
GetDlgItemText(IDC_EDIT4,key);
clength=c_out.GetLength();
keylength=key.GetLength();
if ((clength%16!=0)||clength==0)
{
FLAG=false;
AfxMessageBox("密文为空或者长度错误");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (keylength<16)
{
FLAG=false;
AfxMessageBox("密钥长度不足16位,请重新输入");
SetDlgItemText(IDC_DES1," ERROR!!!");
}
if (FLAG==true)
{
memcpy(cTemp,c_out,1024);
memcpy(keyHex,key,16);
//生成子密钥
HexToBit(keyHex,keyBit);
CreateSubKey(keyBit);
for(j=0;j<clength/16;j++)
{
char mChar1[9]={0};//明文字符
memcpy(cHex,cTemp+j*16,16);
//十六进制密文转化为二进制密文并解密成二进制明文
HexToBit(cHex,cBit);
Run(cBit,mBit,0);//DES解密
//将二进制密文转化为明文
BitToChar(mBit,mChar1,64);
strcat_s(mTemp,mChar1);
}
SetDlgItemText(IDC_EDIT1,mTemp);
SetDlgItemText(IDC_DES1," 解密成功!!!");
}
}
HBRUSH CDES1::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));
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -