基于VC的RSA加密和解密实现技术

基于 VC RSA 加密与解密实现技术
一、RSA 基本原理
对明文分组M和密文分组C,加密与解密过程如下:
C = POW (M , e) mod n
M = POW(C , d) mod n = POW(POW( M ,e), d) mod n=POW( M,e*d)
其中POW是指数函数,mod是求余数函数。
其中收发双方均已知n,发送放已知e,只有接受方已知d,因此公钥加密算法的公钥为
KU={ e , n},私钥为KR={d , n}。该算法要能用做公钥加密,必须满足下列条件:
1. 可以找到e ,d和n,使得对所有M<n ,POW(M ,e*d)=M mod n .
2. 对所有 M<n,计算POW (M , e)和POW(C , d)是比较容易的。
3. 由e 和n确定d是不可行的
下面介绍RSA算法,该算法中到的下列的元素:
两个素数p, q (保密的,选定的)
n=p*q (公开的,计算得出的)
e , gcd ( x(n),e) =1;1<e<x(n) (公开的,选定的)
d≡POW(e,-1) mod x(n) (保密的,计算得出的)
这里,私钥为{d ,n},公钥为{e ,n}。假定用户A已公布了其公钥,用户B要发送消息M给A,那么用户B计算C= POW (M , e) mod n,并发送C,在接受端,用户A计算
M = POW(C , d) mod n 以解出消息M。
二、开发平台及语言
1、开发平台:Microsoft Visual Studio c++ 6.0
2.语言: c++
三、应用程序界面设计及变量的连接和方法的名称

对象
ID
Caption
连接变量或方法
成组框
IDC_STATIC
产生密钥过程
编辑框
IDC_PRIME_EDIT1
m_PrimeEdit1/long
编辑框
IDC_PRIME_EDIT2
m_PrimeEdit2/long
编辑框
IDC_PUBN_EDIT
m_PubNEdit/long
编辑框
IDC_PUBX_EDIT
m_PubXEdit/long
编辑框
IDC_PUBKEY_EDI
m_PubKeyEdit/long
编辑框
IDC_PRIKEY_EDIT
m_PriKeyEdit/CEdit
命令按钮
IDC_CALCULATE_BUTTON
计算
OnCalculateButton()
命令按钮
IDC_PUBKEY_BUTTON
公有密钥
OnPubkeyButton()
命令按钮
IDC_PRIKEY_BUTTON
私有密钥
OnPrikeyButton()
命令按钮
IDC_HIDE_PRIKEY_BUTTON
隐藏私钥
OnHidePrikeyButton()
命令按钮
IDC_SHOW_PRIKEY_BUTTON
显示私钥
OnShowPrikeyButton()
命令按钮
IDC_STATIC
加密和解密过程
编辑框
IDC_RESOURCE_EDIT
m_ResourceEdit/CEdit
OnChangeResourceEdit()
编辑框
IDC_CRYPTOGRAPH_EDIT
m_CryptographEdit/CEdit
编辑框
IDC_OPEN_EDIT
m_OpenEdit/CEdit
编辑框
IDC_LINE
m_Line/CEdit
编辑框
IDC_CHAR
m_Char/CEdit
命令按钮
IDC_ENCRYPT_BUTTON
数字加密
OnEncryptButton()
命令按钮
IDC_OPEN_BUTTON
数字解密
OnOpenButton()
命令按钮
IDC_CLEAR_BUTTON
Clear
OnClearButton()
命令按钮
IDC_EXIT_BUTTON
Exit
OnExitButton()
命令按钮
IDC_ENCRYPT_TEXT_BUTTON
文本加密
OnEncryptTextButton()
命令按钮
IDC_OPEN_TEXTBUTTON
文本解密
OnOpenTextbutton()
菜单
ID_CALCULATE_MENU
计算
OnCalculateMenu()
菜单
ID_PUBKEY_MENU
公有密钥
OnPubkeyMenu()
菜单
ID_PRIKEY_MENU
私有密钥
OnPrikeyMenu()
菜单
ID_HIDE_MENU
隐藏私钥
OnHideMenu()
菜单
ID_SHOW_MENU
显示私钥
OnShowMenu()
菜单
ID_CLEAR_MENU
清除
OnClearMenu()
菜单
ID_EXIT_MENU
退出
OnExitMenu()
菜单
ID_ENCRYPTNUM_MENU
数字加密
OnEncryptnumMenu()
菜单
ID_OPENNUM_MENU
数字解密
OnOpennumMenu()
菜单
ID_ENCRYPTTEXT_MENU
文本加密
OnEncrypttextMenu()
菜单
ID_OPENTEXT_MENU
文本解密
OnOpentextMenu()
菜单
ID_ABOUT_MENU
关于
OnAboutMenu()
四、RSADlg.h 声明
// RSADlg.h : header file
#if !defined(AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDED_)
#define AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <math.h>
/////////////////////////////////////////////////////////////////
// CRSADlg dialog
class CRSADlg : public CDialog
{
// Construction
public:
char CalculateModOfChar(double num1, double num2);
char CalculateModOfChar(const char cChar, double num,long *ps);
double calculatemod(double num1, double num2);
int primeNumber(long m);
CRSADlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CRSADlg)
enum { IDD = IDD_RSA_DIALOG };
CEdit m_OpenEdit;
CEdit m_CryptographEdit;
CEdit m_PriKeyEdit;
CEdit m_ResourceEdit;
CEdit m_Line;
CEdit m_Char;
long m_PubNEdit;
long m_PubXEdit;
long m_PrimeEdit1;
long m_PrimeEdit2;
long m_PubKeyEdit;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CRSADlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CRSADlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnCalculateButton();
afx_msg void OnPubkeyButton();
afx_msg void OnPrikeyButton();
afx_msg void OnChangeResourceEdit();
afx_msg void OnHidePrikeyButton();
afx_msg void OnShowPrikeyButton();
afx_msg void OnClearButton();
afx_msg void OnExitButton();
afx_msg void OnEncryptButton();
afx_msg void OnOpenButton();
afx_msg void OnEncryptTextButton();
afx_msg void OnOpenTextbutton();
afx_msg void OnCalculateMenu();
afx_msg void OnPubkeyMenu();
afx_msg void OnPrikeyMenu();
afx_msg void OnHideMenu();
afx_msg void OnShowMenu();
afx_msg void OnClearMenu();
afx_msg void OnExitMenu();
afx_msg void OnEncryptnumMenu();
afx_msg void OnOpennumMenu();
afx_msg void OnEncrypttextMenu();
afx_msg void OnOpentextMenu();
afx_msg void OnAboutMenu();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
long lArrayOfCount[300]; //文本加密和解密过程中记数功能
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_RSADLG_H__D491C4A6_0DE9_4430_BE31_2150D1C5E35F__INCLUDED_)
五、映射消息的应用程序代码
1、void CRSADlg::OnCalculateButton() //计算按钮处理函数
{
UpdateData(TRUE);
int flag1,flag2;
flag1=primeNumber(m_PrimeEdit1);
flag2=primeNumber(m_PrimeEdit2);
if(flag1==1)
m_PrimeEdit1=m_PrimeEdit1;
else m_PrimeEdit1=0;
if(flag2==1)
m_PrimeEdit2=m_PrimeEdit2;
else m_PrimeEdit2=0;
m_PubNEdit=m_PrimeEdit1*m_PrimeEdit2;
m_PubXEdit=(m_PrimeEdit1-1)*(m_PrimeEdit2-1);
UpdateData(FALSE);
}
2、int CRSADlg::primeNumber(long m) //判断是否为素数
{
int flag=1;
long temp=(long)sqrt(m);
for(int i=2;i<=temp;i++)
{
if(m%i==0)
{
flag=0;
break;
}
}
if(flag==0) return 0;
else return 1;
}
3、void CRSADlg::OnPubkeyButton() //公有密钥按钮处理函数
{
UpdateData(TRUE);
if(primeNumber(m_PubKeyEdit)==0||m_PubXEdit%m_PubKeyEdit==0||m_PubKeyEdit>m_PubXEdit)
m_PubKeyEdit=0;
UpdateData(FALSE);
}
4、void CRSADlg::OnPrikeyButton()
{
UpdateData(TRUE);
double privatenum;
char cBuffer[32];
for(double i=1; ;i++)
{
double temp=fmod((i*m_PubXEdit+1),m_PubKeyEdit);
if(temp==0.0 && (i*m_PubXEdit+1)/m_PubKeyEdit<m_PubXEdit)
{
privatenum=(i*m_PubXEdit+1)/m_PubKeyEdit;
break;
}
}
sprintf(cBuffer,"%0.0f",privatenum);
m_PriKeyEdit.SetWindowText(cBuffer);
}
5、void CRSADlg::OnChangeResourceEdit()
{
CString METext;
char Count[10];
int nCharNum,nLineNum;
m_ResourceEdit.GetWindowText(METext);
nCharNum=METext.GetLength();
nLineNum=m_ResourceEdit.GetLineCount();
nCharNum-=(nLineNum-1);
itoa(nCharNum,Count,10);
m_Char.SetWindowText(Count);
itoa(nLineNum,Count,10);
m_Line.SetWindowText(Count);
}
6、void CRSADlg::OnHidePrikeyButton()
{
m_PriKeyEdit.ShowWindow(SW_HIDE);
}
8、void CRSADlg::OnExitButton()
{
OnOK();
}
9、void CRSADlg::OnOpenButton() //数字解密按钮处理函数
{
char sArray[20];
char Count[32];
double number1,number2;
double nPriKey;
m_PriKeyEdit.GetWindowText(sArray,20);
nPriKey=atof((LPCTSTR)sArray);
m_CryptographEdit.GetWindowText(sArray,20);
number1=atof((LPCTSTR)sArray);
number2=calculatemod(number1,nPriKey);
sprintf(Count,"%0.0f",number2);
m_OpenEdit.SetWindowText(Count);
}
10、double CRSADlg::calculatemod(double num1, double num2) //数字加密和解密算法
{ //求余处理函数
double mul=1.0;
for(long i=0;i<(long)num2;i++)
{
mul*=fmod(num1,m_PubNEdit);
mul=fmod(mul,m_PubNEdit);
}
mul=fmod(mul,m_PubNEdit);
return mul;
}
11、void CRSADlg::OnEncryptTextButton()
{
long *point=lArrayOfCount;
CString sArray;
int nCount;
m_Char.GetWindowText(sArray);
nCount=atoi(sArray);
char sResourceText[300];
char sCryptogramText[300];
char *pResourceText=sResourceText;
char *pCryptogramText=sCryptogramText;
m_ResourceEdit.GetWindowText(sResourceText,nCount+1);
for(int i=0;i<nCount;i++)
{
*pCryptogramText=CalculateModOfChar(*pResourceText,m_PubKeyEdit,point);//调用文本加密求余函
point++; //指向下个地址,准备记录下个数
pResourceText++;
pCryptogramText++;
}
*pCryptogramText[nCount]='\0';
m_CryptographEdit.SetWindowText(sCryptogramText);
}
12、void CRSADlg::OnOpenTextbutton()
{
long *point1=lArrayOfCount;
char sArray[10];
int nCount;
double fPriKey;
m_Char.GetWindowText(sArray,10);
nCount=atoi((LPCTSTR)sArray);
m_PriKeyEdit.GetWindowText(sArray,10);
fPriKey=atof((LPCTSTR)sArray);
char sOpenText[300];
char sCryptogramText[300];
char *pOpenText=sOpenText;
char *pCryptogramText=sCryptogramText;
m_CryptographEdit.GetWindowText(sCryptogramText,300);
double tempnumber;
for(int i=0;i<nCount;i++)
{
tempnumber=(*point1)*128+*pCryptogramText;
*pOpenText=CalculateModOfChar(tempnumber,fPriKey); //调用文本解密求余函数,得到解密字符
point1++; //指向记录下个数字
pCryptogramText++;
pOpenText++;
}
*pOpenText[nCount]='\0';
m_OpenEdit.SetWindowText(sOpenText);
}
13、char CRSADlg::CalculateModOfChar(const char cChar, double num,long *ps)
{ //文本加密算法求余处理函数
double mul=1;
for(long i=0;i<num;i++)
{
mul*=fmod((double)cChar,m_PubNEdit);
mul=fmod(mul,m_PubNEdit);
}
*ps=(long)mul/128;
return (char)fmod(mul,128);
}
14、char CRSADlg::CalculateModOfChar(double num1, double num2)
{ //文本函数解密处理函数
double mul=1;
for(long i=0;i<num2;i++)
{
mul*=fmod(num1,m_PubNEdit);
mul=fmod(mul,m_PubNEdit);
}
return (char)mul;
}
15、void CRSADlg::OnCalculateMenu()
{
OnCalculateButton();
}
16、void CRSADlg::OnPubkeyMenu()
{
OnPubkeyButton();
}
17、void CRSADlg::OnPrikeyMenu()
{
OnPrikeyButton();
}
18、void CRSADlg::OnHideMenu()
{
OnHidePrikeyButton();
}
19、void CRSADlg::OnShowMenu()
{
OnShowPrikeyButton();
}
20、void CRSADlg::OnClearMenu()
{
OnClearButton();
}
21、void CRSADlg::OnExitMenu()
{
OnExitButton();
}
22、void CRSADlg::OnEncryptnumMenu()
{
OnEncryptButton();
}
23、void CRSADlg::OnOpennumMenu()
{
OnOpenButton();
}
24、void CRSADlg::OnEncrypttextMenu()
{
OnEncryptTextButton();
}
25、void CRSADlg::OnOpentextMenu()
{
OnOpenTextbutton();
}
26、void CRSADlg::OnAboutMenu()
{
MessageBox("卖石头创作 QQ:170758887\n\nRSA V1.0 版权所有 (C) 2006\n\nEmail:[email protected]\n\n\n");
}
27、void CRSADlg::OnEncryptButton() //数字加密按钮处理函数
{
char sArray[20];
char Count[32];
double number1,number2;
m_ResourceEdit.GetWindowText(sArray,20);
number1=atof((LPCTSTR)sArray);
number2=calculatemod(number1,m_PubKeyEdit);
//itoa(number2,Count,10);
sprintf(Count,"%0.0f",number2);
m_CryptographEdit.SetWindowText(Count);
}
28、void CRSADlg::OnShowPrikeyButton()
{
m_PriKeyEdit.ShowWindow(SW_SHOW);
}
29、void CRSADlg::OnClearButton()
{
m_ResourceEdit.SetSel(0,-1);
m_ResourceEdit.ReplaceSel("");
m_PriKeyEdit.SetSel(0,-1);
m_PriKeyEdit.ReplaceSel("");
m_CryptographEdit.SetSel(0,-1);
m_CryptographEdit.ReplaceSel("");
m_OpenEdit.SetSel(0,-1);
m_OpenEdit.ReplaceSel("");
UpdateData(FALSE);
}

你可能感兴趣的:(C++,c,算法,C#,vc++)