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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QCA::Cipher странное поведение  (Прочитано 2476 раз)
Mish_ka
Гость
« : Май 15, 2011, 23:42 »

В общем написал по урокам функции шифрования и дешифрования а они работают не корректно. Точнее:

Если я передаю ему строчку 63 символа и меньше, он шифрует и дешифрует нормально.
Если же я ему передам строчку более 63 символов он отказывается корректно работать, шифрует, но не дешифрует.

Вот код.

Код
C++ (Qt)
p="123 ABC БЦА 11! 123 ABC БЦА 11! 123 ABC БЦА 11! 123 ABC БЦА 11!";//63символа
QString en=encrypt(p);
QString den=dencrypt(en);
p="Строчка:"+p+"\n Ен:"+en+"\n Ден:"+den;
uiR.textBrowser->setPlainText(p);

шифруем:
Код
C++ (Qt)
QString rrr::encrypt(const QString & strToEnrypt){
QCA::Initializer init;
QCA::SecureArray arg = QVariant(strToEnrypt).toByteArray();
if(QCA::isSupported("aes128-cbc-pkcs7")){
QCA::SymmetricKey key(QVariant("16").toByteArray());
QCA::InitializationVector iv(QVariant("16").toByteArray());
QCA::Cipher cipher(QString("aes128"),QCA::Cipher::CBC,
  QCA::Cipher::DefaultPadding,
  QCA::Encode,
  key, iv);
QCA::SecureArray u = cipher.update(arg);
QCA::SecureArray f = cipher.final();
QCA::SecureArray cipherText = u.append(f);
return cipherText.toByteArray();
}
return "NET";
}

дешифруем
Код
C++ (Qt)
QString rrr::dencrypt(const QString & strToEnrypt){
QCA::Initializer init;
QCA::SecureArray cipherText = QVariant(strToEnrypt).toByteArray();
if(QCA::isSupported("aes128-cbc-pkcs7")){
QCA::SymmetricKey key(QVariant("16").toByteArray());
QCA::InitializationVector iv(QVariant("16").toByteArray());
QCA::Cipher cipher(QString("aes128"),QCA::Cipher::CBC,
  QCA::Cipher::DefaultPadding,
  QCA::Decode,
  key, iv);
QCA::SecureArray plainText = cipher.update(cipherText);
plainText = cipher.final();
return QCA::SecureArray(cipher.process(cipherText)).data();
}
return "NET";
}

подскажите, что я не так сделал?
Записан
Mish_ka
Гость
« Ответ #1 : Май 15, 2011, 23:47 »

Если дописать в функцию шифрования алгоритм дешифровки то всё работает правильно, с любым количеством символов:

меняем строчку:
Код
C++ (Qt)
return cipherText.toByteArray();

на вот это:
Код
C++ (Qt)
cipher.setup( QCA::Decode, key, iv );
QCA::SecureArray plainText = cipher.update(cipherText);
plainText = cipher.final();
return cipherText.toByteArray()+" _ "+QCA::SecureArray(cipher.process(cipherText)).data();

и работает нормально...

В чём моя ошибка??

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Май 16, 2011, 12:49 »

Попробуй дешифровать так:


Код
C++ (Qt)
       .... Initialization here
 
QCA::SecureArray plainText = ciphe.update(QCA::SecureArray(data));
 
if (!cipher.ok()) {
qWarning("Update failed\n");
}
 
QCA::SecureArray result = cipher.final();
 
const bool ret = cipher.ok();
if (ok) {
*ok = ret;
}
 
plainText += result;
 
if (!ret) {
qWarning("Final failed\n");
return QByteArray();
}
 
return QByteArray(plainText.constData(), plainText.size());

где "data" это QByteArray
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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