gpt4 book ai didi

c++ - AES 在 Qt 中的 StringSource 和 StringSink 函数中不能正常工作

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:28 24 4
gpt4 key购买 nike

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

首先,我从文件中读取所有字节(“unicode”或“ASCII”编码),然后将其设置为 StringSource 函数中的 input 参数,然后设置作为输出(密文)的 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 字节)

  • strlen(cipher.c_str()) 的输出与“QMessageBox”中的cipher.size() 不同

  • 我的代码真正工作 当我读取一些文件(“unicode”或“ASCII”、“larg”或“little”大小)时,有时工作不正确。不明白是什么原因造成的?

  • 甚至,我直接设置了一些输入字符串(不是从文件中读取)并再次失败!

问候!

最佳答案

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

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

关于c++ - AES 在 Qt 中的 StringSource 和 StringSink 函数中不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com