Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Eretic от Ноябрь 27, 2012, 21:07



Название: QCA::Cipher.final
Отправлено: Eretic от Ноябрь 27, 2012, 21:07
Приветствую всех кто зашёл в темку.

Очень прошу помочь.

По таймеру раз в 5 минут запускается метод. В нём считывается из файла строка, расшифровывается, немного меняется и записывается обратно в файл с шифрованием. Именно на методе QCA::Cipher.final при рашифровке прога падает, но не всегда. Может работать полчаса а может после 5 минут упасть. Пожалуйста помогите найти проблему или хотябы направить на путь истинный. Система Ubuntu 11.04.

Это вывод консольный:

Код:
write file3:  "–$Jz	Íar&nª—ƒwB=ÕD
ý-Sã윩Ò"
read file :  "–$Jz Íar&nª—ƒwB=ÕD
ý-Sã윩Ò"

write file3:  "üÌa씁ö·*˜ºzwÔåÒDÓÔÂC³éUg""
read file :  "üÌa씁ö·*˜ºzwÔåÒDÓÔÂC³éUg""

write file3:  "Ob‡ÊÒy±gÓsJî
ï½Ò¢¦Q'÷"
read file :  "Ob‡ÊÒy±gÓsJî
ï½Ò¢¦Q'÷"

decode:Final failed
ASSERT failure in QList<T>::at: "index out of range", file ../Desktop/Qt/4.8.1/gcc/include/QtCore/qlist.h, line 469
В лист у меня записываются значения вытянутые из строки. Но т.к. в ней ничего нет то получается такая ошибка.
Как видно из лога, что пишется и читается одинаковая строка . Но почему final ловит клина не понимаю.

Делаю всё точно как здесь: http://qtcoder.blogspot.ru/2010/02/qt-3.html (http://qtcoder.blogspot.ru/2010/02/qt-3.html)

Перед открытием файла проверяю можно ли. После записи сразу закрываю файл.

Если нужно приведу код. Просто там строк 50 сразу не буду писать. В какие стороны можно смотреть и чем можно воспользоваться?


Название: Re: QCA::Cipher.final
Отправлено: carrygun от Ноябрь 28, 2012, 05:28
Воспользоваться дебаггером и смотреть что в списке. Сам же знаешь что он ломается из-за выхода за границы списка. Посмотри что в нем и что ты хочешь достать.


Название: Re: QCA::Cipher.final
Отправлено: Eretic от Ноябрь 28, 2012, 13:01
Воспользоваться дебаггером и смотреть что в списке. Сам же знаешь что он ломается из-за выхода за границы списка. Посмотри что в нем и что ты хочешь достать.

В списке ничего нет. Список получается из строки которая приходит после расшифровки.
Код:
QCA::SecureArray u = cipher.update(arg);
    if (!cipher.ok())
    {
      return res;
    }

    QCA::SecureArray f = cipher.final();
    if (!cipher.ok())
    {
      return res;
    }
Здесь update отрабатывает нормально а после final возвращается строка res которая пустая.


Название: Re: QCA::Cipher.final
Отправлено: carrygun от Ноябрь 28, 2012, 14:01
Значит надо смотреть как заполняется твой "res". Я то не телепат.


Название: Re: QCA::Cipher.final
Отправлено: Eretic от Ноябрь 29, 2012, 09:28
Значит надо смотреть как заполняется твой "res". Я то не телепат.

При чём здесь заполнение res? Не проходит update или final. Если они не проходят то возвращается пустая строка. Значение в неё пишется после final.

P.S. Если не смотрел код по ссылке и нет дельного предложения не нужно набивать сообщения.

========================================

Проблему решил. Опишу может кому поможет.

Есть такой метод в документации:
Код:
virtual bool QCA::Cipher::ok ()const [virtual]

 Test if an update() or final() call succeeded.

Returns:
true if the previous call succeeded

Для методов же update и final есть булевые переменные(внутри QCA), которые они и заполняют(насколько я понял по дебагу, но особо не вдавался).
В какой то момент update не проходит и пишет false. Всё это внутри QCA и лезть туда смысла нет.

А вот фрагмент моего кода:
Код:
//содать 128 битный AES шифр объект используя CBC режим
    QCA::Cipher cipher(QString("aes128"),
    // ставится режим шифрования
    QCA::Cipher::CBC,
       //использовать отступ по умолчанию который эквивалентен PKCS7 для CBC
               QCA::Cipher::DefaultPadding,
               // этот объект будет зашифрован
               QCA::Encode,
               key, iv);

Подумал что нужно поиграться с параметрами.
Вот ссылочка:http://ru.wikipedia.org/wiki/Режим_шифрования (http://ru.wikipedia.org/wiki/Режим_шифрования)

После изменения режима, всё заработало и больше расшифровка клина не ловит.

P.S. причину не нашёл, но главное что в результате код написан и всё работает.

Спасибо. Можно закрывать тему.