怎么做
bool enCodeSingleData(QString& qsText)
{
QFile publicKeyFile("..\\config\\public_key.pem");
if (!publicKeyFile.open(QIODevice::ReadOnly))
{
return false;
}
QByteArray publicKeyData = publicKeyFile.readAll();
publicKeyFile.close();
// 将公钥文件中的数据读取为RSA结构
RSA *publicKey = nullptr;
BIO *bio = BIO_new_mem_buf(publicKeyData.data(), -1);
PEM_read_bio_RSA_PUBKEY(bio, &publicKey, nullptr, nullptr);
BIO_free(bio);
if (!publicKey)
{
return false;
}
// 加密
QString qsRaw = qsText;
QByteArray originalText = qsRaw .toUtf8();
QByteArray encryptedText = encryptRSA(originalText, publicKey);
qsText = QString::fromUtf8(encryptedText.toBase64());
// 释放内存
RSA_free(publicKey);
return true;
}
QByteArray encryptRSA(const QByteArray &data, RSA *publicKey)
{
QByteArray encrypted;
// 计算加密后数据的长度
int flen = RSA_size(publicKey);
unsigned char *encryptedData = new unsigned char[flen];
// 加密
int result = RSA_public_encrypt(data.size(), reinterpret_cast<const unsigned char*>(data.constData()), encryptedData, publicKey, RSA_PKCS1_PADDING);
if (result != -1)
{
encrypted = QByteArray(reinterpret_cast<char*>(encryptedData), result);
}
delete[] encryptedData;
return encrypted;
}
如何用
QString qsText = "123123";
if (enCodeSingleData(qsText ))
{
// 对"123123"加密,加密结果在qsText
// 加密成功
}
else
{
// 加密失败
}