网学网VC与C++类别编辑为广大网友搜集整理了:基于VC++实现的RSA算法加密和解密运算绩等信息,祝愿广大网友取得需要的信息,参考学习。
客服咨询,网学网竭诚为您服务,本站永久域名: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 |