RC4

Discussion in 'WASM.CRYPTO' started by loleg, Mar 22, 2007.

  1. loleg

    loleg New Member

    Blog Posts:
    0
    Joined:
    Nov 17, 2006
    Messages:
    93
    вобщем, ситуация такова:

    шаг1:
    ввожу в проге пароль, он гамируется и переводится в клю4 вида

    00A1E7B0 EF 2A BA 75 96 01 00 00 28 5A A1 00 1C 00 00 00 п*єu–..(ZЎ.... //"123456"

    00A1E7B0 EF 2A BA 75 96 00 4D 00 28 5A A1 00 1C 00 00 00 п*єu–.M.(ZЎ.... //"12345"

    00A220C8 EF 2A BA 75 16 00 00 00 01 00 00 00 07 00 00 00 п*єu......... //"1234"

    дальше непосредственно его перестановками создается S-Box на 100h

    шаг2: с S-box 8ю циклами по 20 проходов генерируется по одному байту за проход результируещего клю4а

    дальше 64байтный клю4 сравнивается с известным эталонным

    подмена результата не катит, зада4а - узнать нужный пас под известный коне4ный результат(брут также актуален)

    кто уже имел дело с RC4, просьба истолковать 4то в данном слу4ае будет зашифрованным текстом, а 4то клю4ем(ведь тут юзается шифровка и паралельно дешифровка)

    если нужно - есть сама прога, примеры паролей\гаммированых клю4ей к ним\дампы S-box
     
  2. Perre

    Perre New Member

    Blog Posts:
    0
    Joined:
    Apr 6, 2007
    Messages:
    100
    Нашел подходящею тему для своего вопроса,
    Если не лень, и вы знаете делфи пожалуйста объясните как работает эта прога шифрования RC4, мне надо переписать её на асм, но я понятия не имею что это:


    Code (Text):
    1. var str,str_dec:array[0..MAX_MSG_SIZE-1] of byte;
    2. {str,str_dec - массивы в которых лежат сообщения (кодированное и декодированное соответсвенно)}
    3.  
    4. procedure DecodeMessage(leng:integer);
    5. //leng - длина закодированного пакета
    6. const s:string='text'; //ключ
    7. var i,j,sw:byte;
    8.     KeyLen,k:word;
    9.     fs:array [0..255] of byte;
    10. begin
    11.  {$R-}
    12.  KeyLen:=Length(s);
    13.  j:=0;
    14.  for i:=0 to 255 do fs[i]:=i;
    15.  for i:=0 to 255 do
    16.   begin
    17.    j:=j+fs[i]+byte(s[(i mod KeyLen)+1]);
    18.    sw:=fs[i];
    19.    fs[i]:=fs[j];
    20.    fs[j]:=sw;
    21.   end;
    22.  i:=0;
    23.  j:=0;
    24.  for k:=0 to (leng-1) do
    25.   begin
    26.    i:=i+1;
    27.    j:=j+fs[i];
    28.    sw:=fs[i];
    29.    fs[i]:=fs[j];
    30.    fs[j]:=sw;
    31.    sw:=fs[i]+fs[j];
    32.    str_dec[k]:=fs[sw] xor str[k];
    33.   end;
    34. end;
     
  3. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    найди на vx.netlux.org в журнале 29A-8 исходники Beagle - он написан на асме и использует этот алгоритм
     
  4. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    MSoft, по моему Beagle - это вобще кладезь знаней :)
    Perre, а что там сложного? инициализируецо ключ на 255 байтов путем 255 перестановок (зависящих от ключа) масива заполненного индексами элемента. а потом сообщение декодируется с помощью этого массива, при чем во время расшифровки массив опять же перетасовуецо
     
  5. Perre

    Perre New Member

    Blog Posts:
    0
    Joined:
    Apr 6, 2007
    Messages:
    100
    MSoft
    Спасибо поищю

    FreeManCPM "масива заполненного индексами элемента" - Насколько я понял – ключ копируется в массив до тех пор, пока не заполнит весь массив (255 байт), а потом:
    Берём байт из не кодированной строки, берём байт из массива который мы получили, делаем xor и записываем в в кодированную строку, добавляем смещение по всем трём массивам, и если не вылезли за пределы строки исходных данных повторяем всё с начала
    ?
     
  6. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    Perre, ну очень приблизительно. ключ не копируецо, а задает перестановки, никакого смещения не добавляецо. делаюцо только перестановки массива fs.
     
  7. Perre

    Perre New Member

    Blog Posts:
    0
    Joined:
    Apr 6, 2007
    Messages:
    100
    ещё не разобрался, но помоему это оно

    Code (Text):
    1. ; Simple RC4 implementation, Peter Gutmann, 21 September 1995.
    2. ; This code was written in about 30 minutes as a testbed for an asm.RC4.  It
    3. ; uses a static data area as the key so it's not terribly practical as it
    4. ; stands.  In addition, the RC4 algorithm leads to an almost solid block of
    5. ; pipeline stalls on anything >= '486, so I wouldn't recommend using it on
    6. ; anything except perhaps 8-bit microcontrollers and smart cards.
    7.  
    8.                 INCLUDE MISC.INC
    9.                 MODULE RC4
    10.  
    11.                 PUBLIC _rc4expandKey, _rc4crypt
    12.  
    13.                 DATA
    14.  
    15. ; The RC4 keying information
    16.  
    17. rc4key  DB              256 DUP (?)
    18. rc4x    DB              0
    19. rc4y    DB              0
    20.  
    21.                 CODE
    22.  
    23. ; void rc4ExpandKey( unsigned char const *key, int keylen )
    24.  
    25. _rc4expandKey PROCEDURE
    26.         push bp
    27.         mov bp, sp
    28.         push si
    29.         push di                                                 ; Save register vars
    30.         les si, [bp+4]                                  ; ES:SI = key
    31.         mov dx, [bp+8]                                  ; DX = keylen
    32.         mov dh, dl                                              ; keylenTmp = keylen
    33.  
    34.         ; rc4word y = 0;
    35.         xor ax, ax                                              ; y = 0
    36.         sub di, di                                              ; DI = AX as an index register
    37.  
    38.         ; for( x = 0; x < 256; x++ )
    39.         ;       rc4key[ x ] = x;
    40.         xor bx, bx                                              ; x = 0
    41. @@initLoop:
    42.         mov rc4key[bx], bl                              ; rc4key[ x ] = x
    43.         inc bl                                                  ; x++
    44.         jnz SHORT @@initLoop
    45.  
    46.         ; for( x = 0; x < 256; x++ )
    47.         ;       {
    48.         ;       sx = rc4key[ x ];
    49.         ;       y += sx + key[ keypos ];
    50.         ;       rc4key[ x ] = rc4key[ y ];
    51.         ;       rc4key[ y ] = sx;
    52.         ;
    53.         ;       if( ++keypos == keylen )
    54.         ;               keypos = 0;
    55.         ;       }
    56. @@keyLoop:
    57.         mov cl, rc4key[bx]                              ; sx = rc4key[ x ]
    58.         add al, es:[si]                                 ; y += key[ keypos ]
    59.         add al, cl                                              ; y += sx
    60.         mov di, ax
    61.         mov ch, rc4key[di]                              ; temp = rc4key[ y ]
    62.         mov rc4key[bx], ch                              ; rc4key[ x ] = temp
    63.         mov rc4key[di], cl                              ; rc4key[ y ] = sx
    64.         inc si                                                  ; ++keypos
    65.         dec dh                                                  ; keylenTmp--
    66.         jnz SHORT @@noResetKeypos               ; if( !keylenTmp )
    67.         sub si, dx                                              ; keypos = 0
    68.         mov dh, dl                                              ; keylenTmp = keylen
    69. @@noResetKeypos:
    70.         inc bl                                                  ; x++
    71.         jnz SHORT @@keyLoop
    72.  
    73.         ; rc4->x = rc4->y = 0;
    74.         mov rc4x, bl                                    ; rc4->x = 0
    75.         mov rc4y, bl                                    ; rc4->y = 0
    76.  
    77.         pop di
    78.         pop si                                                  ; Restore register vars
    79.         pop bp
    80.         ret
    81. _rc4expandKey ENDP
    82.  
    83. ; void rc4Crypt( unsigned char *data, int len )
    84.  
    85. _rc4crypt PROCEDURE
    86.         push bp
    87.         mov bp, sp
    88.         push si
    89.         push di                                                 ; Save register vars
    90.         les si, [bp+4]                                  ; ES:SI = data
    91.         mov dx, [bp+8]                                  ; DX = len
    92.         test dx, dx                                             ; Check that len != 0
    93.         jz SHORT @@exit                                 ; Yes, exit now
    94.  
    95.         xor bx, bx
    96.         mov bl, rc4x                                    ; BX = rc4x
    97.         xor ax, ax
    98.         mov al, rc4y                                    ; AX = rc4y
    99.         xor di, di                                              ; DI = AX as an index register
    100.  
    101.         ; while( len-- )
    102.         ;       {
    103.         ;       x++;
    104.         ;       sx = rc4key[ x ];
    105.         ;       y += sx;
    106.         ;       sy = rc4key[ y ];
    107.         ;       rc4key[ y ] = sx;
    108.         ;       rc4key[ x ] = sy;
    109.         ;       *data++ ^= rc4key[ ( sx + sy ) & 0xFF ];
    110.         ;       }
    111. @@rc4loop:
    112.         inc bl                                                  ; x++
    113.         mov cl, rc4key[bx]                              ; sx = rc4key[ x ]
    114.         add al, cl                                              ; y += sx
    115.         mov di, ax
    116.         mov ch, rc4key[di]                              ; sy = rc4key[ y ]
    117.         mov rc4key[di], cl                              ; rc4key[ y ] = sx
    118.         mov rc4key[bx], ch                              ; rc4key[ x ] = sy
    119.         add cl, ch
    120.         xor ch, ch
    121.         mov di, cx                                              ; temp = ( sx + sy ) & 0xFF
    122.         mov cl, rc4key[di]
    123.         xor es:[si], cl                                 ; *data ^= rc4key[ temp ]
    124.         inc si                                                  ; data++
    125.         dec dx                                                  ; len--
    126.         jnz SHORT @@rc4loop
    127.  
    128.         mov rc4x, bl
    129.         mov rc4y, al                                    ; Remember x and y values
    130.  
    131. @@exit:
    132.         pop di
    133.         pop si                                                  ; Restore register vars
    134.         pop bp
    135.         ret
    136. _rc4crypt ENDP
    137. ENDMODULE
     
  8. Perre

    Perre New Member

    Blog Posts:
    0
    Joined:
    Apr 6, 2007
    Messages:
    100
    и для 64х разрядных

    Code (Text):
    1. format MS64 COFF
    2.  
    3. include '%fasminc%\win32a.inc'
    4.  
    5. public rc4_prepare_key as 'rc4_prepare_key'
    6. public rc4_crypt       as 'rc4_crypt'
    7.  
    8. struct rc4_key
    9.   state rb 256
    10.   x db ?
    11.   y db ?
    12. ends
    13.  
    14. rc4_prepare_key: ; u_char *key_data, int key_len, rc4_key *key
    15.   push      rbx
    16.   mov       [r8+rc4_key.x], 0
    17.   mov       [r8+rc4_key.y], 0
    18.   mov       ebx, edx
    19.   ; create initial state
    20.   xor       r11, r11
    21. @@:
    22.   mov       byte [r8+r11], r11b
    23.   inc       r11
    24.   cmp       r11, 255
    25.   jbe       @B
    26.   ; r9  - idx1, r10 - idx2
    27.   xor       r9, r9
    28.   xor       r10, r10
    29.   ; mix state and key data
    30.   xor       r11, r11
    31. @@:
    32.   add       r10b, byte [rcx+r9] ; idx2 += key_data[idx1]
    33.   mov       al, byte [r8+r11]   ; t = state[num]
    34.   add       r10b, al        ; idx2 += t
    35.   mov       dl, byte [r8+r10]   ; z = state[idx2]
    36.   mov       byte [r8+r10], al   ; state[idx2] = t
    37.   mov       byte [r8+r11], dl   ; state[num] = z
    38.   lea       eax, [r9d+1]    ;
    39.   div       bl          ;
    40.   shr       eax, 8      ; idx1 = (idx1 + 1) % key_len;
    41.   mov       r9b, al     ;
    42.   inc       r11
    43.   cmp       r11, 255
    44.   jbe       @B
    45.   pop       rbx
    46.   ret
    47.  
    48.  
    49. rc4_crypt:   ; u_char *buf, int len, rc4_key *key
    50.   ; load params
    51.   movzx     r9,  byte [r8+rc4_key.x]
    52.   movzx     r10, byte [r8+rc4_key.y]
    53.   xor       rax, rax
    54.   ; crypt loop
    55. @@:
    56.   inc       r9b                ; x++
    57.   mov       al, byte [r8+r9]           ; t = state[x]
    58.   add       r10b, al               ; y += t
    59.   mov       r11b, byte [r8+r10]        ; z = state[y]
    60.   mov       byte [r8+r9], r11b         ; state[x] = z
    61.   mov       byte [r8+r10], al          ; state[y] = t
    62.   add       al, r11b               ; idx = t+z
    63.   mov       al, byte [r8+rax]          ;
    64.   xor       byte [rcx], al         ; *buf ^= state[idx]
    65.   inc       rcx                ;  buf++
    66.   dec       rdx                ;  len--
    67.   jnz       @B
    68.   ; store params
    69.   mov       byte [r8+rc4_key.x], r9b
    70.   mov       byte [r8+rc4_key.y], r10b
    71.   ret
     
  9. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    Perre, даешь для 32 :)
     
  10. Perre

    Perre New Member

    Blog Posts:
    0
    Joined:
    Apr 6, 2007
    Messages:
    100
    :), когда руки дойдут сделаю (пока на другое переключился)
     
  11. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    FreeManCPM
    а что, найти алгоритм щас сложно? на васме лежит исходник. cryptohash назиывается - там и RC4 для 32 рализован. Или тут о другом говорят?
     
  12. UyTvGauG

    UyTvGauG New Member

    Blog Posts:
    0
    Joined:
    May 17, 2007
    Messages:
    49
    А взять оттуда, откуда взял этот код, слабо чтоли?
    http://www.wasm.ru/forum/viewtopic.php?pid=132049
     
  13. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    MSoft, пусть человек тренируецо. переписовать крипто-алго(оптимизируя) полезно, развивает мышление.
     
  14. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    FreeManCPM
    Я знаю. Сам такой же ерундой щас с Rijndael страдаю. :)
     
  15. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    посмотрел исход на делфе, испугалсо обилия таблиц
     
  16. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    Да таблицы не самое сложное. Меня щас пугает расширение ключа. Я думал, первоначально обычный ключ расширяетс по строкам. Т.е. первые 4 байта начального ключа - первая строка расширенного. Однако в одной статье прочитал, что первый 4 байта оригинального - первый столбец расширенного. Вот щас медитирую, не напутал ли чего-нибудь с массивами ранее... и еще голова болит, как это на асме написать