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

📄 testmulticoderdlg.cpp

📁 RSA DES 等几个算法的C程序,不要错过
💻 CPP
字号:
// TestMultiCoderDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestMultiCoder.h"
#include "TestMultiCoderDlg.h"
#include "MultiCoder.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define SPLITCHAR ' '
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

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

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

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

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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestMultiCoderDlg dialog

CTestMultiCoderDlg::CTestMultiCoderDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestMultiCoderDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestMultiCoderDlg)
	m_CodeType = 0;
	m_Key = _T("41365");
	m_PlainText = _T("abcdef0123456789");
	m_CodeText = _T("");
	m_Ver = 0;
	m_Ret = _T("");
	m_CodeText16 = _T("");
	m_N = _T("10285230475148627171");
	m_PK = _T("7431274820890638925");
	m_RSAFlag = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestMultiCoderDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestMultiCoderDlg)
	DDX_Radio(pDX, IDC_CODETYPE, m_CodeType);
	DDX_Text(pDX, IDC_KEY, m_Key);
	DDX_Text(pDX, IDC_PLAINTEXT, m_PlainText);
	DDX_Text(pDX, IDC_CODEDTEXT, m_CodeText);
	DDX_Text(pDX, IDC_VER, m_Ver);
	DDX_Text(pDX, IDC_RET, m_Ret);
	DDX_Text(pDX, IDC_CODEDTEXT16, m_CodeText16);
	DDX_Text(pDX, IDC_N, m_N);
	DDX_Text(pDX, IDC_PK, m_PK);
	DDX_Radio(pDX, IDC_RSAFLAG, m_RSAFlag);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestMultiCoderDlg, CDialog)
	//{{AFX_MSG_MAP(CTestMultiCoderDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_CODE, OnCode)
	ON_BN_CLICKED(IDC_DECODE, OnDecode)
	ON_BN_CLICKED(IDC_DECODE2, OnDecode2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestMultiCoderDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_Ver=GetDLLVersion();
	UpdateData(false);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

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

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestMultiCoderDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestMultiCoderDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//加密
void CTestMultiCoderDlg::OnCode() 
{
   unsigned char digest[17];
   unsigned char obuff[257];
   char keybuff[24];
   int i,ret;
   CString tstr;
   UpdateData();
   switch (m_CodeType)
   {
   case 0://增强MD5
       MD5_Ex((unsigned char*)(LPCSTR)m_PlainText,m_PlainText.GetLength(),(unsigned char*)(LPCSTR)m_Key,m_Key.GetLength(),digest);
	   digest[16]=0;
	   m_CodeText=digest;
	   m_CodeText16="";
	   for (i=0;i<16;i++)
	   {
		  tstr.Format("%02X",digest[i]);
		  m_CodeText16=m_CodeText16+tstr;
	   }
	   m_Ret="无";
	   break;
   case 1://BASE64
	   ret=DoBASE64((const unsigned char*)(LPCSTR)m_PlainText,m_PlainText.GetLength(),obuff,256,EN0);
	   obuff[ret]=0;
	   m_CodeText=obuff;
	   m_CodeText16="";
	   m_Ret.Format("%d",ret);
	   break;
   case 2://DES
	   sprintf((char*)obuff,"%s",m_PlainText);
	   obuff[m_PlainText.GetLength()]=0;
	   memset(keybuff,0,24);
	   sprintf(keybuff,"%s",m_Key.Left(8));
	   DoDES((char*)obuff,m_PlainText.GetLength(),keybuff,EN0);
	   m_CodeText16="";
	   for (i=0;i<m_PlainText.GetLength();i++)
	   {
		  tstr.Format("%02X",obuff[i]);
		  m_CodeText16=m_CodeText16+tstr;
	   }
	   break;
   case 3://3DES
	   sprintf((char*)obuff,"%s",m_PlainText);
	   obuff[m_PlainText.GetLength()]=0;
	   memset(keybuff,0,24);
	   sprintf(keybuff,"%s",m_Key.Left(16));
	   Do3DES((char*)obuff,m_PlainText.GetLength(),keybuff,EN0);
	   m_CodeText16="";
	   for (i=0;i<m_PlainText.GetLength();i++)
	   {
		  tstr.Format("%02X",obuff[i]);
		  m_CodeText16=m_CodeText16+tstr;
	   }
	   break;
   case 4://RSA
	   {
		   char key[DATALENGTH],Nvalue[DATALENGTH];
		   memset(key,0,DATALENGTH);
		   memset(Nvalue,0,DATALENGTH);
		   int i,ret=m_N.GetLength()-1;
		   for (i=0;i<=ret;i++)
		   {
			   Nvalue[i]=m_N.GetAt(i);//顺序从前向后
		   }
		   if (m_RSAFlag==0)
		   {//公钥加密
			   ret=m_PK.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_PK.GetAt(i);//顺序从前向后
			   }
		   }
		   else
		   {//私钥加密
			   ret=m_Key.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_Key.GetAt(i);//顺序从后向前
			   }
		   }
		   int outdatalen;
		   char outdatabuff[1024];
		   memset(outdatabuff,0,1024);
		   DoRSAData((LPSTR)(LPCSTR)m_PlainText,m_PlainText.GetLength(),outdatabuff,outdatalen,key,Nvalue,0);
		   m_CodeText=outdatabuff;
   
		   /*下面注释部分为直接用DoRSA进行加密过程(新版本该函数被封装了)
		   char key[DATALENGTH],Nvalue[DATALENGTH];
		   memset(key,0,DATALENGTH);
		   memset(Nvalue,0,DATALENGTH);
		   ret=m_N.GetLength()-1;
		   for (i=0;i<=ret;i++)
		   {
			   Nvalue[i]=m_N.GetAt(i);//顺序从前向后
		   }
		   if (m_RSAFlag==0)
		   {//公钥加密
			   ret=m_PK.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_PK.GetAt(i);//顺序从前向后
			   }
		   }
		   else
		   {//私钥加密
			   ret=m_Key.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_Key.GetAt(i);//顺序从后向前
			   }
		   }
		   //组织数据,将数据每BYTEPERBLOCK个一组,形成BYTEPERBLOCK bytes的数据类型
		   ret=m_PlainText.GetLength();
		   if (ret<=0) 
		   {			
      	      m_Ret.Format("没有需要加密的数据");
			  return;
		   }
		   //申请输入数据数组
           char indata[DATALENGTH],outdata[DATALENGTH];
		   int txtlen=m_PlainText.GetLength();
		   CString txtdata;
		   unsigned long tnum;
           const int BYTEPERBLOCK=4;

		   if (ret%BYTEPERBLOCK==0)
		      ret=ret/BYTEPERBLOCK;
		   else
			  ret=ret/BYTEPERBLOCK+1;

     	   m_CodeText="";
		   for (i=0;i<ret;i++)
		   {
			   tnum=0;
			   memset(indata,0,DATALENGTH);
			   for (int k=0;k<BYTEPERBLOCK;k++)
			   {
				   if ((i*BYTEPERBLOCK+k)<m_PlainText.GetLength()) 
					   tnum=tnum*256+(BYTE)(m_PlainText.GetAt(i*BYTEPERBLOCK+k));
				   else
					   tnum=tnum*256;
			   }
               txtdata.Format("%lu",tnum);
			   txtlen=txtdata.GetLength()-1;
			   for (int j=0;j<=txtlen;j++)
			   {
			      indata[j]=txtdata.GetAt(j);
			   }
    		   DoRSA(key,Nvalue,indata,outdata);
			   //显示
 			   m_CodeText=m_CodeText+outdata;
			   m_CodeText=m_CodeText+SPLITCHAR;
		   }*/
	   }
	   m_Ret="密文中间空格为人为添加分隔符";
	   break;
   }
   UpdateData(false);
}

//解码
void CTestMultiCoderDlg::OnDecode() 
{
   unsigned char obuff[257];
   int ret;
   UpdateData();
   switch (m_CodeType)
   {
   case 0://增强MD5
	   m_Ret="单向,不能解码";
	   break;
   case 1://BASE64
	   ret=DoBASE64((const unsigned char*)(LPCSTR)m_CodeText,m_CodeText.GetLength(),obuff,256,DE1);
	   obuff[ret]=0;
	   m_PlainText=obuff;
	   m_Ret.Format("%d 解密完毕",ret);
	   break;
   case 2://DES
       m_Ret="请用16进制表示的数据解码";
	   break;
   case 3://3DES
       m_Ret="请用16进制表示的数据解码";
	   break;
   case 4://RSA
	   {
		   char key[DATALENGTH],Nvalue[DATALENGTH];
		   memset(key,0,DATALENGTH);
		   memset(Nvalue,0,DATALENGTH);
		   int i,ret=m_N.GetLength()-1;
		   for (i=0;i<=ret;i++)
		   {
			   Nvalue[i]=m_N.GetAt(i);//顺序从前向后
		   }
		   if (m_RSAFlag==0)
		   {//公钥加密
			   ret=m_Key.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_Key.GetAt(i);//顺序从前向后
			   }
		   }
		   else
		   {//私钥加密
			   ret=m_PK.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_PK.GetAt(i);//顺序从后向前
			   }
		   }
		   int outdatalen;
		   char outdatabuff[1024];
		   memset(outdatabuff,0,1024);
		   DoRSAData((LPSTR)(LPCSTR)m_CodeText,m_CodeText.GetLength(),outdatabuff,outdatalen,key,Nvalue,1);
           m_PlainText=outdatabuff;
		   /*
		   char key[DATALENGTH],Nvalue[DATALENGTH];
		   memset(key,0,DATALENGTH);
		   memset(Nvalue,0,DATALENGTH);
		   ret=m_N.GetLength()-1;
		   for (i=0;i<=ret;i++)
		   {
			   Nvalue[i]=m_N.GetAt(i);//顺序从前
		   }
		   if (m_RSAFlag==0)
		   {//公钥加密,则私钥解密
			   ret=m_Key.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_Key.GetAt(i);//顺序从前
			   }
		   }
		   else
		   {//私钥加密,公钥解密
			   ret=m_PK.GetLength()-1;
			   for (i=0;i<=ret;i++)
			   {
				   key[i]=m_PK.GetAt(i);//顺序从前
			   }
		   }
		   //加过密的数据每块用SPLITCHAR隔开
		   m_CodeText.TrimRight();
		   m_CodeText.TrimLeft();
		   ret=m_CodeText.GetLength();
		   if (ret<=0) 
		   {			
      	      m_Ret.Format("没有需要解密的数据");
			  return;
		   }
		   
		   ret=1;
		   for (i=0;i<m_CodeText.GetLength();i++)
		   {
              if (m_CodeText.GetAt(i)==SPLITCHAR)
			  {
				  ret++;
			  }
		   }

           char indata[DATALENGTH+1],outdata[DATALENGTH+1];
		   int txtlen=m_CodeText.GetLength()-1;
		   CString txtdata;
		   unsigned long tnum;

     	   m_PlainText="";
		   for (i=ret-1;i>=0;i--)
		   {
			   memset(indata,0,DATALENGTH+1);
			   for (int j=0;;j++)
			   {
				   if (m_CodeText.GetAt(txtlen)==SPLITCHAR)
				   {
					   txtlen--;
					   break;
				   }
			       indata[DATALENGTH-1-j]=m_CodeText.GetAt(txtlen);
				   txtlen--;
				   if (txtlen<0) break;
			   }

			   for (j=0;j<DATALENGTH;j++)
			   {
				   if (indata[j]!=0) break;
			   }
			   if (j==DATALENGTH) continue;
    		   DoRSA(key,Nvalue,&indata[j],outdata);
    		   //显示
			   txtdata=outdata;
			   tnum=atol(txtdata);
			   txtdata="";
			   while (tnum>0)
			   {
                  txtdata=char(tnum & 0x000000ff)+txtdata;
				  tnum=tnum>>8; 
			   }
			   m_PlainText=txtdata+m_PlainText;
		   }*/
	   }
	   m_Ret="RSA解密完毕";
	   break;
   }
   UpdateData(false);	
}

//通过16进制数据解码
void CTestMultiCoderDlg::OnDecode2() 
{
   unsigned char ibuff[257];
   char keybuff[24];
   int i,datalen;
   char ch;

   UpdateData();
   
   //首先得到数据
   m_CodeText16.MakeUpper();
   datalen=m_CodeText16.GetLength()/2;
   memset(ibuff,0,257);
   for (i=0;i<datalen;i++)
   {
	   ch=m_CodeText16.GetAt(2*i);
	   if (ch>='A')
		   ch=ch-'A'+10;
	   else
		   ch=ch-'0';
	   ibuff[i]=ch;
	   ch=m_CodeText16.GetAt(2*i+1);
	   if (ch>='A')
		   ch=ch-'A'+10;
	   else
		   ch=ch-'0';
	   ibuff[i]=(BYTE)ibuff[i]*16+ch;
   }

   switch (m_CodeType)
   {
   case 0://增强MD5
	   m_Ret="单向,不能解码";
	   break;
   case 1://BASE64
	   m_Ret="请直接用可显示密码解码";
	   break;
   case 2://DES
	   memset(keybuff,0,24);
	   sprintf(keybuff,"%s",m_Key.Left(8));
	   DoDES((char*)ibuff,datalen,keybuff,DE1);
	   m_PlainText=ibuff;
	   m_Ret.Format("DES解密完毕");
	   break;
   case 3://3DES
	   memset(keybuff,0,24);
	   sprintf(keybuff,"%s",m_Key.Left(16));
	   Do3DES((char*)ibuff,datalen,keybuff,DE1);
	   m_PlainText=ibuff;
	   m_Ret.Format("3DES解密完毕");
	   break;
   }
   UpdateData(false);		
}

⌨️ 快捷键说明

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