Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   побитовые операции со строками (http://www.flasher.ru/forum/showthread.php?t=105688)

Ноябрь 21.12.2007 04:20

побитовые операции со строками
 
У меня есть задание по криптографии (кодированию).
В криптографии используют побитовые операции (XOR в основном). Так вот, у меня есть строка, как мне ее разложить на байты, чтобы логически сложить с другой строкой?

etc 21.12.2007 10:34

Один символ может занимать два или более байт. Как будет происходит сложение в этом случае?

BlooDHounD 21.12.2007 11:44

Код:

var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes( s );
for (var i:uint = 0; i<bytes.length; i++) {
trace(bytes[i]);
}


K.A.T.A.F.A.L.K.E.R 21.12.2007 12:28

а не получится при таком подходе ерунда? Когда один трехбайтовый юникодовский символ будет путаться с последовательностью трех однобайтовых? В смысле, зачем на байты разлагать? Имхо, лучше просто использовать charCodeAt(). Да, иногда это больше чем один байт. И что? Кто-то мешает делать XOR с более чем восемью битами?

BlooDHounD 21.12.2007 13:21

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

Ноябрь 21.12.2007 22:41

Думаю не запутаюсь. Формат ключа вообще не важен. Но мне не нравится, что кирилица кодируется максимум 12 битами, а я в данном случае буду рассматривать их как 2 байта, т.о возникает 25% лишней информации.. хорошо бы было не по байтам информацию получать, а по битам..
как прочитать обратно массив байтов?

BlooDHounD 21.12.2007 22:53

readUTF?

Ноябрь 21.12.2007 23:11

Код:

var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(s);
trace(bytes.readUTF());

Цитата:

Error: Error #2030: End of file was encountered.
at flash.utils::ByteArray/readUTF()
at main::base$iinit()

BlooDHounD 22.12.2007 01:06

position?
ваще чё-нить вроде хелпа пробывали читать?

Ноябрь 22.12.2007 01:39

Пробовал.
ф.. позиция какая-то..
так работает
Код:

bsecret.position=0;
trace(bsecret.readUTFBytes(bsecret.length));

так нет
Код:

bsecret.position=0;
trace(bsecret.readUTF());

а как пустой байт записать?
Код:

bsecret.writeUTFBytes('');
так не пишет

etc 22.12.2007 02:45

А пустой байт ничего и не представляет из себя.

BlooDHounD 22.12.2007 12:13

если имеется ввиду нулевой то writeByte(0).

Ноябрь 24.12.2007 02:54

Всем спасибо за помощь..
Реализация алгоритма Skipjack, который превратит любую ценную информацию в мусор, а затем обратно (если конечно знаешь ключ).
10байтный ключ позволяет сгенерировать 1.20892581961462e+24 вариантов себя.

Код:

package main{
       
        import flash.display.MovieClip
        import flash.utils.ByteArray
       
        public class base extends MovieClip{
               
                public var ssecret:String='Секретный текст';
                public var skey:String='very';
                public var equ:Array = new Array(
0xA3, 0xD7, 0x09, 0x83, 0xF8, 0x48, 0xF6, 0xF4, 0xB3, 0x21, 0x15, 0x78, 0x99, 0xB1, 0xAF, 0xF9, 0xE7, 0x2D, 0x4D, 0x8A, 0xCE, 0x4C, 0xCA, 0x2E, 0x52, 0x95, 0xD9, 0x1E, 0x4E, 0x38, 0x44, 0x28, 0x0A, 0xDF, 0x02, 0xA0, 0x17, 0xF1, 0x60, 0x68, 0x12, 0xB7, 0x7A, 0xC3, 0xE9, 0xFA, 0x3D, 0x53, 0x96, 0x84, 0x6B, 0xBA, 0xF2, 0x63, 0x9A, 0x19, 0x7C, 0xAE, 0xE5, 0xF5, 0xF7, 0x16, 0x6A, 0xA2, 0x39, 0xB6, 0x7B, 0x0F, 0xC1, 0x93, 0x81, 0x1B, 0xEE, 0xB4, 0x1A, 0xEA, 0xD0, 0x91, 0x2F, 0xB8, 0x55, 0xB9, 0xDA, 0x85, 0x3F, 0x41, 0xBF, 0xE0, 0x5A, 0x58, 0x80, 0x5F, 0x66, 0x0B, 0xD8, 0x90, 0x35, 0xD5, 0xC0, 0xA7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6D, 0x98, 0x9B, 0x76, 0x97, 0xFC, 0xB2, 0xC2, 0xB0, 0xFE, 0xDB, 0x20, 0xE1, 0xEB, 0xD6, 0xE4, 0xDD, 0x47, 0x4A, 0x1D, 0x42, 0xED, 0x9E, 0x6E, 0x49, 0x3C, 0xCD, 0x43, 0x27, 0xD2, 0x07, 0xD4, 0xDE, 0xC7, 0x67, 0x18, 0x89, 0xCB, 0x30, 0x1F, 0x8D, 0xC6, 0x8F, 0xAA, 0xC8, 0x74, 0xDC, 0xC9, 0x5D, 0x5C, 0x31, 0xA4, 0x70, 0x88, 0x61, 0x2C, 0x9F, 0x0D, 0x2B, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7D, 0x03, 0x40, 0x34, 0x4B, 0x1C, 0x73, 0xD1, 0xC4, 0xFD, 0x3B, 0xCC, 0xFB, 0x7F, 0xAB, 0xE6, 0x3E, 0x5B, 0xA5, 0xAD, 0x04, 0x23, 0x9C, 0x14, 0x51, 0x22, 0xF0, 0x29, 0x79, 0x71, 0x7E, 0xFF, 0x8C, 0x0E, 0xE2, 0x0C, 0xEF, 0xBC, 0x72, 0x75, 0x6F, 0x37, 0xA1, 0xEC, 0xD3, 0x8E, 0x62, 0x8B, 0x86, 0x10, 0xE8, 0x08, 0x77, 0x11, 0xBE, 0x92, 0x4F, 0x24, 0xC5, 0x32, 0x36, 0x9D, 0xCF, 0xF3, 0xA6, 0xBB, 0xAC, 0x5E, 0x6C, 0xA9, 0x13, 0x57, 0x25, 0xB5, 0xE3, 0xBD, 0xA8, 0x3A, 0x01, 0x05, 0x59, 0x2A, 0x46);
       
                public function base():void{
                        //чтение ключа                       
                        var t:ByteArray = new ByteArray();
                        t.writeUTFBytes(skey);
                        var l:uint=t.length;
                        var z:int = 10 - l;
                        for (var i:int = 0;i<z;i++){
                                t.writeByte(0);
                        }
                        var bkey:ByteArray = new ByteArray();
                        bkey.writeBytes(t,0,10);
                        //чтение информации
                        var bsecret:ByteArray = new ByteArray();
                        bsecret.writeUTFBytes(ssecret);
                        l = bsecret.length;
                        z = 8 - (l % 8);
                        for (i = 0;i<z;i++){
                                bsecret.writeByte(0);
                        }
                        //тест
                        trace(bsecret);
                        var c:ByteArray = new ByteArray();
                        for(i=0;i<l;i+=8){
                        t=new ByteArray();
                        t.writeBytes(bsecret,i,8);
                        c.writeBytes(coding(t,bkey));
                        }
                        trace(c);
                        var d:ByteArray = new ByteArray();
                        for(i=0;i<l;i+=8){
                        t=new ByteArray();
                        t.writeBytes(c,i,8);
                        d.writeBytes(decoding(t,bkey));
                        }
                        trace(d);
                       
                }
                //Кодирование
                public function coding(block:ByteArray,key:ByteArray):ByteArray{
                        block = A(block,key);
                        block = B(block,key);
                        block = A(block,key);
                        block = B(block,key);
                        return block;
                }
                //Декодирование
                public function decoding(block:ByteArray,key:ByteArray):ByteArray{
                        block = unB(block,key);
                        block = unA(block,key);
                        block = unB(block,key);
                        block = unA(block,key);
                        return block;
                }
                //Операция G
                private function G(word:uint,key:ByteArray,r:uint):uint{
                        for(var i:uint = 0;i<4;i++){
                                word^= key[(4*r+i)%10];
                                word=equ.indexOf(word)
                        }
                        return word;
                }
                //Декодирование G
                private function unG(word:uint,key:ByteArray,r:uint):uint{
                        for(var i:uint = 0;i<4;i++){
                                word=equ[word]
                                word^= key[(4*r+3-i)%10];
                        }
                        return word;
                }
                //Кодирование А
                private function A(block:ByteArray,key:ByteArray):ByteArray{
                        var buf:Array = new Array(2);
                        for(var i:uint=0;i<8;i++){
                                block[0]=G(block[0],key,i);
                                buf[0]=block[0];
                                buf[1]=block[1];
                               
                                block[0] ^= block[6];
                                block[1] ^= block[7];
                               
                                block[0] ^= i;
                                block[1] ^= i;
                               
                                block[6]=block[4];
                                block[7]=block[5];
                               
                                block[4]=block[2];
                                block[5]=block[3];
                               
                                block[2]=buf[0];
                                block[3]=buf[1];
                        }
                        return block;
                }
                //Декодирование А
                private function unA(block:ByteArray,key:ByteArray):ByteArray{
                        var buf:Array = new Array(2);
                        for(var i:uint=0;i<8;i++){
                                buf[0]=block[2];
                                buf[1]=block[3];
                               
                                block[2]=block[4];
                                block[3]=block[5];
                               
                                block[4]=block[6];
                                block[5]=block[7];

                                block[0] ^= 7-i;
                                block[1] ^= 7-i;
                               
                                block[6] = block[0] ^ buf[0]
                                block[7] = block[1] ^ buf[1]
                               
                                block[0] = unG(buf[0],key,7-i);
                                block[1] = buf[1];
                        }
                        return block;
                }
                //Кодирование В
                private function B(block:ByteArray,key:ByteArray):ByteArray{
                        var buf:Array = new Array(2);
                        for(var i:uint=0;i<8;i++){
                                block[1]=G(block[1],key,i);
                               
                                buf[0]=block[0];
                                buf[1]=block[1];
                               
                                buf[0] ^= i;
                                buf[1] ^= i;
                               
                                buf[0] ^= block[2];
                                buf[1] ^= block[3];
                               
                                block[2]=block[0];
                                block[3]=block[1];
                               
                                block[0]=block[6];
                                block[1]=block[7];
                               
                                block[6]=block[4];
                                block[7]=block[5];
                               
                                block[4]=buf[0];
                                block[5]=buf[1];
                        }
                        return block;
                }
                //Декодирование В
                private function unB(block:ByteArray,key:ByteArray):ByteArray{
                        var buf:Array = new Array(2);
                        for(var i:uint=0;i<8;i++){
                                buf[0] = block[4];
                                buf[1] = block[5];
                               
                                block[4]=block[6];
                                block[5]=block[7];
                               
                                block[6] = block[0];
                                block[7] = block[1];
                               
                                block[0]=block[2];
                                block[1]=block[3];
                               
                                block[1]=unG(block[1],key,7-i);
                               
                                block[2] ^=7-i;
                                block[3] ^=7-i;
                               
                                buf[0] ^= block[2];
                                buf[1] ^= block[3];
                               
                                block[2]=buf[0];
                                block[3]=buf[1];
                        }
                        return block;
                }
        }
}

jэ›Жo®…щpзрсвµ

Ноябрь 02.01.2008 09:55

Возможно ли картинку перевести в байт массив?

etc 02.01.2008 11:16

Цитата:

Сообщение от Ноябрь
Возможно ли картинку перевести в байт массив?

А что нам хелп по этому поводу говорит?

Ноябрь 02.01.2008 22:54

ну хорошо, у меня есть BitmapData, а как ее в клип добавить, чтобы видно было?

LokiDi L0ck 03.01.2008 00:32

Bitmap

Ноябрь 03.01.2008 03:34

уж тогда http://livedocs.adobe.com/flash/9.0/...ml#setPixels()
хм.. появилась проблема - после записи и чтения значения байт массива немного меняются...
типа так
6 148 59 175
6 127 42 170

записал в BitmapData методом setPixels() и тут же оттуда их прочел методом getPixels()

etc 03.01.2008 14:03

Ноябрь, вопрос вышел за рамки этой темы.
Создайте новую.


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

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