1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| ; RC4 Cipher
; #########################################################################
rc4_state struct
x BYTE ?
y BYTE ?
m BYTE 256 dup(?)
rc4_state ends
; Reset RC4 state, initialize encryption key
RC4Setup proc uses esi edi ebx state, key, len: DWORD
LOCAL a: BYTE
LOCAL j: BYTE
invoke ZeroMemory, state, sizeof rc4_state
mov edi, state
inc edi
inc edi ; m
xor edx, edx
mov ecx, 256
@l:
mov byte ptr[edi+edx], dl
inc dl
loop @l
mov edi, state
inc edi
inc edi ; m
mov esi, key
mov j, 0
xor ecx, ecx ; k
xor ebx, ebx ; i
@l_gen:
mov al, byte ptr[edi+ebx]
mov a, al
add j, al
mov al, byte ptr[esi+ecx]
add j, al
movzx edx, j
mov al, byte ptr[edi+edx]
mov byte ptr[edi+ebx], al
mov al, a
mov byte ptr[edi+edx], al
inc ecx
.IF ecx >= len
xor ecx, ecx
.ENDIF
inc bl
jnz @l_gen
ret
RC4Setup endp
; Crypt data using RC4 algorithm & update the state
RC4Crypt proc uses ebx esi edi state, cdata, len: DWORD
LOCAL a: BYTE
LOCAL b: BYTE
LOCAL x: BYTE
LOCAL y: BYTE
LOCAL i: DWORD
mov ebx, state
assume ebx: ptr rc4_state
mov al, [ebx].x
mov x, al
mov al, [ebx].y
mov y, al
mov edi, ebx
inc edi
inc edi
mov esi, cdata
mov i, 0
mov ecx, len
jecxz @no_data
@l:
; x = (unsigned char) ( x + 1 ); a = m[x];
inc x
movzx eax, x
movzx edx, byte ptr[edi+eax] ; a
mov a, dl
; y = (unsigned char) ( y + a );
add y, dl
; m[x] = b = m[y];
movzx eax, y
mov dl, byte ptr[edi+eax]
mov b, dl
movzx eax, x
mov byte ptr[edi+eax], dl
; m[y] = a;
movzx eax, y
mov dl, a
mov byte ptr[edi+eax], dl
; data[i] ^= m[(unsigned char) ( a + b )];
mov dl, a
add dl, b
mov dl, byte ptr[edi+edx]
mov eax, i
xor byte ptr[esi+eax], dl
inc i
loop @l
@no_data:
mov al, x
mov byte ptr[ebx], al
mov al, y
mov byte ptr[ebx+1], al
ret
RC4Crypt endp |
Partager