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

📄 desdemo.cpp

📁 DES对称密钥加密算法,基于最基本的电码本模式.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		ofn.lpstrFile[0]='\0';//文件名缓冲第一个字节必须为NULL
		ofn.nMaxFile=sizeof(pszFileName);//文件名缓冲的最大长度
		ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;//文件名和路径必须存在
		if(GetOpenFileName(&ofn))
		{//打开文件时获得文件名
			fPlainFile=fopen(ofn.lpstrFile,"rb");//根据文件名以二进制格式打开指定文件
			memcpy(pszFullName,ofn.lpstrFile,256);//保存文件名
			SetWindowText(hEdit,"");//先清空
			if(fPlainFile==NULL)
			{
				MessageBox(hWnd,"File open erro!","error",MB_OK);
				return;
			}
			while(!feof(fPlainFile))
			{
				fgets(pszPlainText,128,fPlainFile);//读一行
				SendMessage(hEdit,EM_SETSEL, -1,-1);//选择文本框末尾
				SendMessage(hEdit,EM_REPLACESEL,0, (LPARAM)pszPlainText);//用读到的一行字符串替换末尾的空字符
				memset(pszPlainText,0,128);	//清缓冲							
			}
			fclose(fPlainFile);//关闭流
			pszTitle=ofn.lpstrFile+ofn.nFileOffset;//获得去掉路径的文件名
			SetWindowText(hWnd,pszTitle);//设置窗口标题
			char szStatusText[MAX_PATH]="明文:";
			strcat(szStatusText,pszFullName);
			SendMessage(hStatusBar,SB_SETTEXT,0,(LPARAM)(LPSTR)szStatusText);
		}
		bEdited=false;
		break;
	case IDF_SAVE:
		GetWindowText(hWnd,pszTitle,128);
		if(strcmp(pszTitle,"Untitled")==0)
		{//如果未保存过,使用另存为的代码
			SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDF_SAVE_AS,nCodeNotify),lParam);
		}
		else if(strcmp(pszTitle,"DES Demo")!=0)
		{//如果已经保存过
			fPlainFile=fopen(pszFullName,"w+");//pszFullName存放保存过的文件名
			long nLineCount=SendMessage(hEdit,EM_GETLINECOUNT,0,0);//获得文本框行数
			for(int i=0;i<nLineCount;i++)
			{
				ZeroMemory(pszPlainText,128);
				pszPlainText[0]=(char)128;//发送消息前第一个字存放缓冲的大小
				SendMessage(hEdit,EM_GETLINE,(WPARAM)i,(LPARAM)pszPlainText);
				if(pszPlainText[0]!=0xffffff80)//假如读到了有效信息,就写入文件
				    fputs(pszPlainText,fPlainFile);
				fputc('\n',fPlainFile);
			}
			bSaved=true;
			bEdited=false;
			fclose(fPlainFile);
		}
		break;

	case IDF_SAVE_AS:
		OPENFILENAME ofn1;
		//char pszFileName[256];
		memset(&ofn1,0,sizeof(ofn));
		ofn1.lStructSize=sizeof(ofn);
		ofn1.hwndOwner=hWnd;
		ofn1.lpstrFilter="Text files\0*.txt\0All files\0*.*\0";
		ofn1.lpstrFile=pszFileName;
		ofn1.lpstrFile[0]='\0';
		ofn1.nMaxFile=sizeof(pszFileName);
		ofn1.Flags =OFN_OVERWRITEPROMPT |OFN_PATHMUSTEXIST;//检查路径并询问重名文件情况
		ofn1.lpstrDefExt=pszExtend;
		if(GetSaveFileName(&ofn1))
		{
			fPlainFile=fopen(ofn1.lpstrFile,"w+");//以文本模式读写方式打开文件
			memcpy(pszFullName,ofn1.lpstrFile,256);//保存文件名
			long nLineCount=SendMessage(hEdit,EM_GETLINECOUNT,0,0);//获得文本框行数
			for(int i=0;i<nLineCount;i++)
			{
				ZeroMemory(pszPlainText,128);//清0
				pszPlainText[0]=(char)128;//发送消息前第一个字存放缓冲的大小
				SendMessage(hEdit,EM_GETLINE,(WPARAM)i,(LPARAM)pszPlainText);//获得文本框一行文本
				if(pszPlainText[0]!=0xffffff80)//假如读到了有效信息,就写入文件
				    fputs(pszPlainText,fPlainFile);
				fputc('\n',fPlainFile);//写一个回车
			}
			fclose(fPlainFile);
	    	pszTitle=ofn1.lpstrFile+ofn1.nFileOffset;//获得去掉路径的文件名
		    SetWindowText(hWnd,pszTitle);//设置窗口标题
			bSaved=true;
			bEdited=false;
		}
		break;	
	case IDD_ENCRYPT:

		if(bSource==true)
		{//如果是加密文本框的内容
			memset(pszFullName,0,MAX_PATH);//文件名清0
			strcpy(pszFullName,pszPathName);//复制工作路径名
			strcat(pszFullName,"\\temp.txt");//用temp.txt做缓冲文件
			fPlainFile=fopen(pszFullName,"w+");//以读写方式打开temp.txt文件
			long nLineCount=SendMessage(hEdit,EM_GETLINECOUNT,0,0);//获得文本框行数
			for(int i=0;i<nLineCount;i++)
			{
				ZeroMemory(pszPlainText,128);//清0
				pszPlainText[0]=(char)128;//发送消息前第一个字存放缓冲的大小
				SendMessage(hEdit,EM_GETLINE,(WPARAM)i,(LPARAM)pszPlainText);//获得文本框一行文本
				if(pszPlainText[0]!=0xffffff80)//假如读到了有效信息,就写入文件
				    fputs(pszPlainText,fPlainFile);
				fputc('\n',fPlainFile);//写一个回车
			}
			fclose(fPlainFile);//关闭文件
		}		
//MessageBox(hWnd,pszFullName,"her",MB_OK);
		if(strstr(pszFullName,"txt")!=NULL)		
		{	//如果文件名字符串包含了"txt"说明明文已经载入文件
			memcpy(pszCipherName,pszPathName,strlen(pszPathName)+1);//复制路径名到密文文件名       
			strcat(pszCipherName,"\\ciphertext.txt");//添加加密输出文件名得到完整输出文件名
			DES_EncryptFile(pszFullName,pszCipherName,uSubkeys);//加密文件
			GetMenuItemInfo(hMenu,IDD_DECRYPT,FALSE,&mii);//以下几行使能解密菜单项
			mii.fMask=MIIM_STATE;//屏蔽位为状态位
			mii.fState=MFS_ENABLED;//设置状态为使能
			SetMenuItemInfo(hMenu,IDD_DECRYPT,FALSE,&mii);	//设置生效
    		GetWindowRect(hWnd,&rect);//获得窗口矩形
			SetWindowPos(hWnd,NULL,0,rect.top,0,0,SWP_NOSIZE);	//将窗口移动到最左边
			if(!bCipherShow)
			{//如果密文输出窗口未显示则创建一个无模式对话框
				hCipherDlg=CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDD_CIPHER),hWnd,CipherDlg_Proc);
				ShowWindow(hCipherDlg,1);//显示
				bCipherShow=true;//显示标志置真
				PostMessage(hCipherDlg,WM_WRITETEXT,(WPARAM)hWnd,(LPARAM)pszCipherName);//发送消息让密文窗口显示密文
			}
			else
				ShowWindow(hCipherDlg,1);
			PostMessage(hCipherDlg,WM_WRITETEXT,(WPARAM)hWnd,(LPARAM)pszCipherName);//发送消息让密文窗口显示密文
			SendMessage(hCipherDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);//向密文窗口发送主窗口移动消息让其改变位置
			if(IsWindow(hDecryptedDlg))//如果解密文窗口已经创建则发送主窗口移动消息
				SendMessage(hDecryptedDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);
		}	
		break;
	case IDD_DECRYPT:
		if(strstr(pszCipherName,"txt")!=NULL)
		{//如果密文文件名中有txt字符串说明密文已经载入文件
			memcpy(pszRecoveredName,pszPathName,strlen(pszPathName)+1);//
			strcat(pszRecoveredName,"\\decrypted.txt");
			DES_DecryptFile(pszCipherName,pszRecoveredName,uSubkeys);
			GetWindowRect(hWnd,&rect);
			if(bCipherShow)
				SetWindowPos(hWnd,NULL,0,0,0,0,SWP_NOSIZE);
			else
				SetWindowPos(hWnd,NULL,0,rect.top,0,0,SWP_NOSIZE);
			if(bDecryptedShow==false)
			{
				hDecryptedDlg=CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
					MAKEINTRESOURCE(IDD_DECRYPTED),hWnd,Decrypted_Proc);
				ShowWindow(hDecryptedDlg,1);
				bDecryptedShow=true;
			}
			else
				ShowWindow(hDecryptedDlg,1);	
			PostMessage(hDecryptedDlg,WM_WRITETEXT,(WPARAM)hWnd,(LPARAM)pszRecoveredName);
			SendMessage(hDecryptedDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);
			if(bCipherShow)
			{				
	    		SendMessage(hCipherDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);
			}	
		}
		break;
	case IDS_FILE:
		MENUITEMINFO mii;
		mii.cbSize=sizeof(mii);
		GetMenuItemInfo(GetMenu(hWnd),IDS_FILE,false,&mii);
		mii.fMask=MIIM_STATE;
		mii.fState=MFS_CHECKED;
		SetMenuItemInfo(GetMenu(hWnd),IDS_FILE,false,&mii);		
		GetMenuItemInfo(GetMenu(hWnd),IDS_INPUT,false,&mii);
		mii.fMask=MIIM_STATE;
		mii.fState=MFS_UNCHECKED;
		SetMenuItemInfo(GetMenu(hWnd),IDS_INPUT,false,&mii);
		bSource=false;
		memcpy(pszPlainText,"明文:",128);
		SendMessage(hStatusBar,SB_SETTEXT,0,(LPARAM)pszPlainText);
		memset(pszPlainText,0,128);
		break;
	case IDS_INPUT:
		MENUITEMINFO mii1;
		mii1.cbSize=sizeof(mii);
		GetMenuItemInfo(GetMenu(hWnd),IDS_INPUT,false,&mii1);
		mii1.fMask=MIIM_STATE;
		mii1.fState=MFS_CHECKED;
		SetMenuItemInfo(GetMenu(hWnd),IDS_INPUT,false,&mii1);		
		GetMenuItemInfo(GetMenu(hWnd),IDS_FILE,false,&mii1);
		mii1.fMask=MIIM_STATE;
		mii1.fState=MFS_UNCHECKED;
		SetMenuItemInfo(GetMenu(hWnd),IDS_FILE,false,&mii1);
		bSource=true;
		memcpy(pszPlainText,"明文:文本框输入",128);
		SendMessage(hStatusBar,SB_SETTEXT,0,(LPARAM)pszPlainText);
		memset(pszPlainText,0,128);
		break;
	case IDS_KEY:
		DialogBox((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),
			MAKEINTRESOURCE(IDD_KEY),hWnd,Key_Proc);
		break;
    case IDA_ME:
	   hAbout=CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDD_ME),hWnd,About_Proc);
	   ShowWindow(hAbout,1);
	   break;
	case IDS_WORKPATH:
		BROWSEINFO bi;	//使用文件夹浏览器对话框
		memset(&bi,0,sizeof(bi));//为结构分配空间
		bi.hwndOwner=hWnd;//父窗口
		bi.pidlRoot=NULL;//根目录
		bi.pszDisplayName=pszPathName;//缓冲地址
		bi.lpszTitle="Work Path";//对话框显示的文字
		bi.ulFlags=0;
		LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//打开文件夹对话框
		if(pIDList)
		{//如果按下OK
			memset(pszPathName,0,MAX_PATH);
			SHGetPathFromIDList(pIDList, pszPathName);//获得目录名
		}
		LPMALLOC lpMalloc;//释放资源
		if(FAILED(SHGetMalloc(&lpMalloc))) 
			return;
       lpMalloc->Free(pIDList);
       lpMalloc->Release();
	   break;

	}
}

BOOL On_InitDialog(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
	int nScreenWidth=GetSystemMetrics(SM_CXSCREEN);//获得屏幕宽度
	int nScreenHeight=GetSystemMetrics(SM_CYSCREEN);//获得屏幕高度
	RECT rect;
	GetClientRect(hWnd,&rect);//获得客户区矩形
	int nClientWidth=rect.right-rect.left;//获得客户区宽度
	int nClientHeight=rect.bottom-rect.top;//获得客户区高度
	cx=(nScreenWidth-nClientWidth)/2;//设置对话框x坐标
	cy=(nScreenHeight-nClientHeight)/2;//设置对话框y坐标
	SetWindowPos(hWnd,NULL,cx,cy,0,0,SWP_NOSIZE);//设置窗口坐标和大小
	SendMessage(hWnd,WM_SETICON,(WPARAM)ICON_BIG,(LPARAM)LoadIcon((HINSTANCE)GetWindowLong(hWnd,
		GWLP_HINSTANCE),MAKEINTRESOURCE(IDI_ICON)));//设置窗口大图标
	SendMessage(hWnd,WM_SETICON,(WPARAM)ICON_SMALL,(LPARAM)LoadIcon((HINSTANCE)GetWindowLong(hWnd,
		GWLP_HINSTANCE),MAKEINTRESOURCE(IDI_ICON)));//设置窗口小图标
	pszTitle="Untitled";//设置窗口标题
	SetWindowText(hWnd,pszTitle);
	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);//设置解密菜单项变灰
	hStatusBar=CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_BORDER,"明文:",hWnd,0);
	SendMessage(hStatusBar,SB_SETMINHEIGHT,25,0);
	//MessageBox(hWnd,(PTSTR)uKey,"DD",MB_OK);


	for(int i=0;i<8;i++)
		uKey[i]=i+49;
	GenerateSubkey(uKey,uSubkeys);	
	AntiSubkey(uSubkeys,uAntiSubkeys);
	bSaved=false;
	bEdited=false;
	strcpy(pszPathName,"C:");
	return false;
}
INT_PTR WINAPI Dlg_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{//窗口处理函数
	switch(uMsg)
	{//消息处理分支
	case WM_COMMAND://处理命令消息
		On_Command(hWnd,LOWORD(wParam),(LPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),HIWORD(wParam));
		break;
	case WM_INITDIALOG://处理对话框初始化消息
		On_InitDialog(hWnd,(WPARAM)GetDlgItem(hWnd,IDC_PLAINTEXT),lParam);
		break;
	case WM_NCLBUTTONDOWN:
	case WM_NCLBUTTONUP:
		if(IsWindow(hCipherDlg))
			SendMessage(hCipherDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);  
		if(IsWindow(hDecryptedDlg))
			SendMessage(hDecryptedDlg,WM_PARENTMOVED,(WPARAM)hWnd,0);  
		SetForegroundWindow(hWnd);
		break;
	case WM_PAINT:
		HDC hdc=GetDC(hWnd);
		SetBkMode(hdc,TRANSPARENT);
		char key[9];
		memcpy(key,uKey,8);
		key[8]=0;
		char str[128]="Current key:";
		strcat(str,key);
		TextOut(hdc,15,-3,str,strlen(str));
		break;
	}
	return 0;
}
int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR pszCmd,int)
{//主函数
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,Dlg_Proc);//对话框
	return 0;
}

⌨️ 快捷键说明

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