hyz23je 2025-01-10 16:48 采纳率: 94.4%
浏览 9
已结题

C#与C++QTT在使用AES128时得到的结果不一样

RT,C++QT使用AES128加密得到的结果与C#加密得到的结果不一样

public string AesEncrypt128()
        {
            // 需要加密的数据
            string waitEncrypptData = "abcd"; // 待加密数据
            string key = "1234567890123456";     // 密钥,长度为16字节
            string iv = "1234567890123456";      // 初始向量,长度为16字节

            // 将密钥和IV转换为字节数组(UTF-8编码)
            byte[] byteKEY = Encoding.UTF8.GetBytes(key);
            byte[] byteIV = Encoding.UTF8.GetBytes(iv);
            // 将待加密数据转换为字节数组(UTF-8编码)
            byte[] byteContnet = Encoding.UTF8.GetBytes(waitEncrypptData);


            // 使用 AES 加密
            var _aes = new RijndaelManaged();
            _aes.Padding = PaddingMode.PKCS7;  // 填充模式
            _aes.Mode = CipherMode.CBC;       // CBC模式
            _aes.KeySize = 128;
            _aes.Key = byteKEY;  // 设置密钥
            _aes.IV = byteIV;    // 设置初始化向量

            // 创建加密器
            var _crypto = _aes.CreateEncryptor(byteKEY, byteIV);

            // 执行加密
            byte[] encrypted = _crypto.TransformFinalBlock(byteContnet, 0, byteContnet.Length);
            _crypto.Dispose();

            // 打印加密后的结果
            string encryptedBase64 = Convert.ToBase64String(encrypted);
            Console.WriteLine("加密后的Base64: " + encryptedBase64);

            // 返回加密后的Base64字符串
            return encryptedBase64;

        }

C#加密后得到的结果是:nzh0d+jfgbdFIHF82Hzv6w==

下面提C++QT中的代码

QString CommonFuncClass::AESEncode()
{
    QByteArray content = "abcd";
    QString key = "1234567890123456";
    QString iv= "1234567890123456";
        
    // 判断值必要的值是否已经存在
    if(content.length() == 0 || key.length() == 0 || iv.length() == 0)return "";

    // 判断key和iv的长度是否相等
    if(key.length() != iv.length())return "";
    // 把内容进行16进制转换
    QByteArray bytesAarray16 = content.toHex();

    // 开始对数据进行加密
    QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CBC,QAESEncryption::PKCS7);
    QByteArray encodeText = encryption.encode(bytesAarray16, key.toLocal8Bit(), iv.toLocal8Bit());
    QString result = encodeText.toBase64().data();


    // 返回字符串
    return result;
}

C++QT加密后得到的结果是:tp7xmluTA+IsXKjk4iHX2A==
C++QT使用的是第三方的库,该库专门用于QT加密的

有没有人知道这是为什么呢?

  • 写回答

2条回答 默认 最新

  • GISer Liu 2025-01-10 18:48
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    用户在C#和C++ QT中使用AES-128加密相同的明文数据,但得到的加密结果不同。具体来说,C#的加密结果为nzh0d+jfgbdFIHF82Hzv6w==,而C++ QT的加密结果为tp7xmluTA+IsXKjk4iHX2A==。用户怀疑是C++ QT中使用的第三方库(QAESEncryption)与C#的加密实现不一致导致的。

    关键点分析

    1. 加密参数一致性

      • 密钥(Key)和初始化向量(IV)的长度和内容必须一致。
      • 加密模式(CBC)和填充模式(PKCS7)必须一致。
      • 加密算法(AES-128)必须一致。
    2. 数据编码

      • 在C#中,明文数据直接使用UTF-8编码转换为字节数组。
      • 在C++ QT中,明文数据先转换为16进制字符串再进行加密。
    3. 第三方库的使用

      • C++ QT使用的是QAESEncryption库,该库的加密实现可能与C#的RijndaelManaged类有所不同。

    解决方案

    1. 确保数据编码一致

      • 在C++ QT中,明文数据不应先转换为16进制字符串,而应直接使用UTF-8编码转换为字节数组。
    2. 检查第三方库的实现

      • 确保QAESEncryption库的加密参数与C#一致,特别是填充模式和加密模式。
    3. 修改C++ QT代码

      • 去掉明文数据的16进制转换步骤,直接使用UTF-8编码进行加密。

    修改后的C++ QT代码

    QString CommonFuncClass::AESEncode()
    {
        QByteArray content = "abcd";
        QString key = "1234567890123456";
        QString iv = "1234567890123456";
        
        // 判断必要的值是否已经存在
        if(content.length() == 0 || key.length() == 0 || iv.length() == 0) return "";
    
        // 判断key和iv的长度是否相等
        if(key.length() != iv.length()) return "";
    
        // 开始对数据进行加密
        QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CBC, QAESEncryption::PKCS7);
        QByteArray encodeText = encryption.encode(content, key.toLocal8Bit(), iv.toLocal8Bit());
        QString result = encodeText.toBase64().data();
    
        // 返回字符串
        return result;
    }
    

    解释

    1. 去掉16进制转换

      • 原代码中content.toHex()将明文数据转换为16进制字符串,这会导致加密的输入数据与C#不一致。去掉这一步后,明文数据直接使用UTF-8编码进行加密。
    2. 确保加密参数一致

      • QAESEncryption库的加密模式(CBC)和填充模式(PKCS7)与C#的RijndaelManaged类一致。

    验证

    修改后的C++ QT代码应与C#代码产生相同的加密结果。如果仍然不一致,可能需要进一步检查QAESEncryption库的实现细节,确保其与C#的加密算法完全一致。

    参考

    通过以上修改,C++ QT的加密结果应与C#的加密结果一致。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月10日