以下是一个使用 Qt C++ 实现 DES 加密/解密 的完整示例代码。DES(Data Encryption Standard)是一种对称加密算法,这里通过调用 OpenSSL 库来实现核心功能。
1. 准备工作
确保你的系统已安装 OpenSSL 库:
- Ubuntu/Debian:
sudo apt-get install libssl-dev
- Windows: 下载 OpenSSL for Windows 并配置环境变量
在 Qt 项目的 .pro
文件中添加 OpenSSL 链接:
LIBS += -lssl -lcrypto
2. DES 加密/解密实现代码
#include <QCoreApplication>
#include <QDebug>
#include <openssl/des.h>
#include <openssl/rand.h>
// DES ECB模式加密 (64位密钥)
QByteArray des_encrypt(const QByteArray &data, const QByteArray &key) {
if (key.size() != 8) {
qCritical() << "DES key must be 8 bytes!";
return QByteArray();
}
DES_cblock desKey;
memcpy(desKey, key.constData(), 8);
DES_key_schedule keySchedule;
DES_set_key_unchecked(&desKey, &keySchedule);
// PKCS5Padding填充
int padding = 8 - (data.size() % 8);
QByteArray paddedData = data;
paddedData.append(padding, static_cast<char>(padding));
QByteArray encrypted(paddedData.size(), '\0');
for (int i = 0; i < paddedData.size(); i += 8) {
DES_ecb_encrypt(
reinterpret_cast<const_DES_cblock*>(paddedData.constData() + i),
reinterpret_cast<DES_cblock*>(encrypted.data() + i),
&keySchedule,
DES_ENCRYPT
);
}
return encrypted.toBase64(); // Base64编码输出
}
// DES ECB模式解密
QByteArray des_decrypt(const QByteArray &encryptedData, const QByteArray &key) {
if (key.size() != 8) {
qCritical() << "DES key must be 8 bytes!";
return QByteArray();
}
// Base64解码
QByteArray decoded = QByteArray::fromBase64(encryptedData);
DES_cblock desKey;
memcpy(desKey, key.constData(), 8);
DES_key_schedule keySchedule;
DES_set_key_unchecked(&desKey, &keySchedule);
QByteArray decrypted(decoded.size(), '\0');
for (int i =0; i < decoded.size();i+=8){
const unsigned char *in=reinterpret_cast<const unsigned char*>(decoded.constData()+i);
unsigned char *out=reinterpret_cast<unsigned char*>(decrypted.data()+i);
::DES_ecb_encrypt((const_DES_cblock*)in,(DES_cblock*)out,&schedule,DES_DECRYPT);
}
// PKCS5Padding去除填充
int pad=static_cast<int>(decrypted.back());
decrypted.chop(pad);
return decrypted;
}
int main(int argc ,char *argv[]){
::QCoreApplication app(argc ,argv);
QString plaintext="Hello,DES!";
QString secretKey="12345678"; //必须为8字节
qDebug()<<"Original:"<<plaintext;
auto encrypted=::des_encrypt(plaintext.toUtf8(),secretKey.toUtf8());
qDebug()<<"Encrypted(Base64):"<<encrypted;
auto decrypted=::des_decrypt(encrypted ,secretKey .toUtf8());
qDebug()<<"Decrypted:"<<QString::fromUtf8(decrypted );
return app.exec();
}
3.关键点说明
- 密钥长度:DES密钥必须是8字节(64位)。
- 工作模式:示例使用ECB模式(简单但不安全),实际项目建议改用CBC或更安全的AES。
- 数据填充:采用PKCS5/PKCS7填充,确保数据长度为8的倍数。
- OpenSSL API:
DES_set_key_unchecked()
:设置密钥。DES_ecb_encrypt()
:执行ECB模式的加密/解密。
4.运行结果示例
Original: "Hello,DES!"
Encrypted(Base64): "k3F4jR9XZzA="
Decrypted: "Hello,DES!"
如果需要更安全的加密方案(如AES-256),可以参考类似方法调用OpenSSL的AES_*
系列函数。
内容由零声教学AI助手提供,问题来源于学员提问