网站导航网学 原创论文 网站设计 最新系统 最新研究 原创论文 获取论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计下载 > VC与C++类别 > 正文

基于VC++实现的RSA算法加密和解密运算

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/05/14

网学网VC与C++类别编辑为广大网友搜集整理了:基于VC++实现的RSA算法加密和解密运算绩等信息,祝愿广大网友取得需要的信息,参考学习。

QQ交谈客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn

 

4.3代码实现
下面主要介绍一下主程序中用到的函数。在程序的具体实现过程中使用了已有的大整数类CBigInt提供的接口函数。其中调用的接口函数主要有:
Get()函数,从字符串输入到大数;
Put()函数,将大数输出到字符串;
Mov()函数,赋值运算,可赋值为大数或普通整数,可重载为运算符“=”;
RsaTrans()函数,反复平方算法进行幂模运算
程序中实现的功能模块主要有:
Decrypt()函数                   / /实现解密;
encrypt()函数                   //实现加密;
OnImportPK ()                  //导入加密密钥
OnImportFile ()                  //选择要加密的文件并加密
OnEncrypt ()                    //生成密文
OnImportSK ()                  //导入解密密钥
OnDecrypt()                    //生成明文
charver(char *str)                //生成明文模块中对汉字显示的处理
程序运行时的主要界面如“运行截图所示”,包括五个功能区。而且软件的界面设计比较简单,操作起来很方便。最上方的区域用于导入已经设定好的私钥,用户点此”导入私钥”即可导入私钥。接着下来是选择用户想要加密的文件。然后点击结下来的“生成密文”,就可以看到生成的密文。如果想解密,只需要接着操作下面的“导入公钥”这里的公钥使解密密钥,公钥也是事先保存好的。最后就可以显示出解密后的明文。
4.4 各个功能模块介绍
4.4.1加密和解密函数的实现
encrypt()函数和decrypt()函数是实现RSA算法中的对明文加密和对密文解密功能的,其中调用了大整数类中的RsaTrans()函数用做RSA加密和解密算法中的模幂运算。
encrypt(CBigInt& m,CBigInt& n,CBigInt& e)
{
CBigInt c;
// c.Mov(m.RsaTrans(e,n))实现了c=m^e(modn)运算
c.Mov(m.RsaTrans(e,n));
       return c;
decrypt(CBigInt& c,CBigInt& n,CBigInt& d)
{
       CBigInt m;
       m.Mov(c.RsaTrans(d,n));
       return m;
}
4.4.2导入加密密钥模块
此程序段实现导入的加密密钥的功能。这里的密钥是预先存好的,放在一个以 .pk为扩展名的文本文件中,只需要到给定的路径取出即可,取路径的功能通过GetPathName( )实现。在此功能模块中用到了CBigInt类提供的Get函数,给pk和n赋值。
 
    void CMyRSADlg::OnImportPK()                 //导入加密密钥
{
              CFileDialog imp_pk_dlg(TRUE,"pk",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Public key files (*.pk)|*.pk");
       if(imp_pk_dlg.DoModal()==IDOK){
//弹出导入加密密钥的对话框
              CString file_path=imp_pk_dlg.GetPathName();   //得出加密密钥的路径
              CFile fpk(file_path,CFile::modeRead);
              char temp;
              m_strPK.Empty();
              while(true){
                     fpk.Read(&temp,1);
                     if(temp!=0x0D)
                            m_strPK.Insert(m_strPK.GetLength(),temp);
                     else
                            break;
              }
              fpk.Read(&temp,1);                                            
              m_strN.Empty();
              while(true){
                     fpk.Read(&temp,1);
                     if(temp!=0x0D)
                            m_strN.Insert(m_strN.GetLength(),temp);
                     else
                            break;
              }
              UpdateData(FALSE);                     // 刷新
              pk.Get(m_strPK);                        // m_strPK的值为加密密钥
              n.Get(m_strN);                          // m_strN的值为模数N
       }           
}
4.4.3选择文件模块
这段程序实现了选择欲加密的文本文件的功能。此模块导入的文本文件是事先存放在本机上的,通过GetPathName()函数得到存放文本文件的路径。
 
void CMyRSADlg::OnImportFile()
{
       // TODO: Add your control notification handler code here
             CFileDialog imp_f_dlg(TRUE);
       if(imp_f_dlg.DoModal()==IDOK){
//得到需要加密的文件的路径
             m_strF=imp_f_dlg.GetPathName();                            UpdateData(FALSE);
       }
}
4.4.4加密模块
此模块主要是实现了对文本文件进行加密的功能。在加密的时候运用了加密模块encrypt(dig,n,pk),加密文本文件。基于模块的友好性考虑,如果在用户没有导入私钥时就要求加密时,会弹出“请导入私钥”的提示信息。
void CMyRSADlg::OnEncrypt()
{
             if(m_strPK.IsEmpty()){
MessageBox("请导入私钥",NULL,MB_ICONERROR|MB_OK);   //如果没有填写加密密钥弹出的提示信息
             return;
       }   
       unsigned char digest[100];
       FILE* file;
       if(!(file=fopen(LPCTSTR(m_strF),"rb"))){
             MessageBox("无法打开文件!");
             return;
       }   
       fread(digest, 1, 100, file);
       fclose(file);
       dig.Mov(0);
       for(int j=0;j<25;j++){
             memcpy(&dig.m_ulValue[j],&digest[j*4],4);
       }
       dig.m_nLength=25;
       CRsa enc;
       sig.Mov(enc.encrypt(dig,n,pk));        
  //调用CBigInt类中的函数encrypt()进行加密
       sig.Put(m_strCipher);               
       UpdateData(FALSE);                    //显示密文
}
4.4.5导入解密密钥模块
此程序段实现导入解密密钥的功能。这里的密钥是预先存好的,放在一个以 .sk为扩展名的文本文件中,只需要到给定的路径取出即可,通过GetPathName()函数得到路径。在此模块中也调用了CBigInt类提供的Get函数,给sk和n赋值。
void CMyRSADlg::OnImportSK()
{
             CFileDialog imp_uk_dlg(TRUE,"sk",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPR
OMPT,"Secret key files (*.sk)|*.sk");   
        if(imp_uk_dlg.DoModal()==IDOK){
             CString file_path=imp_uk_dlg.GetPathName();
             CFile fuk(file_path,CFile::modeRead);
             char temp;
             m_strSK.Empty();
             while(true){
                    fuk.Read(&temp,1);
                    if(temp!=0x0D)
                           m_strSK.Insert(m_strSK.GetLength(),temp);
                    else
                           break;
             }
             fuk.Read(&temp,1);
             m_strN.Empty();
             while(true){
                    fuk.Read(&temp,1);
                    if(temp!=0x0D)
                           m_strN.Insert(m_strN.GetLength(),temp);
                    else
                           break;
             }
             fuk.Close();
             UpdateData(FALSE);
             sk.Get(m_strSK);                  // m_strSK的值为加密密钥
             n.Get(m_strN);                    // m_strN的值为模数N
       }
}
4.4.6生成明文
在这个模块中,用decrypt(sig,n,sk)来解密密文,由于所给的大整数类的输出是国标(GB)码的逆序值,用charver()函数对所得明文在输出前做了一下处理,使其输出为文字、数字和汉字。
GB 即"国标"的汉语拼音缩写,为中华人民共和国国家标准的意思.国标编码就是中华人民共和国信息交换汉字编码标准(GB2312-80),在此标准中制定了每一个汉字及非汉字符号的编码。规定将汉字字符分为87个区,每个区有94个汉字(94位),因此共制定了87x94=8178个汉字、字符。每一个字符的编码由2个字节(Byte,一个字节有8位--Bit, 可以有256种不同表示)构成(分别称为高字节和低字节),其值分别为其区位码值各加上32(既16进制的20H),方便起见把这称作国标码,则国标码所覆盖的范围为2121H-777EH。
生成明文模块的代码实现:
CMyRSADlg::OnDecrypt()
{
       sig.Get(m_strCipher);
       CRsa cer;
       sig.Mov(cer.decrypt(sig,n,sk));
       CString m_strtemp;
       sig.Put(m_strtemp);
 
       /*对于字符的处理*/
       char* pc = m_strtemp.GetBuffer(110);
       charver(pc);
       m_strPlain=pc;
             UpdateData(FALSE);
}
 
//函数charver()实现对上面输出的GB码明文的转换
void charver(char *str)             
{
       char result[110];
       char *p,*q;
       char temp1,temp2,temp=0;
       int i=0;
       q=str;
       p=str;
 
while(*p!=''\0'')           
p++;
p=p-1;
       while(p>=q)
       {
             if(!(*p>=''0''&&*p<=''9'')) temp1=*p-''A''+10; else temp1=*p-''0''
             p--;
           if(!(*p>=''0''&&*p<=''9'')) temp2=*p-''A''+10; else temp2=*p-''0''
             p--;
                    if(temp1==12&&temp2==12&&temp==-52) break;
             temp=temp1+temp2*16;
             result[i]=temp;
             i++;        }
       result[i]=''\0'';
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT

本文选自计算机毕业设计http://myeducs.cn
论文文章部分只是部分简介,如需了解更多详情请咨询本站客服!QQ交谈QQ3710167

原创论文

设为首页 | 加入收藏 | 论文首页 |原创论文 |
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师