Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.09.2009, 23:27
RAlfDog вне форума Посмотреть профиль Отправить личное сообщение для RAlfDog Найти все сообщения от RAlfDog
  № 1  
Ответить с цитированием
RAlfDog
 
Аватар для RAlfDog

Регистрация: Jan 2008
Адрес: Земля
Сообщений: 178
По умолчанию XOR-кодирование

Всем доброго времени суток

Хочу закодировать текст (String) XOR-методом и записать его в файл. Т.е. весь текст раскладываю на строки, кодирую построчно, собираю, добавляя в конец каждой строки "\r\n" последовательность. При декодировании опять разбиваю на строки, убираю "\r\n" и пробую декодировать с тем же ключом - НЕ ПОЛУЧАЕТСЯ!!!

Создал такой вот класс:
Код AS3:
package src
{
	public class XORcoder
	{
 
		// Constants:
		static const def_key:String='RQ9UEgyaXINTyzpn3SJ7FSzmwSlewTWI3';
 
		// Initialization:
		public function XORcoder()
		{
		}
 
		// Public Methods:
		static public function encode(input_str:String,key:String=def_key):String
		{
			var output_str:String = new String();
			output_str = xor(input_str,key);	
			return output_str;
		}
		static public function decode(input_str:String,key:String=def_key):String
		{
			var output_str:String = new String();
			output_str = xor(input_str,key);	
			return output_str;
		}
 
		// Protected Methods:
		static private function xor(source:String,key:String):String
		{
			var result:String = new String();
			for (var i:uint = 0; i<source.length; i++) {
				if (i > (key.length-1)) {
					key+=key;
				}
				result+=String.fromCharCode(source.charCodeAt(i)^key.charCodeAt(i));
			}
			return result;
		}
	}
}
В одну строну кодируется нормально (кажется), а обратно не хочет декодироваться. Мне кажется загвоздка где-то в этом месте String.fromCharCode, когда as пытается вернуть UTF8-символ по полученному коду (source.charCodeAt(i)^key.charCodeAt(i))

Кто подскажет?

-----------------------------------------------------
Вот отдельная программка на этом классе. Если подольше потыкать, то можно обнаружить, что не всегда закодированный (encoded) текст возвращается в декодированный (decoded) при нажатии не кнопку "DECODE":
Вложения
Тип файла: rar XOR_encoder-decoder.rar (9.0 Кб, 60 просмотров)


Последний раз редактировалось RAlfDog; 16.09.2009 в 23:35.
Старый 17.09.2009, 00:07
Герыч вне форума Посмотреть профиль Отправить личное сообщение для Герыч Найти все сообщения от Герыч
  № 2  
Ответить с цитированием
Герыч
 
Аватар для Герыч

блогер
Регистрация: Apr 2009
Адрес: НиНо
Сообщений: 185
Записей в блоге: 12
Код AS3:
if (i > (key.length-1)) {
	key+=key;
}
я бы тут ввёл 2-ой индекс j и сбрасывал бы его при достижении длины. А вообще пробую мелкие строки и используй trace всего что у тя в проге

Старый 17.09.2009, 05:07
RAlfDog вне форума Посмотреть профиль Отправить личное сообщение для RAlfDog Найти все сообщения от RAlfDog
  № 3  
Ответить с цитированием
RAlfDog
 
Аватар для RAlfDog

Регистрация: Jan 2008
Адрес: Земля
Сообщений: 178
Проблема решена
Код рабочий, просто когда начинаешь трейсить полученную строку целиком или выводит её в textField, она почему-то обрезается, и декодирования к исходному виду не получается.

Старый 17.09.2009, 18:32
cursed_man вне форума Посмотреть профиль Отправить личное сообщение для cursed_man Найти все сообщения от cursed_man
  № 4  
Ответить с цитированием
cursed_man

Регистрация: Sep 2006
Адрес: Одесса
Сообщений: 11
Код AS3:
result+=String.fromCharCode(...);
из этого вырастут проблемы в виде символа конца строки. Строку в результате порвет.

Старый 17.09.2009, 18:52
RAlfDog вне форума Посмотреть профиль Отправить личное сообщение для RAlfDog Найти все сообщения от RAlfDog
  № 5  
Ответить с цитированием
RAlfDog
 
Аватар для RAlfDog

Регистрация: Jan 2008
Адрес: Земля
Сообщений: 178
Цитата:
Сообщение от cursed_man Посмотреть сообщение
проблемы в виде символа конца строки. Строку в результате порвет.
Ну и что, пусть будет символ конца строки, при декодировании он исчезнет, все символы встанут на свое место. (ПРОВЕРЕНО )
Здесь главное правильно передать закодированный текст на сервер или правильно его записать в файл. Когда пишешь в файл (если не использовать ByteArray), флеш сам выбирает кодировку, и вот здесь уже может не оказаться UTF-8. В итоге когда откроете файл, то декодировать его уже не получиться.

Решил проблему таким образом: Перевел каждый символ полученной строки в число (charCodeAt(i)) и разделил их символом '.'
Получил что-то типа такого:
Код:
119.82.71.47.19.26.84.75.64.65.38.48.23.69.40.84.73.65.73.84.4.15.93.91.68.110.87.112.73.80.66.94.84.82.108.103.80.73.4.81.86.89.10.10.122.83.75.120.71.67.53.3.67.86.19.19.22.23.49.9.28.84.31.24.31.1.57.63.92.89.82.75.109.112.67.81.73.81.86.85.65.64.1132.1100.1139.1109.1107.1104.1034.1033.99.209.1116.1100.1060.1116.1096.1058.1025.1136.1035.1107.1102.1071.1149.69.1110.1074.1100.1100.1101.1059.1033.1150.1109.75.1115.1030.1113.1025.1099.1114.1087.73.84.222.108.98.1130.1127.1070.75.74.72.2.16.78.112.118.127.110.83.123.104.2.63.57.80.126.110.100.104.98.84.116.123.67.80.26.5.84.69.86.118.87.124.126.107.126.110.65.84.125.109.125.115.60.97.64.79.61.51.78.112.118.127.110.64.86.49.69.83.65.21.83.23.48.4.28.17.116.123.80.68.119.84.30.15.68.8.71.116.126.107.94.85.87.84.65.64.64.116.59.75.106.98.1.52.73.87.119.67.85.110.124.82.60.56.19.108.121.85.73.111.69.69.72.64.126.110.4.56.102.91.80.104.87.125.93.83.67.84.95.104.70.123.125.115.28.90.86.89.61.51.115.119.76.85.85.82.81.111.59.3.62.107.94.85.117.84.101.126.73.124.121.105.62.4.97.97.73.119.86.116.126.107.67.105.108.66.107.71.122.72.60.97.74.89.1.8.78.112.118.127.110.110.124.83.60.56.30.80.66.85.73.111.88.121.115.81.126.110.5.56.102.70.85.119.86.72.121.81.126.110.70.104.70.123.125.115.28.90.86.89.61.51.115.119.76.82.105.105.71.111.59.17.19.34.18.22.32.69.38.84.75.124.121.73.5.4.93.102.110.118.106.79.83.108.121.85.107.111.97.123.65.72.60.97.87.101.58.25.78.112.119.127.110.78.71.83.0.63.57.81.126.110.100.104.98.69.116.123.94.85.5.4.97.97.84.75.109.101.126.107.66.105.108.72.125.123.65.116.59.91.106.98.16.52.73.75.75.120.73.82.71.83.60.56.3.108.121.68.73.111.89.121.115.92.66.85.5.56.102.91.105.76.71.72.121.80.126.110.75.84.125.123.125.115.1.102.109.72.61.51.114.119.76.95.85.82.71.111.59.2.62.107.83.105.78.84.101.126.84.64.66.85.57.63.92.102.110.102.106.79.66.108.121.71.70.38.45.56.20.89.127.75.84.101.58.9.78.112.118.127.110.67.123.104.0.63.57.81.126.110.116.104.98.84.116.123.66.105.62.0.97.97.84.75.109.101.126.107.66.105.108.85.65.64.64.116.59.75.106.98.1.52.73.87.119.67.85.110.124.82.60.56.19.108.121.85.73.111.69.69.72.64.126.110.4.56.102.75.105.76.86
И всё это уже пишу в файл в нужной мне кодировке как ByteArray (побайтно).
Потом перед декодированием просто перевожу всё обатно в символы -
Код AS3:
var arr:Array = str.split('.');
str = '';
for (var i:uint=0; i<=arr.length-1; i++) {
   str += String.fromCharCode(arr[i])
}

Старый 17.09.2009, 19:14
cursed_man вне форума Посмотреть профиль Отправить личное сообщение для cursed_man Найти все сообщения от cursed_man
  № 6  
Ответить с цитированием
cursed_man

Регистрация: Sep 2006
Адрес: Одесса
Сообщений: 11
точно не вспомню где мне боком такая сторка вылезла, но она была ущербной. использовал какраз bytearray и его метод writeMultyByte с нужной кодировкой.

вот так примерно получилось:

Код AS3:
        public static function crypt(stringData:String, passwordData:String = '5abaa65', charSet:String = 'utf-8'):ByteArray {
			var string  :ByteArray = new ByteArray();
			var password:ByteArray = new ByteArray();
 
			string.writeMultiByte   (stringData, charSet);
			password.writeMultiByte (passwordData, charSet);
 
			var stringInd:uint = 0;
			var passwordInd:uint = 0;
 
			string.position		= 0;
			password.position	= 0;
 
			var stringLen:uint	= string.length;
			var passwordLen:uint	= password.length;
 
			while (stringInd<stringLen){
				passwordInd = 0;
 
				while (passwordInd < passwordLen) {
					string[stringInd] ^= password[passwordInd];
					passwordInd++;
				}				
				stringInd++; 
			}
 
			return string;
		}


Последний раз редактировалось cursed_man; 27.04.2010 в 17:15.
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:35.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.