355上位机VC MFC利用外部库实现RSA加密解密
实现RSA加密解密
功能展示
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准,RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。我们当前例程利用开源库实现RSA的加密与解密功能,效果如图,输入要加密的文本点击<加密左侧文件>例程会对文本进行加密并将加密后密文显示出来,点击解密,例程会用已知私有密钥将密文解密并显示
要点提示
例程使用的是第三方开源库Crypto++,5.4版本,可以官网下载,下载后进行编译获得静态库cryptlib.lib,例程已将此库及头文件一并复制到根目录文件夹encrypt内,在编写自己的项目时,只要复制此文件夹到工程目录就可;
例程主要通过自编写的两函数实现RSA加密解密功能;
string RSAEncryptString(const char*pubFileName,const char*seed,const char*message);
pubFileName为已知的公有密码。
Seed为加密用KEY;
Message为要加密的文本内容;
返回值为string 类型的已处理的加密密文;
string RSADecryptString(const char*priFileName,const char*ciphertext);
riFileName为已知的私有密文;
Ciphertext为要解密的密文;
返回值为string类型的文本内容
实现功能
1.新建基于对话框的应用程序
2.将例程根目录文件夹encrypt复制到自己工程根目录,以便调用第三方库内部API函数;
3.在主对话框类头文件添加头文件及库等信息
#include"encrypt/randpool.h"
#include"encrypt/rsa.h"
#include"encrypt/hex.h"
#include"encrypt/files.h"
#pragma comment(lib,"encrypt/cryptlib.lib")
using namespace CryptoPP;
#include<iostream>
using namespace std;
并添加四个成员函数及三个变量及初始化三个变量
public:
void GenerateRSAKey(unsigned int nKeyLength,const char*priFileName,const char*pubFileName,const char*seed);
string RSAEncryptString(const char*pubFileName,const char*seed,const char*message);
string RSADecryptString(const char*priFileName,const char*ciphertext);
RandomPool &GlobalRNG();
char m_cPubPassword[128];
char m_cPriPassword[128];
char m_cSeed[1024];
strcpy(m_cPubPassword,"PublicPassword");
strcpy(m_cPriPassword,"PrivatePassword");
strcpy(m_cSeed,"seed");
GenerateRSAKey(1024, m_cPriPassword, m_cPubPassword, m_cSeed);//将缓冲区编码
4.依照例程界面添加编辑框IDC_EDIT3,IDC_EDIT1,IDC_EDIT5分别用于要加密文件的输入,已加密密文的显示,解密后文本显示;再添加两按钮<加密左侧文本><私有密钥解密上面密文>关联按钮的点击函数实现加密与解密功能
void CGkbc8Dlg::OnButton1()//加密
{
CString sText;
GetDlgItemText(IDC_EDIT3,sText);
if(sText.IsEmpty())
return;
string encryptedText = RSAEncryptString(m_cPubPassword, m_cSeed, sText); // RSA 加密
SetDlgItemText(IDC_EDIT1,encryptedText.c_str());
}
void CGkbc8Dlg::OnDecrypt()
{
CString sEncryptedText,sPriPassword;
GetDlgItemText(IDC_EDIT1,sEncryptedText);
if(sEncryptedText.IsEmpty())
return;
string decryptedText = RSADecryptString(m_cPriPassword,sEncryptedText); // RSA 解密
SetDlgItemText(IDC_EDIT5,decryptedText.c_str());
}
我们来演示下功能实现的整个过程
|