Доброго времени суток, форумчане.
Возникла проблема с QtCrypto (Версия QT 4.5.1, qca-2.0 установлен и внедрен в QT с плагином qca-ossl-2.0.0-beta3)
Задача у меня - закодировать строку с помощью QCA::Cipher алгоритмом 3DES (ECB), получить её хэш-код и раскодировать обратно.
Трабла заключается в том, что я получаю хэш-код только половины строки, остальная часть хэш-кода заполняется нулями, чипер выдает false на метод ok(), когда я хочу получить вторую часть хэш-кода методом Cipher.final().
Пример:
b42af4ac94330bef90e49f616c4e9b79 - успешное хэширование
b42af4ac94330bef0000000000000000 - то, что получается у меня
На сколько я понимаю, по алгоритму 3DES хэш должен быть равен 16-и байтам, а QT по умолчанию выставляет всего 8 байт. В конструкторе чипера можно выставить смещение блоков ответа (0, 8 или 16 байт, в зависимости от алгоритма шифрования), при попытке выставить смещение на 16 байт, прога вылетает "с требованием отправить отчет" :(
Помогите плз побороть эту траблу, 2 дня уже мучаюсь :( Вот исходник:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QtCrypto>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QCA::Initializer init;
// Смотрим, доступен ли такой алгоритм... У меня выдает true
qDebug() << QCA::isSupported("tripledes-ecb");
QCA::SecureArray arg = "Login|PASSWORD";
QByteArray Arr = "IGHAJQUS00LY830XXXXXXXXX";
QCA::SymmetricKey key(Arr);
QCA::InitializationVector iv(16); // Создание вектора, но в ECB, как я понял, он не нужен
QCA::Cipher cipher(QString("tripledes"),QCA::Cipher::ECB,
// Здесь мы ставим смещение (NoPadding = 0, DefaultPadding = 1 (8байт), PKCS7 (16 байт)
QCA::Cipher::DefaultPadding,
// Флаг кодирования / раскодирования
QCA::Encode,
key, iv);
qDebug() << cipher.padding();
QCA::MemoryRegion Region(arg);
// Здесь мы получаем первую часть хэш-кода
QCA::SecureArray u = cipher.update(Region);
if (!cipher.ok())
//qDebug() << "Update failed";;
// Выводим первую часть хэш-кода
qDebug() << "3DES encryption is " << arg.data() << " " << QCA::arrayToHex(u.toByteArray());
// Здесь по идее должна быть получена вторая часть хэш-кода, но она заполняется нулями
QCA::SecureArray f = cipher.final();
// Здесь у меня выводится false, т.к. final() успешно не завершился
if (!cipher.ok())
qDebug() << "Final failed";
// Выводим вторую часть ответа (у меня - нули)
qDebug() << "Final block for AES128 encryption is " << QCA::arrayToHex(f.toByteArray());
// Устанавливаем чипер на раскодирование
cipher.setup( QCA::Decode, key, iv);
// Здесь по идее складываем первую и вторую часть хэш-кода
QCA::SecureArray cipherText = u.append(f);
QCA::SecureArray plainText = cipher.update(cipherText);
if (!cipher.ok())
qDebug() << "Update failed\n";
qDebug() << "Decryption using AES128 of [0x%s] is " << QCA::arrayToHex(cipherText.toByteArray()), plainText.data();
plainText = cipher.final();
// Т.к. вторая часть хэша заполнена нулями, final() выполняется успешно
if (!cipher.ok())
qDebug() << "Final failed\n";
qDebug() << "Final decryption block using AES128" << plainText.data();
// Здесь выводим целиковую раскодированную строку, но отображается нормально только первая половина строки, вторая - ненужные символы ((
qDebug() << "One step decryption using AES128: " << QCA::SecureArray(cipher.process(cipherText)).data();
return a.exec();
}
Всё ищу пример 3DES... На Qt... Наткнулся на это )))
Проблему нашёл в том, что число символов не совсем кратно 8 :)
Т.е. "Login|PASSWORD" - 14 (8 + 6) байт. Для успешной работы - нужно добавить ещё 2 байта (например 2 пробела), тогда всё будет отлично :) 8 + 8