Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Base64 (PHP & AS3) (http://www.flasher.ru/forum/showthread.php?t=124642)

ekeeper 05.05.2009 17:00

Base64 (PHP & AS3)
 
Нашел несколько вариантов классов Base64 для AS3:
http://www.dynamicflash.com/goodies/base64 и еще другой тут предлагаемый

Сначала обрадовался.
Потом случился облом -

Задача - в swf паковать строку в base64 - отправлять ее как параметр на php скрипт и там ее распаковывать.

Проблема:
PHP код:
Код:

base64_encode("ну чо как? работаешь а? алгоритмег")
результат:
Код:

7fMg9+4g6uDqPyDw4OHu8uDl+Pwg4D8g4Ovj7vDo8uzl4w==
AS3 код (используя этот класс http://www.dynamicflash.com/goodies/base64):
Код AS3:

Base64.encode("ну чо как? работаешь а? алгоритмег")

результат:
Код:

0L3RgyDRh9C+INC60LDQuj8g0YDQsNCx0L7RgtCw0LXRiNGMINCwPyDQsNC70LPQvtGA0LjRgtC80LXQsw==
Судя по всему php-ный результат в два раза короче.
Из-за разной длины полученных строк и из-за того что они не равны - пришедшая на php-скрипт строка декодируется с ошибками.

Искал в инете - ссылка только на этот класс везде. Остальные либо не работают, либо с кучей ошибок вываливаются.

Есть у кого-нибудь прямой адаптированный аналог PHPшных функций для Base64?
Заранее спасибо.

BlooDHounD 05.05.2009 17:15

UTF-8

ekeeper 05.05.2009 17:15

Нахожу код на других языках - хоть и работает, но все равно не совпадает с выводом php

Добавлено через 2 минуты
Цитата:

Сообщение от BlooDHounD (Сообщение 817708)
UTF-8

Да, я понял что где-то в этом направлении думать надо, но никак не пойму где нужно что поправить...

iNils 05.05.2009 17:18

Кодировки разные. Flash кодирует utf-8 строку, а php ansii

ekeeper 05.05.2009 17:24

Цитата:

Сообщение от iNils (Сообщение 817712)
Кодировки разные. Flash кодирует utf-8 строку, а php ansii

В лоб:
Код:

base64_encode(utf8_encode("ну чо как? работаешь а? алгоритмег"))
Не выходит. Видимо надо искать другой способ перекодировки в UTF8 из ansi

iNils 05.05.2009 17:28

В лоб делают по другому. Сохраняют php файл в кодировке utf-8.
А по "научному" так
Код:

<?
echo base64_encode(iconv ("windows-1251", "utf-8", "ну чо как? работаешь а? алгоритмег"));
?>


ekeeper 05.05.2009 18:19

Цитата:

Сообщение от iNils (Сообщение 817721)
В лоб делают по другому. Сохраняют php файл в кодировке utf-8.
А по "научному" так
Код:

<?
echo base64_encode(iconv ("windows-1251", "utf-8", "ну чо как? работаешь а? алгоритмег"));
?>


СПАСИБО, заработало. Но все же на этом все не закончилось.

Я перед отправлением на скрипт еще шифрую по ключу с помощью xor

Код AS3:

var KEY:String = MD5.encrypt("password");
 
        function xor(source:String, key:String):String {
            var result:String = new String();
            for(var i:Number = 0; i < source.length; i++) {
                if(i > (key.length - 1)) {
                    key += key;
                }
                result += String.fromCharCode(source.charCodeAt(i) ^ key.charCodeAt(i));
            }
            return result;
        }
 
trace(Base64.encode(xor("ну чо как? работаешь а? алгоритмег", KEY)));

Результат:
Код:

0IjQpRTQo9GdQ9CJ0ZLQj15B0bfQhtCE0ZrRtNCB0ZHRsNG/EtCHW0XRktCD0IvQjNCj0Z7Ru9CF0IDRlQ==
PHP:
Код:

<?
$key = md5("password");
$str = iconv("windows-1251", "utf-8", "ну чо как? работаешь а? алгоритмег");

        function axor($source, $key) {
            $result = "";
            for($i = 0; $i < strlen($source); $i++) {
                if($i > (strlen($key) - 1)) {
                    $key .= $key;
                }
                $result .= chr(ord($source[$i]) ^ ord($key[$i]));
            }
            return $result;
        }

echo base64_encode(axor($str, $key));
?>

Результат:
Код:

5dvl50OytLKLQbGN5oW0jA5E6bPih7TUsobpsLPW6Yzk7uXoQ7ODXRWx0eeN5dfmj7W444rm5rXe6I3i0A==
Функция axor это просто переписанная функция xor из as3-варианта.
Видимо что-то опять про кодировки не учел... Я никак в этом разобраться не могу :(

Добавлено через 6 минут
Целью является принять в php строку

0IjQpRTQo9GdQ9CJ0ZLQj15B0bfQhtCE0ZrRtNCB0ZHRsNG/EtCHW0XRktCD0IvQjNCj0Z7Ru9CF0IDRlQ==

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

Код:

$source = "0IjQpRTQo9GdQ9CJ0ZLQj15B0bfQhtCE0ZrRtNCB0ZHRsNG/EtCHW0XRktCD0IvQjNCj0Z7Ru9CF0IDRlQ==";
echo axor(base64_decode($source), $key);

Потом обработать данные, сгенерить ответ, зашифровать его и отправить обратно

iNils 05.05.2009 18:36

Не шифруйте. Это бесполезно. Можно легко декомпилить ваш swf и все узнать.

ekeeper 05.05.2009 19:11

Ну хорошо, хоть упаковываться будет в приличные буковки, проблем с кодировкой не будет :)

BlooDHounD 05.05.2009 19:15

не знаю чего Вы пытаетесь добиться, но явно не "упаковки". так как я пока что вижу увеличение размера относительно исходных данных.

wvxvw 05.05.2009 20:41

А это типа нормально, что оно не мультибайт? :)
Код:

$key = md5("password");

ekeeper 10.05.2009 00:57

Цитата:

Сообщение от BlooDHounD (Сообщение 817787)
не знаю чего Вы пытаетесь добиться, но явно не "упаковки". так как я пока что вижу увеличение размера относительно исходных данных.

Ну решается проблема с кодировкой
а какие варианты именно упаковки есть? что можете посоветовать?
передаваться будет текст - xml

Добавлено через 1 минуту
Цитата:

Сообщение от wvxvw (Сообщение 817832)
А это типа нормально, что оно не мультибайт? :)
Код:

$key = md5("password");

Не много не понял вопроса. Видимо знаний не хватает
Но с ключем и во флэшке и в пхп проблем нет - значения равны

wvxvw 10.05.2009 02:06

Когда строка multibyte - то это, как правило значит, что используется больше чем 1 байт на символ для ее кодирования.
Не смотря на то, что UTF-8 для латиницы и цифр использует 1 байт на символ, судя по вашему описанию, это совсем не обязательно, чтобы в строке используемой как ключ были только латинские символы, и, кроме того, смотря как организован алгоритм на стороне флеша, возможно он еще и BOM (Byte Order Mark) добавляет.

Да, и "запаковать" строку используя Base64 у вас явно не получится :) она гарантировано будет больше исходной.

Да, и еще, лучше используйте в качестве ключа для MD5 число, а не строку, там сложнее ошибится :)

ekeeper 10.05.2009 11:10

Цитата:

Сообщение от wvxvw (Сообщение 818733)
Да, и "запаковать" строку используя Base64 у вас явно не получится :) она гарантировано будет больше исходной.

Какие есть способы упаковки? Кто-то уже такое делал для flash?

wvxvw 10.05.2009 18:27

Если текста много - можно в zip положить, или просто ByteArray.compress(); (ByteArray.inflate() только в десятке).

enginer 23.07.2009 14:06

По поводу кодирования и раскодирования русских символов… Проблему решил посредством изменения порядка кодирования:

http://enginer.googlecode.com/svn/trunk/src/ua/org/enginer/utils/Cryptor.as
Код AS3:

        private static function xor(source:String, key:String=""):String {
            if (!key) return source;
 
            var keyLength:int = key.length;
            var result:String = "";
 
            for(var i:Number = 0; i < source.length; i++)
                result += String.fromCharCode(source.charCodeAt(i) ^ key.charCodeAt(i % keyLength));
 
            return result;
        }
 
        public static function encode(source:String, key:String=""):String {
            return xor(Base64.encode(source), key);
        }
 
        public static function decode(source:String, key:String=""):String {
                  return Base64.decode(xor(source, key));
        }


http://enginer.googlecode.com/svn/trunk/src/ua/org/enginer/utils/Cryptor.php
PHP код:

    private static function axor($source/*:String*/$key/*:String*/)/*:String*/ {
        if (!
$key) return $source;
        
$result "";
        
$keyLength strlen($key);
        for(
$i 0$i strlen($source); $i++) {
            
$result .= chr(ord($source[$i]) ^ ord($key[$i $keyLength]));
        }
        return 
$result;
    }
    
    public static function 
encode($source/*:String*/$key/*:String*/="")/*:String*/ {
        return 
Cryptor::axor(base64_encode($source), $key);
    }
    
    public static function 
decode($source/*:String*/$key/*:String*/="")/*:String*/ {
        return 
base64_decode(Cryptor::axor($source$key));
    } 


TWETTI 10.08.2009 13:52

Я попробовал закодировать и раскодировать строчку с помощью класса Cryptor без ключа...все получилось...но когда я попробовал ввести ключ то стали появлятся квадратики. Как это исправить?

Вот:
Код AS3:

// с ключом
trace(Cryptor.encode("video1.flv","pswrd")); // вывелось: >'K>        *
trace(Cryptor.decode("dmlkZW8xLmZsdg==","pswrd")); // вывелось: ÿÿ¿ÿòÿÿ¿ÿö
// без ключа
trace(Cryptor.encode("video1.flv","")); // вывелось: dmlkZW8xLmZsdg==
trace(Cryptor.decode("dmlkZW8xLmZsdg==","")); // вывелось: video1.flv



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

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