У меня есть использование Crypto ++ библиотека в Qt из-за шифрования строки AES
метод в CBC
режим и использование StringSource
а также StringSink
определить input
а также output
строковые параметры.
Сначала я читаю все байты из файла (кодировка «Юникод» или «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();
}
Теперь у меня есть следующие проблемы:
Когда я читаю содержимое компактного файла (например, 900 байт) и устанавливаю его как вход в StringSource
сгенерированный шифр будет неполным (например, 320 байт)
Выход из strlen(cipher.c_str())
отличается от cipher.size()
в «QMessageBox»
Мой код работает по-настоящему, когда я читаю некоторые файлы («Unicode» или «ASCII», «Larg» или «маленький» размер) и иногда работает неправильно. я не понимаю, какая из причин привела к этой проблеме?
С уважением!
Я мог бы быть твоим plain
, если он содержит «\ 0». Попробуйте передать как данные, так и длину:
StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));
Я хотел бы рассмотреть доработку функции:
// Improve this in real life
QByteArray key = "qwertyuiopasdfgh";
QByteArray iv = "wertyuiopasdfghj"
std::string infile("/home/msi/Desktop/input.txt");
std::string outfile("/home/msi/Desktop/output.enc");
CBC_Mode<AES>::Encryption encryptor(key.constData(), key.size(), iv.constData());
FileSource fs(infile.c_str(), true, new StreamTransformationFilter(encryptor, new FileSink(outfile.c_str())));
С использованием FileSource
а также FileSink
избегает проблем с попыткой интерпретировать данные под набором символов. Это также экономит на дополнительных копиях, и это более удобно для мобильных устройств и IoT-гаджетов, которые не имеют много оперативной памяти.
Вы также можете рассмотреть возможность использования Режим аутентифицированного шифрования обеспечить как конфиденциальность, так и подлинность.
Я заменяю приведенное ниже заявление:
StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));
С ревом:
StringSource(plain, true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));
Затем я снова перестроил программу, но проблема все еще была!
я временно удалите все символы «\» из открытого текста и снова скомпилируйте, после этого выходной шифр действительно показывался в «QMessageBox» с cipher.size()
заявление.
затем заменить
fo.write(cipher.c_str(), cipher.size());
с :
fo.write(cipher.c_str());
Я делаю эти инструкции для разделов шифрования и дешифрования.