下面的代码是我写的初版,后面增加了公钥解密,私钥解密,以及分段加密解密的功能,有需要的朋友可以
本篇文章的RSA加密用的openssl
网上对于该工具大部分是先下载下来再包含到目录里,QT本身在安装时可以选择安装openssl工具
此篇文章就是介绍如何使用QT自带的openssl工具实现RSA加密
此方法为自己研究的,如果您有更好的方法,欢迎留言交流
1.在安装QT时,记得勾选openss工具
2.创建项目GetMachineCode,找到QT目录下的D:\Qt\Tools\OpenSSL\Win_x64,在里面的bin目录中找到libcrypto-1_1-x64.dll,
libssl-1_1-x64.dll,lib目录下找到libcrypto.lib,libssl.lib,复制这四个文件,将其拷贝到项目文件的debug目录下
3.打开属性页,在包含目录中添加openssl的include文件夹,在库目录中添加debug\文件夹
4.在链接器的输入中添加附加依赖项
5.配置完成,点击应用
6.在使用RSA加密的文件中,应包含以下头文件
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "openssl/bn.h"
#include "openssl/bio.h"
#include "openssl/evp.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
7.公钥加密代码样例
QString GetMachineCode::rsaPubDecrypt(const QString& data)
{
//公钥加密 (使用自己生成的公秘钥) //注意:公钥的头尾为public
char public_key[] =
"-----BEGIN PUBLIC KEY-----\n"\
"你自己的密钥\n"\
"你自己的密钥\n"\
"你自己的密钥\n"\
"-----END PUBLIC KEY-----";
BIO* pKeyBio = BIO_new_mem_buf(public_key, strlen(public_key));
if (pKeyBio == NULL) {
return "";
}
RSA* pRsa = RSA_new();
pRsa = PEM_read_bio_RSA_PUBKEY(pKeyBio, &pRsa, NULL, NULL);
if (pRsa == NULL) {
BIO_free_all(pKeyBio);
return "";
}
int nLen = RSA_size(pRsa);
char* pEncryptBuf = new char[nLen];
memset(pEncryptBuf, 0, nLen);
QByteArray clearDataArry = data.toUtf8();
int nClearDataLen = clearDataArry.length();
uchar* pClearData = (uchar*)clearDataArry.data();
int nSize = RSA_public_encrypt(nClearDataLen,
pClearData,
(uchar*)pEncryptBuf,
pRsa,
RSA_PKCS1_PADDING);
QString strEncryptData = "";
if (nSize >= 0) {
QByteArray arry(pEncryptBuf, nSize);
strEncryptData = arry.toBase64();
}
// 释放内存
delete pEncryptBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
return strEncryptData;
}
私钥解密代码样例
QString frmMain::rsaPriDecrypt(const QString &data)
{
//私钥解密
char private_key[] =
"-----BEGIN RSA PRIVATE KEY-----\n"\
"你的私钥\n"\
"你的私钥\n"\
"你的私钥\n"\
"-----END RSA PRIVATE KEY-----";
BIO* pKeyBio = BIO_new_mem_buf(private_key, strlen(private_key));
if (pKeyBio == NULL) {
return "";
}
RSA* pRsa = RSA_new();
pRsa = PEM_read_bio_RSAPrivateKey(pKeyBio, &pRsa, NULL, NULL);
if (pRsa == NULL) {
BIO_free_all(pKeyBio);
return "";
}
int nLen = RSA_size(pRsa);
char* pClearBuf = new char[nLen];
memset(pClearBuf, 0, nLen);
//解密
QByteArray decryptDataArry = data.toUtf8();
decryptDataArry = QByteArray::fromBase64(decryptDataArry);
int nDecryptDataLen = decryptDataArry.length();
uchar* pDecryptData = (uchar*)decryptDataArry.data();
int nSize = RSA_private_decrypt(nDecryptDataLen,
pDecryptData,
(uchar*)pClearBuf,
pRsa,
RSA_PKCS1_PADDING);
QString strClearData = "";
if (nSize >= 0) {
strClearData = QByteArray(pClearBuf, nSize);
}
// 释放内存
delete pClearBuf;
BIO_free_all(pKeyBio);
RSA_free(pRsa);
return strClearData;
}