📄 rsadlg.cpp
字号:
// RSADlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSA.h"
#include "RSADlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CRSADlg dialog
CRSADlg::CRSADlg(CWnd* pParent /*=NULL*/)
: CDialog(CRSADlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CRSADlg)
m_C = _T("");
m_Len = 0;
m_D = _T("");
m_E = _T("");
m_M = _T("");
m_MM = _T("");
m_N = _T("");
m_P = _T("");
m_Q = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CRSADlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRSADlg)
DDX_Text(pDX, IDC_C, m_C);
DDX_CBIndex(pDX, IDC_COMBO, m_Len);
DDX_Text(pDX, IDC_D, m_D);
DDX_Text(pDX, IDC_E, m_E);
DDX_Text(pDX, IDC_M, m_M);
DDX_Text(pDX, IDC_MM, m_MM);
DDX_Text(pDX, IDC_N, m_N);
DDX_Text(pDX, IDC_P, m_P);
DDX_Text(pDX, IDC_Q, m_Q);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRSADlg, CDialog)
//{{AFX_MSG_MAP(CRSADlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRSADlg message handlers
BOOL CRSADlg::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
return TRUE; // return TRUE unless you set the focus to a control
}
void CRSADlg::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 CRSADlg::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 CRSADlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BEGIN_EVENTSINK_MAP(CRSADlg, CDialog)
//{{AFX_EVENTSINK_MAP(CRSADlg)
ON_EVENT(CRSADlg, IDC_RANDOM, -600 /* Click */, OnClickRandom, VTS_NONE)
ON_EVENT(CRSADlg, IDC_HAND, -600 /* Click */, OnClickHand, VTS_NONE)
ON_EVENT(CRSADlg, IDC_ENCRYPT, -600 /* Click */, OnClickEncrypt, VTS_NONE)
ON_EVENT(CRSADlg, IDC_DECRYPT, -600 /* Click */, OnClickDecrypt, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CRSADlg::OnClickRandom()
{
// TODO: Add your control notification handler code here
ready = 1; //将ready置1,表示密钥已经产生,可以进行加密
UpdateData( TRUE ); //获取用户为的密钥长度
int len = 2; //len存储密钥长度
for( int i=0; i<m_Len; i++ )
len *= 2;
P.Mov( 0 );
Q.Mov( 0 );
N.Mov( 0 );
E.Mov( 0 );
P.GetPrime( len ); //获得随机素数,长度为len位,进制0x10000000
P.Put( m_P ); //将素数输出
Q.GetPrime( len );
Q.Put( m_Q );
N.Mov( P.Mul( Q ) ); //计算n = pq;
N.Put( m_N ); //输出
P.m_ulValue[0] --;
Q.m_ulValue[0] --;
P.Mov( P.Mul( Q ) ); //计算(p-1)(q-1)
do //得到e
{
E.GetPrime( P.m_nLength );
}while( E.Cmp(P) == -1 );
E.Put( m_E );
D.Mov( E.Euc( P ) ); //根据e计算d
D.Put( m_D );
UpdateData(FALSE); //将结果显示出来
}
void CRSADlg::OnClickHand()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //得到用户输入的数据
ready = 0; //ready置0,表示密钥没有输入
for( int i=0; i<m_P.GetLength(); i++ ) //检查p的格式
{
if((m_P[i]<'0')||
((m_P[i]>'9')&&(m_P[i]<'A'))||
((m_P[i]>'F')&&(m_P[i]<'a'))||
(m_P[i]>'f'))
{
m_P = _T("N必须为0-9或A-F或a-f组成的整数");
UpdateData(FALSE);
return;
}
}
for( i=0; i<m_Q.GetLength(); i++ ) //检查q的格式
{
if((m_Q[i]<'0')||
((m_Q[i]>'9')&&(m_Q[i]<'A'))||
((m_Q[i]>'F')&&(m_Q[i]<'a'))||
(m_Q[i]>'f'))
{
m_Q = _T("E必须为0-9或A-F或a-f组成的整数");
UpdateData(FALSE);
return;
}
}
for( i=0; i<m_D.GetLength(); i++ ) //检查d的格式
{
if((m_D[i]<'0')||
((m_D[i]>'9')&&(m_D[i]<'A'))||
((m_D[i]>'F')&&(m_D[i]<'a'))||
(m_D[i]>'f'))
{
m_D = _T("D必须为0-9或A-F或a-f组成的整数");
UpdateData(FALSE);
return;
}
}
P.Get(m_P); //将用户输入的数据给相应大数
Q.Get(m_Q);
D.Get(m_D);
N.Mov( P.Mul(Q) ); //计算n
N.Put(m_N);
P.m_ulValue[0] --;
Q.m_ulValue[0] --;
P.Mov( P.Mul( Q ) ); //计算(p-1)(q-1)
do //计算e
{
E.GetPrime( P.m_nLength );
}while( E.Cmp(P) == -1 );
E.Put( m_E );
ready = 1; //ready置1,表示密钥已经准备好可以进行加密
UpdateData(FALSE);
}
void CRSADlg::OnClickEncrypt()
{
// TODO: Add your control notification handler code here
if( ready == 0 )
{
m_M = _T("请先输入或生成N、D、E");
UpdateData(FALSE);
return;
}
UpdateData(TRUE);
//明文分组
CString mtemp = StringToHEX(m_M); //将输入的字符串转换为ASCII码保存在metmp中
CString res = ""; //保存结果
CString enTemp; //保存没步结果
int i = 0;
int Count = 0;
int maxLen = (m_Len+1)*32; //分组长度由密钥长度决定
mEncrypted.RemoveAll();
while( i < ( mtemp.GetLength() ) )
{
int j=0;
enTemp = "";
i = (maxLen-1) * mEncrypted.GetSize();
while(j<(maxLen-1)) //明文分组
{
if( i >= ( mtemp.GetLength() ) )
break;
else
{
enTemp += mtemp.GetAt(i);
j++;
i++;
}
}
M.Get(enTemp); //加密
C.Mov(M.RsaTrans(E,N));
C.Put(enTemp);
mEncrypted.Add(enTemp); //将加密后的字符串保存到mEncrypted中
res.Insert( res.GetLength(), enTemp );//将结果加到res最后
}
m_C = res; //输出结果
UpdateData(FALSE);
}
void CRSADlg::OnClickDecrypt()
{
// TODO: Add your control notification handler code here
if( (ready==0) || (C.m_ulValue[0]==0) )
{
m_C=_T("请先进行加密");
UpdateData(FALSE);
return;
}
UpdateData(TRUE);
CString res = ""; //保存解密结果
for( int i=0; i<mEncrypted.GetSize(); i++ ) //按分组依次解密
{
CString deTemp = "";
C.Mov(0);
M.Mov(0);
C.Get(mEncrypted.GetAt(i));
M.Mov(C.RsaTrans(D,N));
M.Put(deTemp);
res.Insert( res.GetLength(), deTemp ); //将每次解密结果插入res最后
}
m_MM = HEXToString(res); //将结果转换为字符串并输出
UpdateData(FALSE);
}
CString CRSADlg::StringToHEX(CString str) //将字符串转换为16进制的ASCII码
{
int i,j,k;
CString HEXList = "0123456789ABCDEF";
CString strHex = "";
char ch;
for( int m=0; m<str.GetLength(); m++ ) //按位转换
{
ch = str.GetAt(m);
i = (int)ch;
j = i % 16;
k = i / 16;
strHex += HEXList.GetAt(k);
strHex += HEXList.GetAt(j);
}
return strHex;
}
CString CRSADlg::HEXToString(CString strHex) //将16进制的字符串转换为字符
{
CString HEXList = "0123456789ABCDEF";
CString str="";
int i,j,k;
char temp[2];
while( strHex != "" ) //2位一组进行转换
{
temp[0] = strHex.GetAt(0);
temp[1] = strHex.GetAt(1);
strHex.Delete( 0, 2 );
k = HEXList.Find( temp[1] );
j = HEXList.Find( temp[0] );
i = j*16 + k;
str += (char)i;
}
return str;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -