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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QCA::Cipher.final  (Прочитано 3632 раз)
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

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

Если нужно приведу код. Просто там строк 50 сразу не буду писать. В какие стороны можно смотреть и чем можно воспользоваться?
Записан
carrygun
Гость
« Ответ #1 : Ноябрь 28, 2012, 05:28 »

Воспользоваться дебаггером и смотреть что в списке. Сам же знаешь что он ломается из-за выхода за границы списка. Посмотри что в нем и что ты хочешь достать.
Записан
Eretic
Гость
« Ответ #2 : Ноябрь 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 которая пустая.
Записан
carrygun
Гость
« Ответ #3 : Ноябрь 28, 2012, 14:01 »

Значит надо смотреть как заполняется твой "res". Я то не телепат.
Записан
Eretic
Гость
« Ответ #4 : Ноябрь 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/Режим_шифрования

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

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

Спасибо. Можно закрывать тему.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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