我在 Qt 中使用了 Crypto ++ 库,因为在AES
模式下使用CBC
方法加密了一个字符串,并使用StringSource
和StringSink
来定义input
和output
字符串参数。
首先,我从文件(“unicode”或“ASCII”编码)读取所有字节,然后在input
函数中将其设置为StringSource
参数,然后将参数设置为string
(数据类型)以输出(密文)。我只想得到一个字符串,并用“aes-cbc”对其进行加密并显示输出。
另外,我知道FileSource
和FileSink
是用于将数据写入文件的两个函数(包括input
和output
流参数)!但是我想读取文件内容作为输入字符串。
我的代码:
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();
}
现在我有波纹管问题:
StringSource
中的输入时,生成的密码将是不完整的(例如320字节)strlen(cipher.c_str())
导致cipher.size()
的输出有所不同问候!
最佳答案
如果它包含'\ 0',则可以是您的plain
。尝试同时传递数据和长度:
StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));