Russian Qt Forum

Qt => Вопросы новичков => Тема начата: GPPsoft от Июль 03, 2013, 12:31



Название: Объясните в чем разница?
Отправлено: GPPsoft от Июль 03, 2013, 12:31
Здравствуйте. Шифрую строку RC4 алгоритмом. Если я задаю текст явно в коде, то все работает как надо, но если я беру его из элемента, то нет.

RC4:
Код
C
#include "rc4.h"
 
unsigned char S[256];
unsigned int i,j;
 
void RC4::swap(unsigned char *array, int ind1, int ind2)
{
   unsigned char temp = array[ind1];
   array[ind1] = array[ind2];
   array[ind2] = temp;
}
 
RC4::RC4(){
 
}
 
void RC4::init(unsigned char *key,unsigned int key_lenght)
{
   for (i = 0; i < 256; i++)
   {
       S[i] = i;
   }
 
   j = 0;
   for (i = 0; i < 256; i++)
   {
       j = (j + S[i] + key[i % key_lenght]) % 256;
       swap(S, i, j);
   }
 
   i = j = 0;
}
 
unsigned char RC4::kword()
{
   i = (i + 1) % 256;
   j = (j + S[i]) % 256;
   swap(S, i, j);
   unsigned char K = S[(S[i] + S[j]) % 256];
   return K;
}
 
void RC4::code(unsigned char *data, unsigned int data_length)
{
   for (int i = 0; i < data_length; i++)
   {
       data[i] = (data[i] ^ kword());
   }
}
 

Использование:
Код
   //char text[]="ТАК ВСЁ РАБОТАЕТ!";
   char *text=ui->plainTextEdit->toPlainText().toUtf8().data();
 
   rc= new RC4();
   rc->init((unsigned char*)"keykeykey",9);
   rc->code((unsigned char*)text,sizeof(text));
   delete(rc);
 
   QMessageBox::information(this,"Зашифрованно!",text);
 
   rc=new RC4();
   rc->init((unsigned char*)"keykeykey",9);
   rc->code((unsigned char*)text,sizeof(text));
   delete(rc);
 
   QMessageBox::information(this,"Расшифрованно!",text);
 

Заранее огромное спасибо за помощь!


Название: Re: Объясните в чем разница?
Отправлено: kambala от Июль 03, 2013, 12:53
скорее всего кодировка исходных файлов у тебя не UTF-8, а cp1251. чтобы получить аналогичный результат из переменной, используй toLocal8Bit() вместо toUtf8().


Название: Re: Объясните в чем разница?
Отправлено: GPPsoft от Июль 03, 2013, 13:00
скорее всего кодировка исходных файлов у тебя не UTF-8, а cp1251. чтобы получить аналогичный результат из переменной, используй toLocal8Bit() вместо toUtf8().
Спасибо. Но я кажется понял. Просто указатель помирает... Потому что
Код
C
char *text=ui->plainTextEdit->toPlainText().toUtf8().data();
 
Видимо QByteArray сразу после этой строки удаляется из стека(ведь так?). Сделал вот так:
Код
C
QByteArray crypt=ui->plainTextEdit->toPlainText().toUtf8().data();
 
rc= new RC4();
rc->init((unsigned char*)"keykeykey",9);
rc->code((unsigned char*)crypt.data(),crypt.length());
delete(rc);
 
Все заработало! Эх... Тяжело переходить с C# и Java :)