我在 Qt 中使用了 Crypto ++ 库,因为在AES模式下使用CBC方法加密了一个字符串,并使用StringSourceStringSink来定义inputoutput字符串参数。

首先,我从文件(“unicode”或“ASCII”编码)读取所有字节,然后在input函数中将其设置为StringSource参数,然后将参数设置为string(数据类型)以输出(密文)。我只想得到一个字符串,并用“aes-cbc”对其进行加密并显示输出。

另外,我知道FileSourceFileSink是用于将数据写入文件的两个函数(包括inputoutput流参数)!但是我想读取文件内容作为输入字符串。

我的代码:

void Widget::onEncryptButton()
{
    QByteArray key = "qwertyuiopasdfgh";
    QByteArray iv = "wertyuiopasdfghj"
    QByteArray plain;
    string cipher;

    QFile fi("/home/msi/Desktop/input.txt");
    QFile fo("/home/msi/Desktop/output.enc");

    fi.open(QFile::ReadOnly);
    fo.open(QFile::WriteOnly);
    plain = fi.readAll();

    AESEncryption aese((byte*)key.constData(), AES::DEFAULT_KEYLENGTH);    // default is 16
    CBC_Mode_ExternalCipher::Encryption encryptor(aese, (byte*)iv.constData());
    StringSource(plain, true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));

    QMessageBox::information(this, "", QString("%1, %2").arg(strlen(cipher.c_str())).arg(cipher.size()));    // just for viewing cipher length

    fo.write(cipher.c_str());
    fi.close();
    fo.close();
}

现在我有波纹管问题:
  • 当我读取压缩文件内容(例如900字节)并将其设置为StringSource中的输入时,生成的密码将是不完整的(例如320字节)
  • “QMessageBox”中的strlen(cipher.c_str())导致cipher.size()的输出有所不同
  • 我的代码真正起作用当我读取一些文件(“unicode”或“ASCII”,“larg”或“little”大小)并且有时无法正常工作时。我不明白是哪个原因引起了这个问题?
  • 甚至,我直接设置了一些输入字符串(不从文件读取),然后再次失败!

  • 问候!

    最佳答案

    如果它包含'\ 0',则可以是您的plain。尝试同时传递数据和长度:

    StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));
    

    07-25 22:36