Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь по QtCrypto, Некорректно работает 3DES 
:(
    Опции темы
xfoxtrot
Дата 8.8.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Доброго времени суток, форумчане.

Возникла проблема с 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();
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1765 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.