Russian Qt Forum
Ноябрь 23, 2024, 17:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нужна помощь по QtCrypto  (Прочитано 5439 раз)
xfoxtrot
Гость
« : Август 08, 2009, 04:12 »

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

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

Записан
nextdrift
Гость
« Ответ #1 : Июнь 11, 2013, 02:22 »

Всё ищу пример 3DES... На Qt... Наткнулся на это )))

Проблему нашёл в том, что число символов не совсем кратно 8  Улыбающийся

Т.е. "Login|PASSWORD" - 14 (8 + 6) байт. Для успешной работы - нужно добавить ещё 2 байта (например 2 пробела), тогда всё будет отлично Улыбающийся 8 + 8
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 21.