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

📄 encryptguidlg.cpp

📁 aes和des加密的小程序:可以加密文件
💻 CPP
字号:
// EncryptGUIDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "EncryptGUI.h"
#include "EncryptGUIDlg.h"
#include ".\encryptguidlg.h"

#include "aes.h"
#include "encfile.h"

#include "des.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CEncryptGUIDlg 对话框



CEncryptGUIDlg::CEncryptGUIDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CEncryptGUIDlg::IDD, pParent)
	, m_strPlain(_T(""))
	, m_strKey(_T(""))
	, m_strEncrypt(_T(""))
	, m_strEditFin(_T(""))
	, m_strEditFout(_T(""))
	, m_nAES(0)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CEncryptGUIDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDITPLAIN, m_editPlain);
	DDX_Control(pDX, IDC_EDITKEY, m_editKey);
	DDX_Control(pDX, IDC_EDITCRYPT, m_editCrypt);
	DDX_Text(pDX, IDC_EDITPLAIN, m_strPlain);
	DDX_Text(pDX, IDC_EDITKEY, m_strKey);
	DDX_Text(pDX, IDC_EDITCRYPT, m_strEncrypt);
	DDX_Control(pDX, IDC_BTNDEC, m_btnDec);
	DDX_Control(pDX, IDC_BTNENC, m_btnEnc);
	DDX_Text(pDX, IDC_EDIT_FIN, m_strEditFin);
	DDX_Text(pDX, IDC_EDIT_FOUT, m_strEditFout);
	DDX_Radio(pDX, IDC_RADIO_AES, m_nAES);
}

BEGIN_MESSAGE_MAP(CEncryptGUIDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BTNENC, OnBnClickedBtnenc)
	ON_BN_CLICKED(IDC_BTNDEC, OnBnClickedBtndec)
	ON_EN_CHANGE(IDC_EDITPLAIN, OnEnChangeEditplain)
	ON_EN_CHANGE(IDC_EDITCRYPT, OnEnChangeEditcrypt)
	ON_EN_CHANGE(IDC_EDITKEY, OnEnChangeEditkey)
	ON_BN_CLICKED(IDC_BUTTON_FIN, OnBnClickedButtonFin)
	ON_BN_CLICKED(IDC_BUTTON_FENC, OnBnClickedButtonFenc)
	ON_BN_CLICKED(IDC_BUTTON_FOUT, OnBnClickedButtonFout)
	ON_BN_CLICKED(IDC_BUTTON_FDEC, OnBnClickedButtonFdec)
	ON_BN_CLICKED(IDC_BUTTONOK, OnBnClickedButtonok)
	ON_BN_CLICKED(IDC_BUTTONCANCEL, OnBnClickedButtoncancel)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_RADIO_AES, OnBnClickedRadioAes)
	ON_BN_CLICKED(IDC_RADIO_DES, OnBnClickedRadioDes)
END_MESSAGE_MAP()


// CEncryptGUIDlg 消息处理程序

BOOL CEncryptGUIDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_editCrypt.SetLimitText(32);
	m_editKey.SetLimitText(32);
	m_editPlain.SetLimitText(32);
	
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CEncryptGUIDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CEncryptGUIDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CEncryptGUIDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

int CEncryptGUIDlg::ConvertChar2Hex(unsigned char ch)
{
	if (ch >= '0' && ch <= '9')
		return (ch-'0');
	else if (ch >= 'a' && ch<= 'f')
		return (ch-'a'+10);
	else
		return (ch-'A'+10);
}

void CEncryptGUIDlg::GetHexFromString(const CString& str, unsigned char state[], int size)
{
	int i = str.GetLength();
	if (str.GetLength() > size * 2)
		return;
	memset(state, 0, size);
	for (i = 0; i < str.GetLength(); i++)
		if (i%2) state[i/2] += ConvertChar2Hex(str[i]);
		else state[i/2] = ConvertChar2Hex(str[i]) * 16;
}

CString CEncryptGUIDlg::GetStringFromHex(unsigned char state[], int size)
{
	CString temp;
	int i;
	for (i = 0; i < size; i++)
		temp.AppendFormat("%02x", state[i]);
	return temp;
}

void CEncryptGUIDlg::OnBnClickedBtnenc()
{
	UpdateData(TRUE);
	unsigned char plain[16], key[16], crypt[16];
	GetHexFromString(m_strPlain, plain, sizeof(plain));
	GetHexFromString(m_strKey, key, sizeof(key));


	if (m_nAES == 0) {
		AES_encrypt(plain, crypt, key);
		m_strPlain = GetStringFromHex(plain, sizeof(plain));
		m_strKey = GetStringFromHex(key, sizeof(key));
		m_strEncrypt = GetStringFromHex(crypt, sizeof(crypt));
	}
	else {
		DES_encrypt(plain, crypt, key);
		m_strPlain = GetStringFromHex(plain, sizeof(plain) / 2);
		m_strKey = GetStringFromHex(key, sizeof(key) / 2);
		m_strEncrypt = GetStringFromHex(crypt, sizeof(crypt) / 2);
	}

	UpdateData(FALSE);

	m_btnEnc.EnableWindow(FALSE);
	m_btnDec.EnableWindow(FALSE);
}

void CEncryptGUIDlg::OnBnClickedBtndec()
{
	UpdateData(TRUE);
	unsigned char plain[16], key[16], crypt[16];

	GetHexFromString(m_strEncrypt, crypt, sizeof(crypt));
	GetHexFromString(m_strKey, key, sizeof(key));

	if (m_nAES == 0) {
		AES_decrypt(crypt, plain, key);
		m_strPlain = GetStringFromHex(plain, sizeof(plain));
		m_strKey = GetStringFromHex(key, sizeof(key));
		m_strEncrypt = GetStringFromHex(crypt, sizeof(crypt));
	}
	else {
		DES_decrypt(crypt, plain, key);
		m_strPlain = GetStringFromHex(plain, sizeof(plain) / 2);
		m_strKey = GetStringFromHex(key, sizeof(key) / 2);
		m_strEncrypt = GetStringFromHex(crypt, sizeof(crypt) / 2);
	}

	UpdateData(FALSE);

	m_btnEnc.EnableWindow(FALSE);
	m_btnDec.EnableWindow(FALSE);
}

void CEncryptGUIDlg::OnEnChangeEditplain()
{
	m_btnEnc.EnableWindow(TRUE);
	m_btnDec.EnableWindow(TRUE);
}

void CEncryptGUIDlg::OnEnChangeEditcrypt()
{
	m_btnEnc.EnableWindow(TRUE);
	m_btnDec.EnableWindow(TRUE);
}

void CEncryptGUIDlg::OnOK ()
{
}
void CEncryptGUIDlg::OnCancel()
{
}

void CEncryptGUIDlg::OnEnChangeEditkey()
{
	// TODO:  如果该控件是 RICHEDIT 控件,则它将不会
	// 发送该通知,除非重写 CDialog::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask(),
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码

	m_btnDec.EnableWindow(TRUE);
	m_btnEnc.EnableWindow(TRUE);
}

void CEncryptGUIDlg::OnBnClickedButtonFin()
{
	UpdateData(TRUE);

	CFileDialog dlg(TRUE);
	dlg.DoModal();
	m_strEditFin = dlg.GetPathName();
	UpdateData(FALSE);
}

void CEncryptGUIDlg::OnBnClickedButtonFout()
{
	UpdateData(TRUE);

	CFileDialog dlg(FALSE);
	dlg.DoModal();
	m_strEditFout = dlg.GetPathName();
	UpdateData(FALSE);
}

void CEncryptGUIDlg::OnBnClickedButtonFenc()
{
	UpdateData(TRUE);
	unsigned char key[16];	
	GetHexFromString(m_strKey, key, sizeof(key));

	if (m_strEditFin == "") {
		MessageBox("输入文件为空");
		return;
	}
	if (m_strEditFout == "") {
		MessageBox("输出文件为空");
		return;
	}
	if (m_strKey == "")
		if (MessageBox("密钥为空,继续?", 0, MB_YESNO) == IDNO)
			return;

	m_strKey = GetStringFromHex(key, sizeof(key));
	UpdateData(FALSE);

	if (!AES_file_encrypt(m_strEditFin, m_strEditFout, key))
		MessageBox("加密成功!");
	else
		MessageBox("加密失败!");
}

void CEncryptGUIDlg::OnBnClickedButtonFdec()
{
	UpdateData(TRUE);
	unsigned char key[16];	
	GetHexFromString(m_strKey, key, sizeof(key));

	if (m_strEditFin == "") {
		MessageBox("输入文件为空");
		return;
	}
	if (m_strEditFout == "") {
		MessageBox("输出文件为空");
		return;
	}
	if (m_strKey == "")
		if (MessageBox("密钥为空,继续?", 0, MB_YESNO) == IDNO)
			return;

	m_strKey = GetStringFromHex(key, sizeof(key));
	UpdateData(FALSE);

	if (!AES_file_decrypt(m_strEditFin, m_strEditFout, key))
		MessageBox("解密成功!");
	else
		MessageBox("解密失败!");
}

void CEncryptGUIDlg::OnBnClickedButtonok()
{
	CDialog::OnOK();
}

void CEncryptGUIDlg::OnBnClickedButtoncancel()
{
	CDialog::OnCancel();
}

void CEncryptGUIDlg::OnClose()
{
	CDialog::OnClose();
	CDialog::OnOK();
}

void CEncryptGUIDlg::OnBnClickedRadioAes()
{
	m_editCrypt.SetLimitText(32);
	m_editKey.SetLimitText(32);
	m_editPlain.SetLimitText(32);

	m_btnDec.EnableWindow(TRUE);
	m_btnEnc.EnableWindow(TRUE);
}

void CEncryptGUIDlg::OnBnClickedRadioDes()
{
	m_editCrypt.SetLimitText(16);
	m_editKey.SetLimitText(16);
	m_editPlain.SetLimitText(16);

	m_btnDec.EnableWindow(TRUE);
	m_btnEnc.EnableWindow(TRUE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -