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

📄 desdemo.cpp

📁 DES对称密钥加密算法,基于最基本的电码本模式.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "resource.h"
#include <stdio.h>
#include <windowsx.h>
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
#include <Shlobj.h>
#include "DES.h"
#pragma comment(lib,"comctl32.lib")
#define WM_WRITETEXT WM_USER+100
#define WM_PARENTMOVED WM_USER+101
FILE *fPlainFile,*fCipherFile,*fDecryptedFile;
TCHAR pszPlainText[128];//明文缓冲,未初始化,在.bss段中
PTSTR pszTitle=(PTSTR)HeapAlloc(GetProcessHeap(),0,128);//窗口标题,位于堆中
PTSTR pszFullName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//文件名
PTSTR pszCipherName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//密文文件名
PTSTR pszRecoveredName=(PTSTR)HeapAlloc(GetProcessHeap(),0,MAX_PATH);//恢复明文文件名
char pszPathName[MAX_PATH];//恢复明文文件名
BOOL bSaved;//保存状态
BOOL bEdited;//编辑状态
PTSTR pszExtend="txt";//保存文件的默认扩展名
HMENU  hMenu;//窗口菜单句柄
MENUITEMINFO mii;//菜单项结构
HWND hStatusBar;//主窗口状态栏
HWND hCipherStatusBar;
HWND hDecryptedStatusBar;
HWND hCipherDlg;//密文显示对话框
HWND hDecryptedDlg;//解密对话框
HWND hParent;//父窗口
HWND hAbout;
RECT rect;//窗口矩形
int cx,cy;//窗口位置
bool bCipherShow=false;//密文窗口显示状态
bool bDecryptedShow=false;
bool bSource=false;//密文源设置.false:文件,true:文本输入
void OnAbout_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
	switch(id)
	{
	case IDCANCEL:
		EndDialog(hWnd,id);
		break;
	}
}
BOOL OnAbout_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	RECT rect1;
	GetWindowRect(GetParent(hWnd),&rect);
	GetWindowRect(hWnd,&rect1);
	SetWindowPos(hWnd,NULL,rect.left+(rect.right-rect.left-rect1.right+rect1.left)/2,rect.top+(rect.bottom-rect.top-rect1.bottom+rect1.top)/2,0,0,SWP_NOSIZE);
	return false;
}
INT_PTR WINAPI About_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{//消息处理分支
	case WM_COMMAND://处理命令消息
		OnAbout_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
		break;
	case WM_INITDIALOG://处理对话框初始化消息
		OnAbout_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
		break;
	}
	return 0;
}

void OnKey_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
	switch(id)
	{
	case IDCANCEL:
		EndDialog(hWnd,id);
		break;
	case IDOK:
		char key[16];		
		GetDlgItemText(hWnd,IDC_KEY,key,16);
		if(strlen(key)>8)
		{
			MessageBox(hWnd,"Too long key,you should input 8 bytes!","Key error",MB_OK);
			HWND hEdit=GetDlgItem(hWnd,IDC_KEY);
			SetFocus(hEdit);
			SendMessage(hEdit,EM_SETSEL,0,-1);
		}
		else
		{
			memcpy(uKey,key,8);
        	GenerateSubkey(uKey,uSubkeys);//生成子密钥表
        	AntiSubkey(uSubkeys,uAntiSubkeys);//生成逆子密钥表
			SendMessage(GetParent(hWnd),WM_PAINT,0,0);
			//MessageBox(hWnd,(PTSTR)uKey,"here",MB_OK);
		    EndDialog(hWnd,id);
		}
		break;
	}
}
BOOL OnKey_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	char key[9];
	memcpy(key,uKey,8);
	key[8]='\0';
	SetWindowText(GetDlgItem(hWnd,IDC_KEY),(LPSTR)key);
	return false;
}

INT_PTR WINAPI Key_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{//消息处理分支
	case WM_COMMAND://处理命令消息
		OnKey_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
		break;
	case WM_INITDIALOG://处理对话框初始化消息
		OnKey_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
		break;
	case WM_PAINT:
		HDC hdc=GetDC(hWnd);
		SetBkMode(hdc,TRANSPARENT);
        TextOut(hdc,12,-2,"Set key:",8);
		break;
	}
	return 0;
}
void OnDecrypted_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
	switch(id)
	{
	case IDCANCEL:
		bDecryptedShow=false;
		EndDialog(hWnd,id);
		break;
	}
}
BOOL OnDecrypted_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	hDecryptedStatusBar=CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_BORDER,"解密明文:",hWnd,0);
	SendMessage(hDecryptedStatusBar,SB_SETMINHEIGHT,25,0);
	return false;
}
INT_PTR WINAPI Decrypted_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{//窗口处理函数
	switch(uMsg)
	{//消息处理分支
	case WM_COMMAND://处理命令消息
		OnDecrypted_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_DECRYPTED),HIWORD(wParam));
		break;
	case WM_INITDIALOG://处理对话框初始化消息
		OnDecrypted_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
		break;
	case WM_PARENTMOVED:
		RECT rect1;	
		hParent=GetParent(hWnd);
		GetWindowRect(hParent,&rect);
		GetWindowRect(hWnd,&rect1);
		if(bCipherShow==true)
			SetWindowPos(hWnd,NULL,rect.right,rect.top+rect1.bottom-rect1.top,0,0,SWP_NOSIZE);
		else
    		SetWindowPos(hWnd,NULL,rect.right,rect.top,0,0,SWP_NOSIZE);
		break;
	case WM_WRITETEXT:

		HWND hDecrypted=GetDlgItem(hWnd,IDC_DECRYPTED);
		SetWindowText(hDecrypted,"");
		fDecryptedFile=fopen((PTSTR)lParam,"rb");
		while(!feof(fDecryptedFile))
		{
			fgets(pszPlainText,128,fDecryptedFile);//读一行

			SendMessage(hDecrypted,EM_SETSEL, -1,-1);//选择文本框末尾
			SendMessage(hDecrypted,EM_REPLACESEL,0, (LPARAM)pszPlainText);//用读到的一行字符串替换末尾的空字符
			memset(pszPlainText,0,128);	//清缓冲							
		}
		char szStatusText[MAX_PATH]="解密明文:";
		strcat(szStatusText,(PTSTR)lParam);
		SendMessage(hDecryptedStatusBar,SB_SETTEXT,0,(LPARAM)(LPSTR)szStatusText);
		fclose(fDecryptedFile);
		break;

	}
	return 0;
}
void OnCipher_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
	switch(id)
	{
	case IDCANCEL:
		bCipherShow=false;
		if(IsWindow(hDecryptedDlg))
			SendMessage(hDecryptedDlg,WM_PARENTMOVED,(WPARAM)GetParent(hWnd),0);
		EndDialog(hWnd,id);
		break;
	}
}
BOOL OnCipher_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	hCipherStatusBar=CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_BORDER,"密文:",hWnd,0);
	SendMessage(hCipherStatusBar,SB_SETMINHEIGHT,25,0);
	return false;
}
INT_PTR WINAPI CipherDlg_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{//窗口处理函数
	switch(uMsg)
	{//消息处理分支
	case WM_COMMAND://处理命令消息
		OnCipher_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),HIWORD(wParam));
		break;
	case WM_INITDIALOG://处理对话框初始化消息
		OnCipher_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
		break;
	case WM_PARENTMOVED:
		hParent=(HWND)wParam;
		rect;
		GetWindowRect(hParent,&rect);
		SetWindowPos(hWnd,NULL,rect.right,rect.top,0,0,SWP_NOSIZE);
		break;
	case WM_WRITETEXT:
		HWND hCipherEdit=GetDlgItem(hWnd,IDC_CIPHERTEXT);
		SetWindowText(hCipherEdit,"");
		fCipherFile=fopen((PTSTR)lParam,"rb");
		while(!feof(fCipherFile))
		{
			fgets(pszPlainText,128,fCipherFile);//读一行
			SendMessage(hCipherEdit,EM_SETSEL, -1,-1);//选择文本框末尾
			SendMessage(hCipherEdit,EM_REPLACESEL,0, (LPARAM)pszPlainText);//用读到的一行字符串替换末尾的空字符
			memset(pszPlainText,0,128);	//清缓冲							
		}
		char szStatusText[MAX_PATH]="密文:";
		strcat(szStatusText,(PTSTR)lParam);
		SendMessage(hCipherStatusBar,SB_SETTEXT,0,(LPARAM)(LPSTR)szStatusText);
		fclose(fCipherFile);
		break;
	}
	return 0;
}

void On_Command(HWND hWnd,int id,LPARAM lParam,UINT nCodeNotify)
{
	HWND hEdit=(HWND)GetDlgItem(hWnd,IDC_PLAINTEXT);//得到窗口文本框的句柄
	switch(id)
	{
	case IDC_PLAINTEXT://EN_CHANGE通知消息,当某编辑框文本被改变时候发送,其父窗口将收到
		if(nCodeNotify==EN_CHANGE)//WM_COMMAND消息,WPARAM高字为EN_CHANGE通知消息,低字为
			bEdited=true; //控件ID,LPARAM参数为编辑框的句柄
		break;
	case IDCANCEL:	
		if(bSaved==FALSE && bEdited==TRUE)
		{//如果被保存过并且未保存则询问是否要保存
			if((MessageBox(hWnd,"File hasn't been saved,save it? (Y/N)","Query",MB_OKCANCEL))==IDOK)
			{
				SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDF_SAVE_AS,nCodeNotify),lParam);
			}
		}
		EndDialog(hWnd,id);
		break;
	case IDF_EXIT:
		SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDCANCEL,nCodeNotify),lParam);
		break;		
	case IDF_NEW:
		EnableWindow(hEdit,true);
		pszTitle="Untitled";
		SetWindowText(hWnd,pszTitle);
		SetDlgItemText(hWnd,IDC_PLAINTEXT,"");
		break;
	case IDF_CLOSE:
		EnableWindow(hEdit,false);
		SetDlgItemText(hWnd,IDC_PLAINTEXT,"");
		pszTitle="DES Demo";
		SetWindowText(hWnd,pszTitle);
		break;
	case IDF_OPEN:
		if(bSource==true)
		{
			MessageBox(hWnd,"The source has been selected to input,please set in set menu","Error",MB_OK);
			break;
		}
		hMenu=GetMenu(hWnd);//得到窗口
    	mii.cbSize=sizeof(mii);
		GetMenuItemInfo(hMenu,false,IDD_DECRYPT,&mii);
		mii.fMask=MIIM_STATE;
		mii.fState=MFS_DISABLED;
		SetMenuItemInfo(hMenu,IDD_DECRYPT,false,&mii);//设置解密菜单项变灰
		if(IsWindow(hCipherDlg))
		{
			ShowWindow(hCipherDlg,0);
			hCipherDlg=NULL;
		}
		if(IsWindow(hDecryptedDlg))
		{
			ShowWindow(hDecryptedDlg,0);
			hDecryptedDlg=NULL;
		}
		EnableWindow(hEdit,true);
		OPENFILENAME ofn; //文件打开对话框结构
		char pszFileName[256];//文件名缓冲
		memset(&ofn,0,sizeof(ofn));//为结构开辟空间
		ofn.lStructSize=sizeof(ofn);//设置结构大小成员
		ofn.hwndOwner=hWnd;//设置文件打开对话框的父窗口
		ofn.lpstrFilter="Text files\0*.txt\0All files\0*.*\0";//设置过滤字符串,每两个字符串一组,
	                                                //以NULL作为间隔,最后的字符串后有两个NULL
		ofn.lpstrFile=pszFileName;//设置文件名缓冲

⌨️ 快捷键说明

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