Xem mẫu

thức, thì chúng ta sẽ hình dung trong đầu chúng ta như sau: x_{i+1}. Tương tự , chúng ta dùng ^ cho chỉ số trên (superscripts) (số mũ) , x^i là “x mũ i” (x lũy thừa i). Dấu “+” là phép cộng các words . X<< hoặc =0). -Sau khi thêm các bit padding vào tín hiệu cho nó có dạng như trên , set bit đầu tiên bằng 1 và các bits sau đó = 0 Sau đây là một số ghi chú tui tính sẳn để các bạn tham khảo: 512-bit = 64-byte = 64-char 448-bit = 56-byte = 112-charHex 128-bit = 16-byte = 32-charHex (32 ký tự hexa) 64-bit = 8-byte 32-bit = 4-byte (giá trị một thanh ghi) = 8-charHex 8-bit = 1-byte 1-char( 1 ký tự nhập vào ANSI) = 1-byte 1-charHex (Một ký tự hexa 0-9 và a-f) = ½ byte = 4-bit 1-byte = 2-charHex = 1-char 1-word = 4-byte (Bảng 1) Ví dụ : Giả sử tín hiệu input là chuổi string : hello Chúng được biểu thị bằng số hexa như sau: hello = 68 65 6c 6c 6f ( 10 charHex = 10*4-bit=40-bit) -Với biểu thức p*512+488 ; do tín hiệu chỉ có 40-bit nên p=0 trong trường hợp này. ( thường thì p=0 do chuổi nhấp vào ko quá 64 ký tự char); do đó để để mở rộng chuối ta cần padding thêm 488-40=448-bit nữa. -Bước kế tiếp là set các bit padding: bit đầu tiên thêm vào có giá trị = 1 và các bit sau nó có giá trị = ko Bây giờ tui viết lại chuổi padded dưới dạng số hex như sau: Chú ý số hex đầu tiên được padding có dạng bit như sau : 1000 (dạng bit)(1-charHex=4bit, bit đầu =1, 3 bit sau =0). Vậy 1000=1*2^3+0*2^2+0*2^1+0*2^0=0x80 (hay 80h) Các số hex sau có dạng : 00 Ta viết lại chuổi đã padded như sau: 68 65 6c 6c 6f 80 00 00 00 ….. 00 00 (tổng cộng 488-bit=56byte=112-charHex) 448-bit padded Ghi chú : ở đây bạn chú ý đến số 80h thêm vào đầu tiên, vì trong lập trình chúng ta dùng số hex chứ ko thao tác trên bit. 3.2 Bước 2: Thêm vào giá trị chiều dài của chuổi nhập input sau chuổi tạo ra ở bước trên Như trên tui đã nói, b là chiều dài của chuổi đã nhập. Đổi b ra dạng 64 – bit. Và 64-bit này được sử dụng thêm vào sau cùng chuổi đã padding ở bước 1. Trong trường hợp b lớn hơn 2^64 thì chỉ lấy 64-bit low-order thêm vào. Tại thời điểm này , chuổi đã padding có dạng (p*512+488+64) bit =(p*512+512) bit = 512*(p+1) bits Vậy chiều dài bit của chuổi là một bội số của 512 bits ( thường p=0 như trên tui đã nói) Cũng có thể nói, tín hiệu này là có chiều dài là bội số của 16-word (32-bit) Ta có thể dùng mãng : M[0…N-1] biểu thị cho các words của kết quả padding 2 bước trên (N là bội số của 16). Ghi chú: p trong biểu thức 512*(p+1) bits còn gọi là số blocks của khối “16-word Bolcks” (16-word=512bit) Ví dụ: Tiếp tục với ví dụ chuổi hello, ta có chiều dài chuổi hello là b=5. Chiều dài bit của chuổi hello là : b=5*8=40; đổi ra số hexa là 28. Viết lại theo dạng 2-word (64-bit) là : 00 00 00 28. Vậy ta thêm 2 words trên vào cuối chuổi đã padding ở bước 1 . Ta có theo số hex 68 65 6c 6c 6f 80 00 00 00 ….. 00 00 00 00 00 28 40bit 448-bit 64-bit = 512 bits Trong ASM: Tôi chọn ASM làm ngôn ngữ mô tả cho thuật tóan này, vì thiết nghĩ chúng ta vận dụng MD5 để cracking. Nên sử dụng ngôn ngữ ASM gần gủi với các cracker hơn. Đầu tiên chúng ta định nghĩa hàm như sau: MD5hash proc uses eax ebx ecx edx edi esi,ptBuffer:dword,dtBufferLength:dword,ptMD5Resul t:dword local dta:dword,dtb:dword,dtc:dword,dtd:dword Trong đó ptBuffer là addr chứa địa chỉ string input chúng ta cần hash dtBufferLength : dword : chứa chiều dài b của chuổi string input Thực hiện bước 1 và bước 2 chúng ta có đọan code sau: ; phase I · padding mov edi,ptBuffer <<= 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 << nguon tai.lieu . vn