Hàm F có thể được định nghĩa bằng cách dùng “+” thay vì “v” từ XY và notXZ thì sẽ không bao giờ có 1’s trong vị trí bit giống như thế.. Chú ý quan tâm rằng nếu các bits của X,Y và Z là i
Trang 1mov byte ptr [edi-1],080h <<<padding vào byte đầu tiên = 80h
xor edx,edx <<< edx=0
mov ebx,64 <<< ebx=64 (64byte=512bit) , ở đây tính tóan hệ số p trong biểu thức ( p*512+448) bits
div ebx <<< chia eax/ebx=eax/64 : thương số chứa trong eax, số dư chứa trong edx
neg edx <<< edx=-edx
add edx,64 <<<edx=64+edx=64+(-edx ở bước trên)
cmp edx,8 <<< so sánh edx với 8
jae @f <<< Nếu >= thì nhảy đến @@
;Đến đây các bạn hảy chú ý rằng : nếu phần dư khi chia cho 64 chứa trong edx phải
từ khỏang 0->56byte(488bit) thì ok và p=eax ,còn nếu trong khỏang 56->64 (64-56=8byte) thì p=eax+1 tức là edx+64
add edx,64
@@: mov ecx,edx <<<ecx=edx : khởi tạo biến đếm để padding set các bit = 0 xor al,al <<< al=0
rep stosb <<< set al=0 vào các bit padding trong ES:DI, luu từ trái qua phải và tăng
DI (EDI)
mov eax,dtBufferLength <<<eax= dtBufferLength
inc edx <<< edx=edx+1
add dtBufferLength,edx <<< dtBufferLength= dtBufferLength + edx
xor edx,edx <<< edx=0
mov ebx,8 <<< ebx=8 : để chuyển chiều dài sang dạng hex (b*8)
mul ebx <<< eax=eax*ebx=eax*8
mov dword ptr [edi-8],eax <<< padding 1word=Chiều dài b đã đổi sang dạng số hex vào
Trang 2mov dword ptr [edi-4],edx <<< padding 1word = 0 vào
mov edx,dtBufferLength <<<edx= dtBufferLength
mov edi,ptBuffer <<<edi= ptBuffer
3.3 Bước 3: Khởi tạo giá trị đầu tiên cho MD Buffer :
Bộ đệm buffer của tín hiệu MD có 4-word (A,B,C,D) Chúng được sử dụng để tính tóan tín hiệu MD Ở đây mỗi A,B,C,D được gọi là register 32-bit Các registers này được khởi tạo giá trị đầu tiên với giá trị là số hexa như sau:
Word A: 01 23 45 67
Word B: 89 ab cd ef
Word C: fe dc ba 98
Word D: 76 54 32 10
Trong ASM:
; phase II · chaining variables initialization
mov esi,ptMD5Result
assume esi:ptr MD5RESULT
mov [esi].dtA,067452301h
mov [esi].dtB,0efcdab89h
mov [esi].dtC,098badcfeh
mov [esi].dtD,010325476h
3.4 Bước 4: Qui trình tính tóan tín hiệu trong khối 16-words Blocks
Như trên chúng ta biết p là số blocks của khối 16-words Blocks Vậy bước này là tiến trình tính tóan “ xáo trộn” các khối 16-word Blocks.Thường thì p=0 các bạn nên nhớ điều đó
Đầu tiên chúng ta định nghĩa các hàm bổ trợ mà mỗi một lần chúng lấy 3 word
Trang 332-bit và sinh ra một word 32-32-bit
F(X,Y,Z)=XY v not(X) Z
G(X,Y,Z)=XZ v Y not(Z)
H(X,Y,Z)=X xor Y xor Z
I(X,Y,Z)=Y xor (X v not (Z))
Đọan này các bạn tham khảo thêm về mặt tóan học của MD5 , sau đây tui chỉ dịch theo tài liệu để các bạn tiện tham khảo:
Trong mỗi một lần tính tóan , hàm F họat động như một điều kiện : Nếu X thỏa thì
là Y, khác thì là Z (if x then Y else Z) Hàm F có thể được định nghĩa bằng cách dùng “+” thay vì “v” từ XY và not(X)Z thì sẽ không bao giờ có 1’s trong vị trí bit giống như thế Chú ý quan tâm rằng nếu các bits của X,Y và Z là imdependent và unbiased,thì mỗi bit của hàm F(X,Y,Z) cũng sẽ là independent và unbiased
Hàm G,H và I cũng tương tự như hàm F, chúng họat động như tóan hạng so sánh bit sẽ sinh ra một output từ các bits của X,Y và Z như là một lọai mà nếu các bits tương ứng của X,Y và Z là independent và unbiased thì mỗi bit của hàm
G(X,Y,Z),H(X,Y,Z) và I(X,Y,Z) sẽ là independent và unbiased Chú ý rằng hàm H
là tóan hạng thao tác trên bit là “xor” hay là một hàm “tương đương”của chính inputs
Đây là bước sử dụng bảng T[1…64] được xây dựng từ hàm sin T[i] biểu thị cho phần tử thứ i của bảng T và bằng :
T[i]=int(4294967296*(asb(sin(i))) với i là radians
Những phần tử của mảng này cho ở phần phụ lục
Thực hiện theo các bước thao tác sau:
/*Qui trình trên mỗi 16-word block */
For i = 0 to N/16-1 do
/* Copy block i vào X */
For j = 0 to 15 do
Trang 4Set X[j] to M[i*16+j]
end /* Kết thúc vòng lặp j */
/* Lưu A vào AA, B vào BB, C vào CC, và D vào DD */
AA = A
BB = B
CC = C
DD = D
/* Round 1 */
/* Với [abcd k s i] biểu thị cho họat động :
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s) */
/* Thực hiện 16 họat động như dưới đây */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
/* Round 2 */
/* Với [abcd k s i] biểu thị cho họat động :
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s) */
/* Thực hiện 16 họat động như dưới đây */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
/* Round 3 */
/* Với [abcd k s i] biểu thị cho họat động :
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s) */
/* Thực hiện 16 họat động như dưới đây */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
Trang 5/* Round 4 */
/* Với [abcd k s i] biểu thị cho họat động :
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s) */
/* Thực hiện 16 họat động như dưới đây */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
/* Rồi thi hành phép cộng như dưới đây (Đó là gia tăng mỗi 4 register bằng giá trị
đã có trước khi block này bắt đầu*/
A = A + AA
B = B + BB
C = C + CC
D = D + DD
end /* kết thúc vòng lặp i */
Trong ASM:
; phase III · hashing
hashloop: mov eax,[esi].dtA
mov dta,eax
mov eax,[esi].dtB
mov dtb,eax
mov eax,[esi].dtC
mov dtc,eax
mov eax,[esi].dtD
mov dtd,eax
; round 1
FF dta,dtb,dtc,dtd,dword ptr [edi+00*4],07,0d76aa478h
FF dtd,dta,dtb,dtc,dword ptr [edi+01*4],12,0e8c7b756h
FF dtc,dtd,dta,dtb,dword ptr [edi+02*4],17,0242070dbh
Trang 6FF dtb,dtc,dtd,dta,dword ptr [edi+03*4],22,0c1bdceeeh
FF dta,dtb,dtc,dtd,dword ptr [edi+04*4],07,0f57c0fafh
FF dtd,dta,dtb,dtc,dword ptr [edi+05*4],12,04787c62ah
FF dtc,dtd,dta,dtb,dword ptr [edi+06*4],17,0a8304613h
FF dtb,dtc,dtd,dta,dword ptr [edi+07*4],22,0fd469501h
FF dta,dtb,dtc,dtd,dword ptr [edi+08*4],07,0698098d8h
FF dtd,dta,dtb,dtc,dword ptr [edi+09*4],12,08b44f7afh
FF dtc,dtd,dta,dtb,dword ptr [edi+10*4],17,0ffff5bb1h
FF dtb,dtc,dtd,dta,dword ptr [edi+11*4],22,0895cd7beh
FF dta,dtb,dtc,dtd,dword ptr [edi+12*4],07,06b901122h
FF dtd,dta,dtb,dtc,dword ptr [edi+13*4],12,0fd987193h
FF dtc,dtd,dta,dtb,dword ptr [edi+14*4],17,0a679438eh
FF dtb,dtc,dtd,dta,dword ptr [edi+15*4],22,049b40821h
; round 2
GG dta,dtb,dtc,dtd,dword ptr [edi+01*4],05,0f61e2562h
GG dtd,dta,dtb,dtc,dword ptr [edi+06*4],09,0c040b340h
GG dtc,dtd,dta,dtb,dword ptr [edi+11*4],14,0265e5a51h
GG dtb,dtc,dtd,dta,dword ptr [edi+00*4],20,0e9b6c7aah
GG dta,dtb,dtc,dtd,dword ptr [edi+05*4],05,0d62f105dh
GG dtd,dta,dtb,dtc,dword ptr [edi+10*4],09,002441453h
GG dtc,dtd,dta,dtb,dword ptr [edi+15*4],14,0d8a1e681h
GG dtb,dtc,dtd,dta,dword ptr [edi+04*4],20,0e7d3fbc8h
GG dta,dtb,dtc,dtd,dword ptr [edi+09*4],05,021e1cde6h
GG dtd,dta,dtb,dtc,dword ptr [edi+14*4],09,0c33707d6h