mov 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 mov 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 32- bit và sinh ra một word 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 Set 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] /* 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 FF 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 . [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 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. 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