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

📄 des2.cpp

📁 des加密 支持短块加密 文件加密 弱密钥过滤 还附加随机性测试
💻 CPP
字号:
// DES2.cpp : 实现文件
//

#include "stdafx.h"
#include "DES.h"
#include "DES2.h"
#include "DES_MAIN.h"


// CDES2 对话框

IMPLEMENT_DYNAMIC(CDES2, CDialog)

CDES2::CDES2(CWnd* pParent /*=NULL*/)
	: CDialog(CDES2::IDD, pParent)
	, input(_T(""))
	, key(_T(""))
	, m_out(_T(""))
	, c_out(_T(""))
	{
	m_font.CreatePointFont(150,"宋体");
}

CDES2::~CDES2()
{
}

void CDES2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT3, input);
DDX_Text(pDX, IDC_EDIT4, key);
DDV_MaxChars(pDX, key, 16);
DDX_Text(pDX, IDC_EDIT1, m_out);
DDX_Text(pDX, IDC_EDIT2, c_out);
	}


BEGIN_MESSAGE_MAP(CDES2, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, &CDES2::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CDES2::OnBnClickedButton2)
	ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// CDES2 消息处理程序

void CDES2::OnBnClickedButton1()
	{


	char keyHex[17]={0};//十六进制密钥
	char cHex[17]={0};//十六进制密文	
	bool mBit[64];//二进制明文	
	bool cBit[64];//二进制密文	
	bool keyBit[64];//二进制密钥	
	char mChar[9]={0};//明文字符		
	char mTemp[1024]={0};//明文缓冲区	
	char cTemp[1024]={0};//密文缓冲区	
	int mlength,keylength,clength;//mlength 明文长度  keylength 密钥长度
	int j,k;
	bool FLAG=true;//容错性检测
	char mlengthbuff[1024]={0};
	char clengthbuff[1024]={0};

	bool mBitend[64]={0};
	char mCharend[9]={0};
	
	
	GetDlgItemText(IDC_EDIT3,input);
	GetDlgItemText(IDC_EDIT4,key);
	
	
	memcpy(mTemp,input,1024);
	mlength=input.GetLength();
	keylength=key.GetLength();
	k=mlength%8;


	if (mlength==0)
		{
		FLAG=false;
		AfxMessageBox("明文不能为空");
		SetDlgItemText(IDC_DES1,"    ERROR!!!");
		}
	if (keylength<16)
		{
		FLAG=false;
		AfxMessageBox("密钥长度不足16位,请重新输入");
		SetDlgItemText(IDC_DES1,"    ERROR!!!");
		}

	if (FLAG==true)
		{

	//生成子密钥
	memcpy(keyHex,key,16);
	HexToBit(keyHex,keyBit);
	CreateSubKey(keyBit);

	if (weakkey(SubKey)==FALSE)
		{
		AfxMessageBox("您输的是弱密钥,请重新输入");
		}

	if (weakkey(SubKey)==TRUE)
		{
		if (mlength<8)
			{
			memcpy(mChar,mTemp,8);
			//明文转化为二进制并加密成二进制密文
			CharToBit(mChar,mBit,64);
			Run(mBit,cBit,1);
			//将二进制密文转化为十六进制密文
			BitToHex(cBit,cHex);
			strcat_s(cTemp,cHex);
			SetDlgItemText(IDC_EDIT2,cTemp);

			}


		for(j=0;j<mlength/8;j++)
			{
			memcpy(mChar,mTemp+j*8,8);
			//明文转化为二进制并加密成二进制密文
			CharToBit(mChar,mBit,64);
			Run(mBit,cBit,1);
			//将二进制密文转化为十六进制密文
			BitToHex(cBit,cHex);
			strcat_s(cTemp,cHex);
			
			
			
			//短块处理
			if (j==(mlength/8-1)&&(k!=0))
				{	
				//取出一部分上一块的密文
				memcpy(mBitend,cBit+k*8,(8-k)*8);
				//取出最后一块短块
				memcpy(mCharend,mTemp+(j+1)*8,k);
				//明文转化为二进制并加密成二进制密文
				CharToBit(mCharend,mBit,k*8);
				//连接成64bit二进制作为明文
				memcpy(mBitend+(8-k)*8,mBit,k*8);
				Run(mBitend,cBit,1);
				//将二进制密文转化为十六进制密文
				BitToHex(cBit,cHex);
				//覆盖前面的一部分密文
				memcpy(cTemp+j*16+k*2,cHex,16);
				cTemp[j*16+k*2+16]='\0';
				}
			}
		SetDlgItemText(IDC_EDIT2,cTemp);
		

		if(k==0)
			SetDlgItemText(IDC_DES1,"     加密成功!!!");
		else 	SetDlgItemText(IDC_DES1,"您输入的字符串中有短块\n短块加密成功!!!");
		       _itoa_s(mlength,mlengthbuff,10);
				SetDlgItemText(IDC_MLENGTH,mlengthbuff);
				if (mlength<8)
				{clength=16;}
				else clength=(j-1)*16+k*2+16;
				_itoa_s(clength,clengthbuff,10);
				SetDlgItemText(IDC_CLENGTH,clengthbuff);
		}


		}
	}

void CDES2::OnBnClickedButton2()
	{

	char keyHex[17]={0};//十六进制密钥
	char cHex[17]={0};//十六进制密文	
	bool mBit[64];//二进制明文	
	bool cBit[64];//二进制密文	
	bool keyBit[64];//二进制密钥	
	char mChar[9]={0};//明文字符		
	char mTemp[1024]={0};//明文缓冲区	
	char cTemp[1024]={0};//密文缓冲区	
	int mlength,keylength,clength;//mlength 明文长度  keylength 密钥长度
	bool FLAG=true;//容错性检测
	char mlengthbuff[1024]={0};
	char clengthbuff[1024]={0};
	int i,j,k;

	GetDlgItemText(IDC_EDIT2,c_out);
	GetDlgItemText(IDC_EDIT4,key);

	memcpy(cTemp,c_out,1024);
	keylength=key.GetLength();
	clength=c_out.GetLength();
	k=clength%16;

	if (clength==0)
		{
		FLAG=false;
		AfxMessageBox("密文为空");
		SetDlgItemText(IDC_DES1,"    ERROR!!!");
		}
	if (keylength<16)
		{
		FLAG=false;
		AfxMessageBox("密钥长度不足16位,请重新输入");
		SetDlgItemText(IDC_DES1,"    ERROR!!!");
		}

	if (FLAG==true)
		{

	//生成子密钥
	memcpy(keyHex,key,16);
	HexToBit(keyHex,keyBit);
	CreateSubKey(keyBit);
	for(j=0;j<clength/16;j++)
		{
		char mChar1[9]={0};
		char mChar2[9]={0};
		char mChartemp[9]={0};
		char cHextemp[19]={0};
		//char cHex7[19]={0};
		char mChar8[9]={0};

		
		
		//短块解密
		if(j==(clength/16)-1&&(k!=0))
			{
			//解密最后64bit
			memcpy(cHex,cTemp+k+j*16,16);
			//十六进制密文转化为二进制密文并解密成二进制明文
			HexToBit(cHex,cBit);	
			Run(cBit,mBit,0);
			//将二进制密文转化为明文
			BitToHex(mBit,cHextemp);
			
			//取出短块的明文
			BitToChar(mBit,mChar1,64);
			memcpy(mChartemp,mChar1+(16-k)/2,k/2);
			//解密出来的密文与前面的密文连接组成64bit
			memcpy(cHex,cTemp+j*16,k);
			memcpy(cHex+k,cHextemp,16-k);
			HexToBit(cHex,cBit);	
			Run(cBit,mBit,0);
			//将二进制密文转化为明文
			BitToChar(mBit,mChar2,64);
			strcat_s(mTemp,mChar2);
			strcat_s(mTemp,mChartemp);
			}
		else{  		
			memcpy(cHex,cTemp+j*16,16);
			//十六进制密文转化为二进制密文并解密成二进制明文
			HexToBit(cHex,cBit);	
			Run(cBit,mBit,0);
			//将二进制密文转化为明文
			BitToChar(mBit,mChar8,64);
			strcat_s(mTemp,mChar8);
			}

		}
	SetDlgItemText(IDC_EDIT1,mTemp);
	SetDlgItemText(IDC_DES1,"    解密成功!!!");
	for (i=0;;i++)
	{
	if (mTemp[i]=='\0')	
	break;
	}
	mlength=i;
	_itoa_s(mlength,mlengthbuff,10);
	SetDlgItemText(IDC_MLENGTH,mlengthbuff);
	_itoa_s(clength,clengthbuff,10);
	SetDlgItemText(IDC_CLENGTH,clengthbuff);

		}

	}

	HBRUSH CDES2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
		{
		HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

		// TODO:  在此更改 DC 的任何属性
		if (pWnd->GetDlgCtrlID()==IDC_DES1)
			{
			pDC->SelectObject(&m_font);
			pDC->SetTextColor(RGB(0,197,205));
			}
		if (pWnd->GetDlgCtrlID()==IDC_CLENGTH)
			{
			pDC->SelectObject(&m_font);
			pDC->SetTextColor(RGB(255,0,0));
			}
		if (pWnd->GetDlgCtrlID()==IDC_MLENGTH)
			{
			pDC->SelectObject(&m_font);
			pDC->SetTextColor(RGB(255,0,0));
			}
		// TODO:  如果默认的不是所需画笔,则返回另一个画笔
		return hbr;
		}

⌨️ 快捷键说明

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