📄 testmulticoderdlg.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 + -