2016-07-18 7 views
2

Я с численной Crypto ++ библиотеки в Qt из-за зашифровать строку с AES методом в режиме CBC и использование StringSource и StringSink определить input и output строковые параметры ,AES не работает должным образом в функции StringSource и StringSink в Qt

Во-первых, я прочитал все байты из файла («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(); 
} 

Теперь у меня есть гофрированные проблемы:

  • Когда я прочитал содержание компактного файла (например, 900 байт) и установить его в качестве входных данных в StringSource, сгенерированный шифр будет неполным (например, 320 байт)

  • Выход strlen(cipher.c_str()) отличается по cipher.size() в "QMessageBox"

  • Мой код работает действительно Когда я читаю некоторые файлы («unicode» или «ASCII», «большой» или «маленький» размер), а иногда и некорректно работает. Я не понимаю, какая причина вызвала эту проблему?

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

С уважением!

+0

'QByteArray plain;' и 'StringSource (plain, true, ...);' должен вызывать сбой компиляции. 'StringSource' does * not * имеет ctor, который принимает' QByteArray'. Вероятно, вы должны добавить '-Wall -Wextra' для своих флагов компиляции. – jww

ответ

1

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

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

Я тестирую файл без '\ 0' и передаю 'data' и' length', но не работает по-настоящему! –

+0

теперь что я могу сделать? –

+0

Спасибо! вы решаете мою проблему до 60% –

0

я заменить сильфон заявление:

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

* "... заменить' fo.write (cipher.c_str(), cipher.size()); 'с' fo.write (cipher.c_str()); '..." * - вы, вероятно, усекаетесь ваш шифрованный текст на первом встроенном символе NULL. Это означает, что вы восстановите часть своего обычного текста. – jww

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, которые не имеют большого количества оперативной памяти.

Вы также можете рассмотреть возможность использования Authenticated Encryption mode для обеспечения конфиденциальности и достоверности.

 Смежные вопросы

  • Нет связанных вопросов^_^