ошибка в RC4Encrypt из cryptohash.lib

Тема в разделе "WASM.CRYPTO", создана пользователем wasmer, 18 янв 2008.

  1. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    вот код функций шифрования/дешифрования RC4 из cryptohash.lib:
    Код (Text):
    1. RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD
    2.     mov edi,pBlock
    3.     mov edx,rc4_x
    4.     mov ecx,dwBlockLen
    5.     mov ebx,rc4_y
    6.     dec edi
    7.     xor eax,eax
    8.     .repeat
    9.         add bl,rc4_key[edx+1]
    10.         mov al,rc4_key[edx+1]
    11.         mov ch,rc4_key[ebx]
    12.         mov rc4_key[ebx],al
    13.         mov rc4_key[edx+1],ch
    14.         add al,ch
    15.         inc edi
    16.         mov al,rc4_key[eax]
    17.         inc dl
    18.         xor [edi],al
    19.         dec cl
    20.     .until zero?
    21.     mov rc4_x,edx
    22.     mov rc4_y,ebx
    23.     ret
    24. RC4Encrypt endp
    25. RC4Decrypt equ <RC4Encrypt>
    нормально мне удаётся расшифровать только 218 байт
    подозреваю что надо чем-то заменить edx+1 но вот чем?
     
  2. Ruptor

    Ruptor Marcos el Ruptor

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    167
    Адрес:
    Australia
    uberi edx+1
    dolzhno bit inc edx, and edx,0xFF
    ili prosto inc dl perenesi v samiy verh cikla
     
  3. wasmer

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    это помогло, спасибо
    вот исправленный код
    Код (Text):
    1. RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD
    2.     mov edi,pBlock
    3.     mov edx,rc4_x
    4.     mov ecx,dwBlockLen
    5.     mov ebx,rc4_y
    6.     dec edi
    7.     xor eax,eax
    8.     .repeat
    9.         inc dl
    10.         add bl,rc4_key[edx]
    11.         mov al,rc4_key[edx]
    12.         mov ch,rc4_key[ebx]
    13.         mov rc4_key[ebx],al
    14.         mov rc4_key[edx],ch
    15.         add al,ch
    16.         inc edi
    17.         mov al,rc4_key[eax]
    18.         xor [edi],al
    19.         dec cl
    20.     .until zero?
    21.     mov rc4_x,edx
    22.     mov rc4_y,ebx
    23.     ret
    24. RC4Encrypt endp
    25. RC4Decrypt equ <RC4Encrypt>
     
  4. Ruptor

    Ruptor Marcos el Ruptor

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    167
    Адрес:
    Australia
    Там разве нет penalty за изменение dl когда edx в следующей же инструкции как индекс используется? Разве inc edx / and edx,0xFF не быстрее? Я конечно не большой специалист по оптимизации ассемблера на новых процессорах, отстал от жизни, но если нужна скорость, советую проверить. По-моему если все операции с регистрами сделать по 32 бита, то может быть быстрее...
     
  5. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.732
    Что то не работает исправленный вариант.
     
  6. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.732
    Вот как я исправил:

    Код (Text):
    1. RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD
    2.     mov edi,pBlock
    3.     mov edx,rc4_x
    4.     mov ecx,dwBlockLen
    5.     mov ebx,rc4_y
    6.     dec edi
    7.     xor eax,eax
    8. codeks:
    9.            push ecx
    10.                 inc dl
    11.         add bl,rc4_key[edx]
    12.         mov al,rc4_key[edx]
    13.         mov ch,rc4_key[ebx]
    14.         mov rc4_key[ebx],al
    15.         mov rc4_key[edx],ch
    16.         add al,ch
    17.         inc edi
    18.         mov al,rc4_key[eax]
    19.         xor [edi],al
    20.         dec cl
    21.                pop ecx
    22.  
    23.     loop codeks
    24.  
    25.     mov rc4_x,edx
    26.     mov rc4_y,ebx
    27.     ret
    28. RC4Encrypt endp
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    asmlamo
    Код (Text):
    1. ...
    2. dec cl    ;; это зачем?
    3. pop ecx
    4. ...
     
  8. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.732
    dec cl - это было изначально.


    Собственно в этом то и ошибка.

    dec cl
    .until zero?

    Выход из цикла при обнулении cl

    А количество байт которое нужно зашифровать мы передаем в ECX.

    Вот оно и вываливается из цикла раньше срока (по факту обнуления cl).

    Больше чем 256 байт не зашифруеш cl не позволяет.