Russian Qt Forum

Qt => Общие вопросы => Тема начата: JamS007 от Май 03, 2010, 21:57



Название: [Решено] Шифрование QString (XOR)
Отправлено: 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;
}

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

Тыкните пальцем, где ошибка...


Название: Re: Xor QString
Отправлено: Sancho_s_rancho от Май 03, 2010, 22:30
Я не совсем понял вашу затею. Лучше бы услышать предисторию и то, что вам необходимо получить в итоге.
То, что я вижу сейчас.
Байту(символу) Ascii вы делаете больно XOR. Ascii - это однобайтовая кодировка, не содержащая буковок кириллицы.
Далее вы создаете юникодный QChar. До 128 (или 127) ascii как соответсвует юникоду, а дальше нет. но даже если бы там была кириллица(типа koi8-r), то юникодному номеру символы все-равно бы не соответствовали.


Название: Re: Xor QString
Отправлено: zenden от Май 03, 2010, 22:40
всё это мне не нравится, но я предлагаю использовать .unicode() вместо toAscii()

Код:
retStr[i] = QChar(str.at(i).unicode() ^ key);


Название: Re: Xor QString
Отправлено: Sancho_s_rancho от Май 03, 2010, 22:49
Да. Либо Метод unicode использовать, он возвращает юникодный номер (тип ushort , 16-битное беззнаковое) и над ним глумится.
Или использовать QTextCodec::codecForName(), устанавливать 8-битный кодек содержащий символы кириллицы (ну  там вынь 1251 или кои8-р), проверять имеет ли эта кодовая таблица этот символ через QTextCodec::canEncode(QChar(....)) и играть в эти игры с байтом.


Название: Re: Xor QString
Отправлено: JamS007 от Май 03, 2010, 22:57
Мне нужно закодировать несколько строк QString от чужих глаз. (Они будут записаны в файл) Особо умных методов мне не надо, так как программа не большой важности, да и как я их закодировал буду знать только я.

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

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

Если есть идеи как это сделать - пишите, я буду очень рад почитать, да и, думаю, не только я....


Название: Re: Xor QString
Отправлено: zenden от Май 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);
}


Название: Re: Xor QString
Отправлено: JamS007 от Май 03, 2010, 23:53
Хорошо, я понял.

А теперь, поясните, если можно, как работать с такой строкой в разных системах?
На выходе я получу строку в UTF-8 (Если я правильно понял), как мне ее использовать? Как мне ее показать на линукс и виндос, так, что бы она и там, и там была читаемой?


Название: Re: Xor QString
Отправлено: zenden от Май 04, 2010, 00:09
Шифруете первоначальную строку с помощью encodeStr(), получается некая строка вида "64TrheuK647rj+uL", пишете её в файл.

Когда надо - читаете из файла зашифрованную строку ("64TrheuK647rj+uL"), дешифруете с помощью decodeStr(), получается первоначальная строка, отображаете её. она будет читаемая.


Название: Re: Xor QString
Отправлено: JamS007 от Май 04, 2010, 11:10
Спасибо всем!