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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Solved] Шифрование текста  (Прочитано 9026 раз)
Urvin
Гость
« : Январь 23, 2010, 14:39 »

Есть задача скрыть от пользователя некоторое количество строк, притом не сильным шифрованием. Достаточно просто обломать его любопытство, так что подключением QCA заниматься не хочется.
Также нет требований и на быстродействие.
Но код должен быть симметричным.

Потому спроецируем на Qt классический XOR-алгоритм. Дабы иметь возможность записывать строки нормально в поля вывода и текстовые файлы, в добавок строка кодируется в кексы:
Код
C++ (Qt)
// Функция кодирования строки
QString Widget::stringEncrypt(QString strInput, QString strPassword)
{
   int a = 0, b = 0;
   QString strResult = "";
 
   // Создание битовых массивов из строк
   char* chResult = new char[strInput.size()+1];
   char* chPasswd = new char[strPassword.size()+1];
 
   // Копирование строк в битовый массив
   for (int i=0; i < strInput.size(); i++)
   {
       chResult[i] = strInput.toLocal8Bit()[i];
   }
   chResult[strInput.size()] = 0;
 
   for (int i=0; i < strPassword.size(); i++)
   {
       chPasswd[i] = strPassword.toLocal8Bit()[i];
   }
   chPasswd[strPassword.size()] = 0;
 
   // Кодирование информации
   while(chResult[a])
   {
       b=0;
       while(chPasswd[b])
       {
           chResult[a] ^= (chPasswd[b] + (a*b));
           b++;
       }
 
       if ((unsigned char)chResult[a] < 16) strResult += "0";
       strResult += QString("%1").arg((int)((unsigned char)chResult[a]),0,16);
 
       a++;
   }
 
   // Перевод строки в уникод, а затем в шестнадцатеричеую систему
   //QString strResult = QString::fromLocal8Bit(chResult);
   //strResult = strResult.toLocal8Bit().toHex();
 
   // Очистка занимаемой памяти
   delete [] chResult;
   delete [] chPasswd;
 
   // Возврат результата
   return strResult;
}
Код
C++ (Qt)
// Декодирование строки
QString Widget::stringDecrypt(QString strInput, QString strPassword)
{
   int a = 0, b = 0;
 
   // Сбор строки из hex-значений
   strInput = QString::fromLocal8Bit(QByteArray::fromHex(strInput.toLocal8Bit()));
 
   // Создание битовых массивов из строк
   char* chResult = new char[strInput.size()+1];
   char* chPasswd = new char[strPassword.size()+1];
 
   // Копирование строк в битовый массив
   for (int i=0; i < strInput.size(); i++)
   {
       chResult[i] = strInput.toLocal8Bit()[i];
   }
   chResult[strInput.size()] = 0;
 
   for (int i=0; i < strPassword.size(); i++)
   {
       chPasswd[i] = strPassword.toLocal8Bit()[i];
   }
   chPasswd[strPassword.size()] = 0;
 
   // Кодирование информации
   while(chResult[a])
   {
       b=0;
       while(chPasswd[b])
       {
           chResult[a] ^= (chPasswd[b] + (a*b));
           b++;
       }
       a++;
   }
 
   // Перевод строки в уникод
   QString strResult = QString::fromLocal8Bit(chResult);
 
   // Очистка занимаемой памяти
   delete [] chResult;
   delete [] chPasswd;
 
   // Возврат результата
   return strResult;
}

Вроде бы все вполне прилично и даже где-то работает... Но периодически возникает ситуация, что декодированная строка в зависимости от пароля периодически внезапно обрывается. Никак не возьму в толк, где же происходит ошибка  Грустный

Для удобства выделил функции в отдельный проект с соответствующими полями ввода:
cipherprog_urvin.rar
« Последнее редактирование: Январь 27, 2010, 22:56 от Urvin » Записан
Akaiten
Гость
« Ответ #1 : Январь 23, 2010, 17:05 »

В некоторой i-ой позиции закодированной строки встречаеться 0, поэтому функция QString::fromLocal8Bit отбрасывает оставшиеся символы. Попробуйте сделать так:
Код
C++ (Qt)
QByteArray ba = QByteArray::fromHex(strInput.toLocal8Bit());
 
// Копирование строк в битовый массив
for (int i=0; i < ba.size(); i++)
{
   chResult[i] = ba[i];
}
 
Записан
Urvin
Гость
« Ответ #2 : Январь 23, 2010, 17:11 »

Akaiten, причина в чем-то ином...
Я не могу отследить, почему получается ноль, который невозможно развернуть xor-ом обратно. Грустный
Записан
Blinkers
Гость
« Ответ #3 : Январь 27, 2010, 20:41 »

...0 получается когда xor'ится два одинаковых символа Подмигивающий

Записан
Urvin
Гость
« Ответ #4 : Январь 27, 2010, 22:52 »

Спасибо, Кеп!

На самом деле все решил через QByteArray, на мысль о чем правильно навел Akaiten.
Понравится - забирайте
Код
C++ (Qt)
QString stringEncrypt(QString strInput, QString strPassword)
{
   int i,j;
   QString strOutput="";
 
   // Перевод строк в битовые массивы с использованием локальных таблиц
   QByteArray baInput    = strInput.toLocal8Bit();
   QByteArray baPassword = strPassword.toLocal8Bit();
 
   // Кодирование информации
   for (i=0; i < baInput.size(); i++)
   {
       for (j=0; j < baPassword.size(); j++)
       {
           // XOR - кодировка символа
           baInput[i] = baInput[i] ^ (baPassword[j] + (i*j));
       }
 
       //Преобразование числа в шестнадцатеричную систему
       strOutput += QString("%1").arg((int)((unsigned char)baInput[i]),2,16,QChar('0'));
   }
 
   //Возврат кодированной строки
   return strOutput;
}
 
 
// Декодирование строки
QString stringDecrypt(QString strInput, QString strPassword)
{
   int i,j;
 
   // Декодировка строки из 16-ричной системы в битовый массив
   QByteArray baInput    = QByteArray::fromHex(strInput.toLocal8Bit());
   // Перевод строки пароля в битовый массив
   QByteArray baPassword = strPassword.toLocal8Bit();
 
   // Декодирование информации
   for (i=0; i < baInput.size(); i++)
   {
       for (j=0; j < baPassword.size(); j++)
       {
           // XOR - кодировка символа
           baInput[i] = baInput[i] ^ (baPassword[j] + (i*j));
       }
   }
 
   //Возврат кодированной строки
   return QString::fromLocal8Bit(baInput.data());
}
« Последнее редактирование: Январь 27, 2010, 23:06 от Urvin » Записан
SABROG
Гость
« Ответ #5 : Январь 28, 2010, 00:45 »

Можно пойти дальше, взять и написать плагин QTextCodecPlugin, а потом использовать его например так:

Код
C++ (Qt)
QByteArray xoredString = "...";
QTextCodec *codec = QTextCodec::codecForName("My XOR Encoding");
QString string = codec->toUnicode(encodedString);
 

и кодирование:

Код
C++ (Qt)
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("My XOR Encoding");
QByteArray encodedString = codec->fromUnicode(string);
 

Соответственно плагину надо будет передать пароль, чтобы он мог правильно декодировать. Можно даже извернуться и написать программу где интерфейс уже будет весь закодирован через Си строки в исходниках. Достаточно будет спросить пользователя пароль, который подставить в плагин и вызвать QTextCodec::setCodecForCStrings(). Пароль вообще можно продавать через SMS, а интерфейс программы сделать не интуитивно понятным, чтобы нельзя было даже методом тыка понять какая кнопка за что отвечает  Показает язык
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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