📄 desuse.cpp
字号:
// DESUse.cpp : implementation file
//
#include "stdafx.h"
#include "DES应用测试.h"
#include "DESUse.h"
#include "DES.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// DESUse dialog
DESUse::DESUse(CWnd* pParent /*=NULL*/)
: CDialog(DESUse::IDD, pParent)
{
//{{AFX_DATA_INIT(DESUse)
m_plainText = _T("");
m_tempKey = _T("");
m_tempResult = _T("");
m_key = _T("");
m_encryResult = _T("");
m_charInput = _T("");
m_charKey = _T("");
m_charOutput = _T("");
m_time = _T("");
//}}AFX_DATA_INIT
stepCount = 0;
}
void DESUse::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(DESUse)
DDX_Control(pDX, IDC_Down, m_downCount);
DDX_Text(pDX, IDC_plainText, m_plainText);
DDV_MaxChars(pDX, m_plainText, 64);
DDX_Text(pDX, IDC_tempKey, m_tempKey);
DDX_Text(pDX, IDC_tempResult, m_tempResult);
DDX_Text(pDX, IDC_key, m_key);
DDV_MaxChars(pDX, m_key, 64);
DDX_Text(pDX, IDC_encryResult, m_encryResult);
DDV_MaxChars(pDX, m_encryResult, 64);
DDX_Text(pDX, IDC_charInput, m_charInput);
DDV_MaxChars(pDX, m_charInput, 8);
DDX_Text(pDX, IDC_charKey, m_charKey);
DDV_MaxChars(pDX, m_charKey, 8);
DDX_Text(pDX, IDC_charOutput, m_charOutput);
DDV_MaxChars(pDX, m_charOutput, 8);
DDX_Text(pDX, IDC_time, m_time);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(DESUse, CDialog)
//{{AFX_MSG_MAP(DESUse)
ON_BN_CLICKED(IDC_BTNstepExcuse, OnBTNstepExcuse)
ON_BN_CLICKED(IDC_DisEncry, OnDisEncry)
ON_BN_CLICKED(IDC_Down, OnDown)
ON_BN_CLICKED(IDC_change, Onchange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// DESUse message handlers
//加密按钮的响应函数
void DESUse::OnOK()
{
UpdateData(true);
m_plainText = StringToBinary(m_charInput);
m_key = StringToBinary(m_charKey);
UpdateData(false);
flag = 'E';
TestDES();
}
/*
*功能:负责读取要加密的原文和密码,构造DES对象,调用DES类的Encry方法进行加解密
*/
void DESUse::TestDES()
{
UpdateData(true);
if(m_plainText.IsEmpty ())
{
MessageBox("请输入要加密的文件","提示",MB_OK|MB_ICONINFORMATION);
return;
}
else if(m_key.IsEmpty())
{
MessageBox("请输入要加密的key","提示",MB_OK|MB_ICONINFORMATION);
return;
}
int plainTextLength = m_plainText.GetLength();
int keyLength = m_key.GetLength();
CString plainTextInput = m_plainText;
CString keyInput = m_key;
char *plainTextArray;
char *keyArray;
char encryResult[64];
plainTextArray = (LPTSTR)(LPCTSTR)plainTextInput;
keyArray = (LPTSTR)(LPCTSTR)keyInput;
DES des = DES(plainTextArray, keyArray,plainTextLength,keyLength);
des.Encry( 16, encryResult,flag);
CString result = "";
for(int i=0; i<64; i++)
{result += encryResult[i];}
m_encryResult = result ;
m_charOutput = BinaryToString(m_encryResult);
UpdateData(false);
}
/*
*功能:实现单步加解密
*/
void DESUse::TestDESStep( bool up)
{
if(up == true)
{
stepCount++;
}
else
{
stepCount--;
}
if(stepCount >16 || stepCount <1)
stepCount =1;
m_time.Format(_T("%d"), stepCount);
UpdateData(false);
UpdateData(true);
if(m_plainText.IsEmpty ())
{
MessageBox("请输入要加密的文件","提示",MB_OK|MB_ICONINFORMATION);
return;
}
else if(m_key.IsEmpty())
{
MessageBox("请输入要加密的key","提示",MB_OK|MB_ICONINFORMATION);
return;
}
int plainTextLength = m_plainText.GetLength();
int keyLength = m_key.GetLength();
char *plainTextArray;
char *keyArray;
char key64[64];
char plainText64[64];
char encryResult[64];
char tempKey[64];
plainTextArray = (LPTSTR)(LPCTSTR)m_plainText;
keyArray = (LPTSTR)(LPCTSTR)m_key;
for(int j=0;j<plainTextLength;j++)
{plainText64[j]= plainTextArray[j];}
for(int k=0;k<keyLength; k++)
{key64[k] =keyArray[k]; }
DES des = DES(plainText64, key64,plainTextLength,keyLength);
des.Encry( stepCount, encryResult,flag);
CString result = "";
for(int i=0; i<64; i++)
{result += encryResult[i];}
m_tempResult = result ;
des.GenerateKey( tempKey, stepCount);
CString stepKey = "";
for(int t=0; t<48; t++)
{stepKey += tempKey[t];}
m_tempKey = stepKey;
UpdateData(false);
}
//单步执行按钮的响应函数
void DESUse::OnBTNstepExcuse()
{
TestDESStep(true);
}
//解密按钮的响应函数
void DESUse::OnDisEncry()
{
flag = 'D';
TestDES();
}
//下一步按钮的响应函数
void DESUse::OnDown()
{
TestDESStep(false);
UpdateData(false);
}
/*
*功能:将输入的字符串转换成01表示的数字串
*/
CString DESUse::StringToBinary(CString input)
{
CString output;
char temp;
for(int i=0; i<input.GetLength(); i++)
{
temp = input.GetAt(i);
output += CharToBinary(temp);
}
return output;
}
//功能:将字符表示成01表示的数字串
CString DESUse::CharToBinary(char input)
{
char a;
CString verseOutput;
CString output;
char temp;
for(int i=0; i<8; i++)
{
a = input;
temp = (a & 1)+48;
verseOutput += temp;
input = input/2;
}
for(int j=7; j>=0; j--)
{
output+= verseOutput.GetAt(j);
}
return output;
}
//将01表示的串每8位做一组,根据ASC||码转换成相应的字符,并合成字符串
CString DESUse::BinaryToString(CString binary)
{
CString result;
for(int i=0; i<8; i++)
{
char currentChar;
char temp1=0;
char temp=0X0;
int j;
for( j=0; j<7; j++)
{
currentChar = binary.GetAt(i*8 + j);
temp1 = currentChar & 1;
temp = temp | temp1;
temp = temp*2;
}
currentChar = binary.GetAt(i*8 + j);
temp1 = currentChar & 1;
temp = temp | temp1;
result += temp;
}
return result;
}
//将密文做输入的响应函数
void DESUse::Onchange()
{
UpdateData(true);
m_charInput = m_charOutput;
m_plainText = m_encryResult;
m_charOutput="";
m_encryResult="";
UpdateData(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -