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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемка с шифрованием русского текста  (Прочитано 6736 раз)
Nord2008
Гость
« : Сентябрь 11, 2009, 22:13 »

Здраствуйте! Я новичок в Qt и С++, так что не судите строго!:) У меня есть небольшая проблема, суть её в следующем: Пишу программу на qt для работы с базой данных sqlite. Мне нужно строки в бд шифровать алгоритмом BlowFish. Эти строки на русском языке и я везде в программе использую кодировку utf8. Проблема состоит в том что когда я шифрую русские строки то при расшифровке получаю вместо русских слов и букв иероглифы или знаки вопроса. Вот и прошу откликнуться знающих людей, что бы помогли мне в данной проблеме. Вот код:
Код
C++ (Qt)
uchar k[128];
   memset(k,'Q',128);
   BF_KEY key;
   BlowfishSetKey(&key,128,k);
 
   QString dt = tr("привет");
   QString crypt;
   QString decr;
 
   while(dt.size() < 128)
       dt.append("#");
 
   qDebug() << dt;
   for (int i=0;i<128;i+=8)
   {
       uchar *out;
       out=new uchar[8];
       uchar *in;
       in=new uchar[8];
       QByteArray da(dt.mid(i,8).toAscii());
       for (int d = 0;d<da.size();d++)
       {
           in[d] = da.data()[d];
       }
       qDebug() << dt.mid(i,8) << "-<<<!!!!";
       BlowfishEncryptLE(in,out,&key,1);
 
       QByteArray b1;
       for(int j=0;j<8;j++)
       {
           b1[j]=out[j];
       }
       qDebug() << b1 << "<<<-B1";
       crypt.append(b1);
       delete [] out;
       delete [] in;
   }
 
   QByteArray base(crypt.toAscii());
   crypt = base.toBase64();
   qDebug() << crypt << "<CRYPT";
 
   QByteArray bas = QByteArray::fromBase64(crypt.toAscii());
   for (int i=0;i<128;i+=8)
   {
       uchar *data;
       data=new uchar[8];
       uchar *in;
       in=new uchar[8];
       QByteArray data2 = bas.mid(i,8);
       for (int h = 0;h<data2.size();h++)
       {
           in[h] = data2[h];
       }
       qDebug() << (char*)in << "<<---";
       BlowfishEncryptLE(in,data,&key,0);
       qDebug() <<  (char*)data;
       QByteArray b2;
       for(int j=0;j<8;j++)
       {
           b2[j]=data[j];
       }
       qDebug() << b2<< "<<<--B2";
       decr.append(b2);
       delete [] data;
       delete [] in;
   }
   qDebug() << decr;
 
Реализацию алгоритма шифрования в приложении к сообщению. Заранее благодарю всех откликнувшихся!!!
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Сентябрь 12, 2009, 06:38 »

>>dt.mid(i,8).toAscii()

dt - QString - внутреннее представление UTF-16, ты приводишь к ASCII, однако последняя не поддерживает символов кирилицы, только ASCII.

Т.е. ты теряешь символы при преобразовании.
Записан

Юра.
Nord2008
Гость
« Ответ #2 : Сентябрь 12, 2009, 09:44 »

Здраствуй lit-uriy. Спасибо большое за помошь! Но могли бы вы протестировать мой код с вашими изменениями-буду очень признателен вам!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Сентябрь 13, 2009, 11:30 »

Nord2008, вместо toAscii() используй toLocal8Bit()
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Nord2008
Гость
« Ответ #4 : Сентябрь 13, 2009, 14:26 »

Хорошо, сейчас попробую...
Записан
Nord2008
Гость
« Ответ #5 : Сентябрь 13, 2009, 15:02 »

Nord2008, вместо toAscii() используй toLocal8Bit()
всё равно иероглифы получаються какие-то...я думаю нужно использовать toUtf8 но что то не так всё таки в моём коде..может проверишь?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Сентябрь 13, 2009, 16:20 »

Почитай в ассистанте про QTextCodec::setCodecFor*. Также можешь поискать ответ в разделе Интернационализация, локализация.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Maxz
Гость
« Ответ #7 : Сентябрь 15, 2009, 11:56 »

Я использую примерно такое:

Код:
// преобразование Windows-1251 в UNICODE (UTF-8)
QString FTr(QString rustext){
  QTextCodec  *codec=QTextCodec::codecForName("Windows-1251");
  QByteArray ba;
  ba.append(rustext);
  return codec->toUnicode(ba);
}
Записан
Nord2008
Гость
« Ответ #8 : Сентябрь 15, 2009, 13:17 »

Спасибо всем за ответы!!! Всё получилось в итоге!! Вот код:
Код
C++ (Qt)
QByteArray encrypt(QByteArray dat)
{
       QByteArray ke("qwerty");
       uchar *k = new uchar[ke.size()];
       for (int i=0;i<ke.size();i++)
           k[i] = ke[i];
       BF_KEY key;
       BlowfishSetKey(&key,ke.size(),k);
 
       delete [] k;
 
       QByteArray dt(dat);
       QByteArray cry;
       dt = dt.toHex();
       while(dt.size() < 128)
           dt.append("#");
 
 
       for (int i=0;i<128;i+=8)
       {
           uchar *in  = new uchar[8];
           uchar *out = new uchar[8];
 
           for (int x=0;x<8;x++)
           in[x] = dt.mid(i,8)[x];
 
           BlowfishEncryptLE(in,out,&key,1);
 
           QByteArray b1;
 
           for(int j=0;j<8;j++)
           {
               b1[j]=out[j];
           }
           cry.append(b1);
 
           delete [] out;
           delete [] in;
       }
 
       cry = cry.toBase64();
       return cry;
}
 
 
QString decrypt(QByteArray dat)
{
       QByteArray ke("qwerty");
       uchar *k = new uchar[ke.size()];
       for (int i=0;i<ke.size();i++)
               k[i] = ke[i];
       BF_KEY key;
       BlowfishSetKey(&key,ke.size(),k);
 
       delete [] k;
 
       QByteArray dt(dat.fromBase64(dat));
       QByteArray decr;
       QString dr;
 
       for (int i=0;i<128;i+=8)
       {
           uchar *in  = new uchar[8];
           uchar *out = new uchar[8];
 
           for (int x=0;x<8;x++)
               in[x] = dt.mid(i,8)[x];
 
           BlowfishEncryptLE(in,out,&key,0);
 
           QByteArray b2;
 
           for(int j=0;j<8;j++)
           {
               b2[j]=out[j];
           }
 
           decr.append(b2);
 
           delete [] in;
           delete [] out;
       }
       dr = QString(decr.fromHex(decr));
       return dr;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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