ZBLOG

qt c++实现des加密

以下是一个使用 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.关键点说明

  1. 密钥长度:DES密钥必须是8字节(64位)
  2. 工作模式:示例使用ECB模式(简单但不安全),实际项目建议改用CBC或更安全的AES。
  3. 数据填充:采用PKCS5/PKCS7填充,确保数据长度为8的倍数。
  4. 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24004

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?