AES не работает должным образом в функциях StringSource и StringSink в Qt

У меня есть использование 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» или «маленький» размер) и иногда работает неправильно. я не понимаю, какая из причин привела к этой проблеме?

  • Даже, я устанавливаю некоторую строку ввода напрямую (не считывая из файла) и снова не удается!

С уважением!

2

Решение

Я мог бы быть твоим plain, если он содержит «\ 0». Попробуйте передать как данные, так и длину:

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

Другие решения

Я хотел бы рассмотреть доработку функции:

// 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-гаджетов, которые не имеют много оперативной памяти.

Вы также можете рассмотреть возможность использования Режим аутентифицированного шифрования обеспечить как конфиденциальность, так и подлинность.

1

Я заменяю приведенное ниже заявление:

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());

Я делаю эти инструкции для разделов шифрования и дешифрования.

0
По вопросам рекламы [email protected]