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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните в чем разница?  (Прочитано 1944 раз)
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);
 

Заранее огромное спасибо за помощь!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Июль 03, 2013, 12:53 »

скорее всего кодировка исходных файлов у тебя не UTF-8, а cp1251. чтобы получить аналогичный результат из переменной, используй toLocal8Bit() вместо toUtf8().
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
GPPsoft
Гость
« Ответ #2 : Июль 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 Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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