`

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

阅读更多

基于VCRSA加密与解密实现技术
一、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:zero_dian@163.com\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);
}
 

分享到:
评论

相关推荐

    vc实现rsa加密解密

    RSA算法是一种非对称加密算法,由Ron Rivest、...总之,通过VC++实现RSA加密解密,可以有效地保护敏感信息,确保数据安全。在实际应用中,还需要注意与网络传输、文件存储等相关安全策略的结合,以构建完整的安全体系。

    用vc++6.0做 的RSA的加密与解密程序

    RSA算法是一种非对称加密算法,它在...总之,这个项目提供了一个直观的RSA加密解密实践,帮助用户理解和应用RSA算法。通过实际操作,你可以更深入地了解非对称加密的工作机制,这对于学习网络安全和密码学非常有帮助。

    rsa.rar_RSA VC_RSA 加密 解密 算法_VC rsa_rsa_visual c

    总的来说,这个“rsa.rar”压缩包提供了一种用C语言在VC环境下实现RSA加密和解密算法的资源。学习和理解这段代码,不仅可以加深对RSA算法的理解,也能掌握如何在实际项目中运用这种强大的加密技术。

    rsa加密解密算法C语言代码

    RSA加密解密算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是目前应用最广泛的公钥加密技术之一。该算法基于大数因子分解的困难性,即在两个大素数已知的情况下容易计算它们的...

    字符串的RSA加密与解密 c语言实现

    C语言对RSA的简单实现,通过对指定字符串进行加密解密来验证程序的正确性。直接修改程序的内部宏定义实现自己的需求。

    RSA.rar_RSA加密文件_RSA加密明文_RSA加密解密和_rsa c_rsa文件加密

    RSA算法是一种非对称加密...总的来说,这个压缩包提供了一套完整的RSA加密解密解决方案,涵盖了理论知识、C语言实现以及用户交互的界面设计。对于学习RSA算法和实践加密应用的开发者来说,这是一个非常有价值的资源。

    RSA加密的VC实现

    通过这个VC实现的RSA加密项目,我们可以学习到如何在实际编程环境中应用非对称加密技术,这对于理解和提高信息安全技能非常有帮助。同时,这也是一个很好的练习,能够加深对数论和大数计算的理解。

    RSA加密与解密(使用大素数)

    在VC6.0中使用MFC(Microsoft Foundation Classes)进行开发,可以创建用户界面,使用户能够方便地输入文本文件,进行加密和解密操作。MFC是微软提供的C++类库,它封装了许多Windows API函数,简化了Windows应用程序...

    RSA加密解密与签名验证

    总的来说,RSA加密解密与签名验证是现代密码学的基础,通过VC6.0和MFC实现这一功能,可以帮助开发者更好地理解和应用这一重要技术。在这个项目中,你需要理解RSA算法的数学原理,熟悉MFC编程,以及如何集成加密库,...

    C++写的实现RSA加密

    C++实现RSA加密 在这里,我们将详细介绍C++实现RSA加密的知识点。 标题分析 该标题表明了这个项目的主要内容是使用...该项目提供了一个简单易用的RSA加密实现,基于C++语言和大数运算,可以在各种C++开发环境下使用。

    VC RAS加密、解密程序实例.rar

    本文将深入探讨一个基于VC(Visual C++)的RAS(Rivest-Shamir-Adleman)加密算法的实例,帮助读者理解加密解密的基本原理及其实际应用。 RAS加密算法,又称为RSA算法,是公钥密码体制的经典代表,由Ron Rivest、...

    RSA.zip_RSA算法_rsa加密解密_ten7dj_windows 破解rsa_加密解密

    这个工程可能包含了实现RSA算法的源代码,用于演示如何在Windows平台上运用RSA加密和解密技术。 RSA加密的过程如下: 1. 选择两个大素数p和q,计算它们的乘积n=p*q。 2. 计算欧拉函数φ(n)=(p-1)*(q-1),它决定了...

    C++实现RSA加密算法

    以下是实现RSA加密解密的基本步骤: 1. **生成密钥对**:选择大素数p和q,计算n=p*q和φ(n),然后使用扩展欧几里得算法找到e和d。 2. **加密**:将明文转换为大整数,然后使用公钥(e, n)进行加密。 3. **解密**:...

    VC做的RSA算法加密解密

    可以自动生成加密解密密钥,用于计算。随意选择两个大的质数p和q,p不等于q,计算N=pq。  根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)  选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)  用以下...

    rsa.rar_VC rsa_rsa加密

    在描述中提到的"VC实现RSA加密,在MFC下运行实现,可用于PGP加密部分",这表明我们讨论的是如何在Visual C++环境下用MFC来实现RSA加密,并且这个实现可能被用于PGP(Pretty Good Privacy)加密工具的一部分。...

    RSA加密解密之Linux C语言版

    **RSA加密解密之Linux C语言版** RSA(Rivest-Shamir-Adleman...总的来说,了解并掌握RSA加密解密的原理和C语言实现,以及如何在Linux环境下进行移植和优化,对于任何IT专业人员来说,都是增强其技术能力的重要一步。

    用C实现的RSA加解密文本文件

    基于VC6.0下的C语言实现的RSA加解密文本文档,随机产生大素数密钥。有自己的大素数运算库。

    visual c++ vc实现RSA加密算法是最常用的非对称加密算法.zip

    总之,这个项目利用VC++实现了RSA加密算法,涉及了非对称加密的核心原理,以及在Windows开发环境下的编程实践。通过对这些源代码的学习,可以深入理解RSA算法的实现细节以及在实际软件开发中的应用。

    MFC vc6.0 RSA DES MD5 加密解密算法

    总之,"MFC vc6.0 RSA DES MD5 加密解密算法"是一个涉及非对称加密、对称加密以及消息摘要的综合应用,开发者需要理解这些算法的原理,并在MFC环境中实现它们,以保证数据的安全传输和存储。通过图形化界面,使得...

    RSA加密解密C++版源代码

    软件思路:加密密钥和解密密钥的生成过程: ① 选取两个足够大的质数P和Q; ② 计算P和Q相乘所产生的乘积n=P*Q; ③ 找出一个小于n的数e,使其符合与(P-1)*(Q-1)互为质数; ④ 另找一个数d,使其满足(e*d) mod [(P-1)...

Global site tag (gtag.js) - Google Analytics