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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Шифрование QString (XOR)  (Прочитано 13171 раз)
JamS007
Гость
« : Май 03, 2010, 21:57 »

Здравствуйте,

Знаю, то банально, можете меня пинать, но я уже извелся...
Сегодня целый день потратил на поиски варианта xor-a над QString.

вот что нашел:
Код:
QString xorStr(QString str)
{
quint32 key = 073; //шифр
QString retStr(str.length());
for(int i = 0; i < str.length(); i++)
    {
            retStr[i] = QChar(str.at(i).toAscii() ^ key);
    }
return retStr;
}

Признаю, это детский вопрос, но все-же... функция работает нормально, но только с латинскими символами... русские вообще не признает... Она их кодирует, но обратный процес не получаеться...

Тыкните пальцем, где ошибка...
« Последнее редактирование: Май 04, 2010, 11:10 от JamS007 » Записан
Sancho_s_rancho
Гость
« Ответ #1 : Май 03, 2010, 22:30 »

Я не совсем понял вашу затею. Лучше бы услышать предисторию и то, что вам необходимо получить в итоге.
То, что я вижу сейчас.
Байту(символу) Ascii вы делаете больно XOR. Ascii - это однобайтовая кодировка, не содержащая буковок кириллицы.
Далее вы создаете юникодный QChar. До 128 (или 127) ascii как соответсвует юникоду, а дальше нет. но даже если бы там была кириллица(типа koi8-r), то юникодному номеру символы все-равно бы не соответствовали.
Записан
zenden
Гость
« Ответ #2 : Май 03, 2010, 22:40 »

всё это мне не нравится, но я предлагаю использовать .unicode() вместо toAscii()

Код:
retStr[i] = QChar(str.at(i).unicode() ^ key);
Записан
Sancho_s_rancho
Гость
« Ответ #3 : Май 03, 2010, 22:49 »

Да. Либо Метод unicode использовать, он возвращает юникодный номер (тип ushort , 16-битное беззнаковое) и над ним глумится.
Или использовать QTextCodec::codecForName(), устанавливать 8-битный кодек содержащий символы кириллицы (ну  там вынь 1251 или кои8-р), проверять имеет ли эта кодовая таблица этот символ через QTextCodec::canEncode(QChar(....)) и играть в эти игры с байтом.
Записан
JamS007
Гость
« Ответ #4 : Май 03, 2010, 22:57 »

Мне нужно закодировать несколько строк QString от чужих глаз. (Они будут записаны в файл) Особо умных методов мне не надо, так как программа не большой важности, да и как я их закодировал буду знать только я.

Очень-очень желательно, чтоб строки кодировались и раскодировались как на Unix так и на Windows. Причем нужна совместимость, например, строка закодированная на юниксе должна быть читаемой на винде, и наоборот.

В шифровании данных я новичок. Никогда не приходилось этого делать, до сегодня. Поэтому допускаю грубые ошибки, признаю. Метод ХОR выбрал как самый легкий из всех.

Если есть идеи как это сделать - пишите, я буду очень рад почитать, да и, думаю, не только я....
« Последнее редактирование: Май 03, 2010, 23:03 от JamS007 » Записан
zenden
Гость
« Ответ #5 : Май 03, 2010, 23:35 »

Я не думаю, что стоит хранить бинарные данные в QString. Для таких целей существует QByteArray. Тем более что потом эти данные надо будет выводить в файл (скорее всего текстовый)

Предлагаю использовать 2 функции - шифрования и дешифрования, а  зашифрованные данные, закодированные в Base64, хранить в строке . Уверен, что это будет работать на любой системе и между системами, потому что Utf8 есть везде.

Код
C++ (Qt)
quint32 key = 073; //шифр
QString encodeStr(const QString& str)
{
QByteArray arr(str.toUtf8());
for(int i =0; i<arr.size(); i++)
arr[i] = arr[i] ^ key;
 
return QString::fromAscii(arr.toBase64());
}
 
QString decodeStr(const QString &str)
{
QByteArray arr = QByteArray::fromBase64(str.toAscii());
for(int i =0; i<arr.size(); i++)
arr[i] =arr[i] ^ key;
 
return QString::fromUtf8(arr);
}
« Последнее редактирование: Май 03, 2010, 23:42 от zenden » Записан
JamS007
Гость
« Ответ #6 : Май 03, 2010, 23:53 »

Хорошо, я понял.

А теперь, поясните, если можно, как работать с такой строкой в разных системах?
На выходе я получу строку в UTF-8 (Если я правильно понял), как мне ее использовать? Как мне ее показать на линукс и виндос, так, что бы она и там, и там была читаемой?
Записан
zenden
Гость
« Ответ #7 : Май 04, 2010, 00:09 »

Шифруете первоначальную строку с помощью encodeStr(), получается некая строка вида "64TrheuK647rj+uL", пишете её в файл.

Когда надо - читаете из файла зашифрованную строку ("64TrheuK647rj+uL"), дешифруете с помощью decodeStr(), получается первоначальная строка, отображаете её. она будет читаемая.
« Последнее редактирование: Май 04, 2010, 00:13 от zenden » Записан
JamS007
Гость
« Ответ #8 : Май 04, 2010, 11:10 »

Спасибо всем!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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