вот код функций шифрования/дешифрования RC4 из cryptohash.lib: Код (Text): RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD mov edi,pBlock mov edx,rc4_x mov ecx,dwBlockLen mov ebx,rc4_y dec edi xor eax,eax .repeat add bl,rc4_key[edx+1] mov al,rc4_key[edx+1] mov ch,rc4_key[ebx] mov rc4_key[ebx],al mov rc4_key[edx+1],ch add al,ch inc edi mov al,rc4_key[eax] inc dl xor [edi],al dec cl .until zero? mov rc4_x,edx mov rc4_y,ebx ret RC4Encrypt endp RC4Decrypt equ <RC4Encrypt> нормально мне удаётся расшифровать только 218 байт подозреваю что надо чем-то заменить edx+1 но вот чем?
это помогло, спасибо вот исправленный код Код (Text): RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD mov edi,pBlock mov edx,rc4_x mov ecx,dwBlockLen mov ebx,rc4_y dec edi xor eax,eax .repeat inc dl add bl,rc4_key[edx] mov al,rc4_key[edx] mov ch,rc4_key[ebx] mov rc4_key[ebx],al mov rc4_key[edx],ch add al,ch inc edi mov al,rc4_key[eax] xor [edi],al dec cl .until zero? mov rc4_x,edx mov rc4_y,ebx ret RC4Encrypt endp RC4Decrypt equ <RC4Encrypt>
Там разве нет penalty за изменение dl когда edx в следующей же инструкции как индекс используется? Разве inc edx / and edx,0xFF не быстрее? Я конечно не большой специалист по оптимизации ассемблера на новых процессорах, отстал от жизни, но если нужна скорость, советую проверить. По-моему если все операции с регистрами сделать по 32 бита, то может быть быстрее...
Вот как я исправил: Код (Text): RC4Encrypt proc uses esi edi ebx pBlock:DWORD,dwBlockLen:DWORD mov edi,pBlock mov edx,rc4_x mov ecx,dwBlockLen mov ebx,rc4_y dec edi xor eax,eax codeks: push ecx inc dl add bl,rc4_key[edx] mov al,rc4_key[edx] mov ch,rc4_key[ebx] mov rc4_key[ebx],al mov rc4_key[edx],ch add al,ch inc edi mov al,rc4_key[eax] xor [edi],al dec cl pop ecx loop codeks mov rc4_x,edx mov rc4_y,ebx ret RC4Encrypt endp
dec cl - это было изначально. Собственно в этом то и ошибка. dec cl .until zero? Выход из цикла при обнулении cl А количество байт которое нужно зашифровать мы передаем в ECX. Вот оно и вываливается из цикла раньше срока (по факту обнуления cl). Больше чем 256 байт не зашифруеш cl не позволяет.