Название: [Solved] Шифрование текста
Отправлено: 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 (http://narod.ru/disk/17186929000/cipherprog_urvin.rar.html)
Название: Re: Шифрование текста
Отправлено: Akaiten от Января 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]; }
Название: Re: Шифрование текста
Отправлено: Urvin от Января 23, 2010, 17:11
Akaiten, причина в чем-то ином... Я не могу отследить, почему получается ноль, который невозможно развернуть xor-ом обратно. :(
Название: Re: Шифрование текста
Отправлено: Blinkers от Января 27, 2010, 20:41
...0 получается когда xor'ится два одинаковых символа ;)
Название: Re: Шифрование текста
Отправлено: Urvin от Января 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()); }
Название: Re: [Solved] Шифрование текста
Отправлено: SABROG от Января 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, а интерфейс программы сделать не интуитивно понятным, чтобы нельзя было даже методом тыка понять какая кнопка за что отвечает :P
|