⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desuse.cpp

📁 该文本对DES设计做了详细介绍
💻 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 + -