Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать правильный перевод String в ByteArray (http://www.flasher.ru/forum/showthread.php?t=184201)

AzagThoth 13.09.2012 14:22

Как сделать правильный перевод String в ByteArray
 
Здравствуйте! Столкнулся с одной проблемкой.
Легенда:
Есть криптографическая библиотека http://code.google.com/p/as3crypto/ меня интересует конкретно "aes-128-ecb" шифрование.
Вот кусочек кода как оно работает:
Код AS3:

var testStr:String = "Meet me at 11 o clock behind the monument.";
var keyStr:String = "thisisaverysecre";//somerandomstring
var strBytes:ByteArray = new ByteArray();
strBytes.writeUTFBytes(testStr);
var keyBytes:ByteArray = new ByteArray();
keyBytes.writeUTFBytes(keyStr);
var mode:ICipher = Crypto.getCipher("aes-128-ecb", keyBytes);
mode.encrypt(strBytes);
var encoded:String = Base64.encode(strBytes);
trace(encoded);//В отпут выходит вот это: "1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGheyq0W21NuTyoY7WaZCs4xE"
trace(strBytes.length);//В оутпут выходит число 48
mode.decrypt(strBytes);
trace(strBytes);

Теперь представим гипотетическую ситуацию, когда с сервера приходит строка кодированная в Base64. А мы хотим её обработать. Для чистоты эксперимента возьмём эту строку "1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGheyq0W21NuTyoY7WaZCs4xE".
Код AS3:

var decoded:ByteArray = Base64.decode("1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGhcGaXGSndGJnFbNxIxTrFym");
var testStr:String = decoded.toString();
var keyStr:String = "thisisaverysecre";
var strBytes:ByteArray = new ByteArray();
strBytes.writeUTFBytes(testStr);
var keyBytes:ByteArray = new ByteArray();
keyBytes.writeUTFBytes(keyStr);
var mode:ICipher = Crypto.getCipher("aes-128-ecb", keyBytes);
trace(strBytes.length);//В оутпут выводит: 68
mode.decrypt(strBytes);//Здесь код крашится
trace(strBytes);

Это грустно, так как 68 и 48 это разные числа :(
Похоже что здесь дело в том, как мы пишем строку в ByteArray.
Если попробовать такой способ:
Код AS3:

strBytes.writeUTF(testStr);
trace(strBytes.length);//В оутпут выводит: 70

Таким образом становится понятно, что крашится скрипт потому, что не удаётся воссоздать оригинальный ByteArray.
Вопросы:
Возможно существуют какие-то способы передачи ByteArray от php сервера? И нужно пользоваться именно ими? Или возможно надо как то по другому воссоздавать ByteArray, пользуясь другими методами? Подскажите пожалуйста, как действовать в этой ситуации. Уже не первый день думаю над этим.

maxkar 13.09.2012 15:02

Цитата:

Возможно существуют какие-то способы передачи ByteArray от php сервера? И нужно пользоваться именно ими?
Base64 вполне нормален. Только для этого нужно понимать, где и с чем он работает. С какой стороны у него кормятся байты и из какой стороны вылезают строки (на самом деле байты в определенном диапазоне, которые затем конвертируются в строку).
Дальше вопрос по вашему коду:
Код AS3:

var encoded:String = Base64.encode(strBytes);
var decoded:ByteArray = Base64.decode(encoded);
trace(decoded.toString())

Вы трейсите byte array. Почему вы его передаете как текст? Почему вы не трейсите сразу strBytes? В этой точке ваш decoded в точности равен strBytes (потому что вы выполнили прямое и обратное преобразование). Понимаете ли вы, что преобразование byteArray в строку - операция необратимая (там байты могут потеряться, например).
Цитата:

var decoded:ByteArray = Base64.decode("1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGhcGaXGSndGJnFbNxIxTrFym");
var testStr:String = decoded.toString();
В чем смысл переводить бинарные данные в строку? Затем писать ее в utf-8 (очевидно же, что получится уже другой byte array).

Перестаньте подбирать различные способы перекладывания из строк в строки и разберитесь, что же вам на самом деле нужно. Прокоментируйте в коде для каждой переменной, что именно в ней лежит. Т.е. что получается в результате ваших преобразований. Тогда вы и поймете, какие из манипуляций со строками лишние. Если их убрать, все будет работать нормально.

AzagThoth 13.09.2012 15:18

Я просто опечатался когда первый пост составлял. Сейчас посмотрите. Отрывок про который вы говорите:
Код AS3:

var encoded:String = Base64.encode(strBytes);
trace(encoded);//В отпут выходит вот это: "1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGheyq0W21NuTyoY7WaZCs4xE"
trace(strBytes.length);//В оутпут выходит число 48

Добавлено через 44 секунды
в коде куча трейсов (так как для себя пишу и отлаживаю), при публикации не тот трейс затёр. И не заметил :)

Добавлено через 6 минут
Спасибо огромное за Ваш пост! Всё решил так:
Код AS3:

var keyStr:String = "thisisaverysecre";
var strBytes:ByteArray = Base64.decode("1X0ceapxfyHFztoZ34dmzp7up0XnRaOt/IvCyAsuGhcGaXGSndGJnFbNxIxTrFym");
var keyBytes:ByteArray = new ByteArray();
keyBytes.writeUTFBytes(keyStr);
var mode:ICipher = Crypto.getCipher("aes-128-ecb", keyBytes);
mode.decrypt(strBytes);
trace(strBytes);


Vreden 15.09.2012 02:15

var keyBytes:ByteArray = Hex.toArray(keyStr);

in4core 15.09.2012 03:45

Код AS3:

private function encryptString(msg:String):String {
 
                        var key:ByteArray                        = Hex.toArray(Hex.fromString(KEY));
                        var plainText:ByteArray        = Hex.toArray(Hex.fromString(msg));
                        var cipher:ICipher                        = Crypto.getCipher("des-ecb", key);
 
                        cipher.encrypt(plainText);
 
                        return Base64.encode( Hex.fromArray(plainText) );
 
                }
 
                private function decryptString(msg:String):String {
 
                        var key:ByteArray                        = Hex.toArray(Hex.fromString(KEY));
                        var plainText:ByteArray        = Hex.toArray(msg);
                        var cipher:ICipher                        = Crypto.getCipher("des-ecb", key);
 
                        cipher.decrypt(plainText);
 
                        return Hex.toString(Hex.fromArray(plainText));
 
                }

Код AS3:

const deCryptedString:String         = Base64.decode(cryptedData);
 
                        try
                        {
                                const openString:String        = decryptString(deCryptedString);
                        }
 
                        catch (e:Error)
                        {
                                throw new IllegalOperationError('HACK FAILED' , -999);
                        }
 
                        trace('3:-====GET DATA====-');
                        trace('Crypted data (base64) : ' + cryptedData);
                        trace('DES data : ' + deCryptedString);
                        trace('Decrypted data : ' + openString);
                        trace('3:-====END DATA====-');

Только никому не говори)))))))))

AzagThoth 20.09.2012 02:43

У меня часть ключа шифрования сервер генерирует. А часть в флешку запилена. То есть ключи и шифровки у всех пользователей разные. ;) Только на практике, с высоким навыком - всё равно можно через какие-нибудь декомпиляторы достучаться до кода флешки и всё узнать оттуда :( Обидно.

in4core 20.09.2012 02:50

AzagThoth - нет. Декомпил флешки мало что даст в случае, если эту флешку будут часто перешивать, особенно если это мини-хак флеша. Хочешь заработать - перешей. А так вообще много решений на самом деле. Да и кстати обфускаторы строк есть хорошие, ни одним декомпилом не сломаешь , но это тока для строк. - п.с. платно 100%

AzagThoth 20.09.2012 03:00

Цитата:

Сообщение от in4core (Сообщение 1096712)
Да и кстати обфускаторы строк есть хорошие, ни одним декомпилом не сломаешь , но это тока для строк. - п.с. платно 100%

С перешиванием само собой. Это хорошее решение.
Обфускаторами да, пользовался. Но теоретически каким-нибудь низкоуровневым дизасемблятором типа "ollydbg", при наличии навыка - сломать конечно получится.

Добавлено через 1 минуту
Возможно читали эти статьи http://www.wasm.ru/series.php?sid=17
Я только половину прочитал. Но очевидно, что всё что однажды оказывается на стороне клиента - 100% ломается.

in4core 20.09.2012 12:55

Цитата:

дизасемблятором типа "ollydbg"
На то они и стоят от 400$ за лицензию обфускаторы, чтобы таких вопросов не возникало. Вы пользовались скорее всего бесплатными или дешевыми


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

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