Russian Qt Forum

Qt => Общие вопросы => Тема начата: Mish_ka от Май 15, 2011, 23:42



Название: QCA::Cipher странное поведение
Отправлено: 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";
}

подскажите, что я не так сделал?


Название: Re: QCA::Cipher странное поведение
Отправлено: Mish_ka от Май 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();

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

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



Название: Re: QCA::Cipher странное поведение
Отправлено: pastor от Май 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