PDA

Просмотр полной версии : Проблемы с xor при расшифровке.


DaFive
12.04.2010, 13:46
Здравствуйте, товарищи.

Возникла проблема следующего плана. Есть функция xor'а:

public function xor(source:String, key:String):String
{
var result:String = new String();

key = key.substr(0, source.length);

for (var i:int = 0; i < source.length; i++)
{
trace(source.charCodeAt(i), key.charCodeAt(i));
result += String.fromCharCode(source.charCodeAt(i) ^ key.charCodeAt(i));
}
return result;
}


Так вот, при первом обращении к функции все проходит успешно:

encode
79 98
75 54
59 53
50 53
48 50
48 48
56 48
59 98
50 55
54 98
50 101
48 53
59 56
57 51
48 98
59 54
49 53
59 56
49 55
59 49
49 98


Но мы видим что на 6 символе у нас получается 2 одинаковых кода: 48 и 48.

При расшифровке сообщения, соответственно на 6 символе мы и валимся. То есть флеш видит его как ?конец строки?:

decode
45 98
125 54
14 53
7 53
2 50


Это возникает далеко не всегда и зависит от некой комбинации ключа (key) и самой строки (source).

Назрел вопрос: как собственно запретить ему видеть конец строки и продолжать расшифровку даже тогда, когда мы получаем 2 одинаковых числа?

mickfallout
12.04.2010, 14:20
мне кажется плохая идея хранить в String непойми какие символы, в том числе символ конца. может луче в векторе? или в массиве.
public class Main extends Sprite
{

public function Main():void
{
super();
trace(xor("asdfasdfsd", "piuopsiiuo"));
// 1234567890 1234567890
}
public function xor(source:String, key:String):Vector.<String>
{
var result:Vector.<String> = new Vector.<String>();
key = key.substr(0, source.length);
for (var i:int = 0; i < source.length; i++)
{
trace(i+"\t"+source.charCodeAt(i)+"\t"+key.charCodeAt(i)+"\t"+String.fromCharCode(source.charCodeAt(i))+"\t"+String.fromCharCode(key.charCodeAt(i))+", result=\""+String.fromCharCode(source.charCodeAt(i) ^ key.charCodeAt(i))+"\"");
result.push(String.fromCharCode(source.charCodeAt(i) ^ key.charCodeAt(i)))
}
trace("");
return result;
}
}

Добавлено через 4 минуты
P.S.
trace("first part"+String.fromCharCode(0)+"second part");//выводит first part

DaFive
12.04.2010, 14:54
мне кажется плохая идея хранить в String непойми какие символы, в том числе символ конца. может луче в векторе? или в массиве.


Это мысля. Только опять же. Допустим мы на выходе получаем тот же массив или тот же вектор. В массив все добавится на ура и не будет никаких проблем с кодированием строки.

Но... Этот же массив придется опять привести к стрингу и вогнать в функцию xor для расшифровки. Тут и получаем опять проблему со строкой.

iNils
12.04.2010, 15:00
48 - это код цифры 0. У меня никаких проблем с шифровкой и дешифровкой не возникло.

DaFive
12.04.2010, 15:16
Да, товарисчи. Ошибка все же была не в нём. Опустил я упоминание о Base64. Подключил пакет: import com.hurlant.util.Base64;

Сначала строка ксорится, потом перегоняется в Base64 дабы символы плохие исключить.

var xored:String = xor(message, t_key);

var encoded:String = Base64.encode(xor(message, t_key));

var decoded:String = Base64.decode(encoded);

trace(xored == decoded); //false


Видать Base64 и валит всю систему при decod'e зашифрованного в Base64 ксора сообщения.

wvxvw
12.04.2010, 16:39
А что, позвольте спросить вот это за недоразумение:
var result:String = new String();
key = key.substr(0, source.length);
В AS3 строки передаются по значению и конструкор String() вообще смысла не имеет.
Т.е. должно было быть так, как минимум:
var result:String = "";
key = source;
Чтобы читателей не путать.
А еще утилиты которые вы используете работают с ByteArray, по идее, со String они вообще не должны работать или могут работать некорректно потому что в AS3 строки в юникодах, а то, что вы пытались сделать на раз может сгенерить невалидную юникодную последовательность.

DaFive
12.04.2010, 16:50
А что, позвольте спросить вот это за недоразумение:
Чтобы читателей не путать.
А еще утилиты которые вы используете работают с ByteArray, по идее, со String они вообще не должны работать или могут работать некорректно потому что в AS3 строки в юникодах, а то, что вы пытались сделать на раз может сгенерить невалидную юникодную последовательность.

Да, код функции я сам не писал, просто взял готовую. Сам я строки таким образом не объявляю.

Спасибо за ответы, будем искать решение другого плана.