Nếu ta xác định được hai thông số trên một cách chính xác, thì việc còn lại là chỉ cần INCLUDE các thư viện của các chương trình mã hoá tương ứng vào và dùng thui :D. Moonbaby(REA) MD5 Algorithm 2 ( tiếp theo ) Vài lời trút giận : huhu ban đầu em định "độc chiếm" cái thằng MD5 này, nhưng không ngờ bác benina làm ăn thế nào lãi để lão Yêu quái "gài hàng", hack vào máy tính "trôm" luôn cái bí kíp này ( mà xui 1 cái là bác benina lại không để password mới đau chứ), không những thế ả Yêu quái còn "lan truyền" thông tin này, làm cho "bí kíp" không còn là "bí kíp" nữa. Thôi thì "mình vì mọi người" , hôm nay em xin share ra cho các bác đọc vậy (em xin nói trước là hơi bị dài, bác nào không theo nổi thì ráng chịu đấy) À, còn 1 điều nữa em xin nhờ các bác edmin là nên cộng point cho bác benina với loạt tut này (ít nhất là 50 point) để xứng với công sức "tốn kém bao nhiêu là nước mũi (do bị cảm) và bao nhiêu là nước mắt (do vừa hút thuốc vừa đọc màn hình vi tính)" của bác í ================================================== == tác giả : benina người post : the_lighthouse :tongue: TÌM HIỂU THUẬT TÓAN MD5 Đây là tài liệu của R. Rivest , tay này ko phải cracker, lão đang làm việc tại MIT (một cái tên rất nổi tiếng phải ko các bạn!). Tài liệu này được viết từ năm 1992. Nhưng đến hôm nay chúng ta mới học , thật là lạc hậu. Nhưng còn hơn là ko biết gì phải ko các bạn. The MD5 Message-Digest Algorithm (Tôi ko dịch câu này, MD có nghĩa là message-digest) Tài liệu này cung cấp cho cộng đồng Internet. Nó ko định rõ chuẩn Internet nào cả. Có thể phân phối rộng rãi cho mọi người Vì vậy hôm nay chúng ta mới học được nó đây Bảng mục lục: 1. Executive Summary(bảng tóm tắt ) 1 2. Terminology and Notation (thuật ngữ và ký hiệu) 2 3. MD5 Algorithm Description (Mô tả thuật tóan MD5) 3 4. Summary (Tóm tắt) 6 5. Differences Between MD4 and MD5 (Sự khác nhau giữa MD4 và MD5) 6 References(Tham khảo) 7 APPENDIX A - Reference Implementation(tham khảo bổ sung) 7 Security Considerations (áp dụng cho bảo mật) 21 Author's Address (Địa chỉ tác giả) 21 1. Bảng tóm tắt các mối quan hệ: Đây là tài liệu mô tả thuật tóan MD5 message-digest.Thuật tóan này “bắt lấy” các thông điệp nhập vào có chiều dài bất kỳ và đưa ra kết quả như là "fingerprint"(dấu lăn tay) or "message digest" chứa trong 128 bit (32 ký tự hexa).Và người ta đã ước đóan rằng sẽ ko có ai tính tóan được một kết quả thứ 2 giống message-digest như thế hay cho ra kết quả một thông điệp bất kỳ nào giống như message-digest đó. Thuật tóan MD5 được dùng trong các ứng dụng tín hiệu digital, ở đó một file rất lớn đã được nén bằng một kiểu an tòan trước khi nó được mã hóa với một khóa riêng (bí mật), dưới hệ thống mã hóa khóa được công khai giống như RSA. Thuật tóan MD5 được thiết kế để tăng tốc độ tính tóan nhanh hơn trên máy 32bit. Hơn nữa thụât tóan MD5 không cần phải thay đổi nhiều trong các tables, thuật tóan có thể được code ngắn gọn một cách nhanh chóng. Thuật tóan MD5 là một phần mở rộng của thuật tóan MD4. MD5 chậm hơn ko đáng kể so với MD4, nhưng nó “bảo mật “ hơn trong thiết kế. MD5 được thết kế ra vì lý do người ta có cảm giác rằng MD4 có lẽ chỉ được chấp nhận để sử dụng một cách nhanh chóng hơn trong việc “sắp đặt” ranh giới review đang tồn tại. Vì MD4 được thiết kế nhanh một cách ngọai lệ, nên nó đứng trên “bờ vực rũi ro” đối với các cuộc tấn công bí mật hết sức hiệu quả. MD5 đã “khóa” được việc này. Nó giúp thêm một chút cho việc bảo mật tối đa.Nó trộn vài ám thị được làm bởi các reviewers khác, và chứa thêm các optimizations. Thuật tóan MD5 được đặt trong các public domain cho việc review và có thể chấp nhận như một chuẩn standard. 2. Thuật ngữ và ký hiệu: Trong văn bản này “word” có số lượng là 32-bit và một “byte” có số lượng là 8-bit. Một dãy bit tương tự, và cũng là một dãy byte (mỗi một nhóm 8-bit là một byte). Với bit có vị trí thứ tự high của mỗi byte được liệt kê đầu tiên. Tương tự vậy, một dãy các byte cũng giống như là một dãy 32-bit words, mỗi một nhóm liên tục 4 byte là một word, với byte có thứ tự low được cho trước tiên. Chú ý: x_i được biểu thị như là “x sub i”. Nếu chỉ số dưới (subscript) là một biể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<<<s là giá trị 32-bit được thực hiện như lệnh xoay (rotating) X về trái s bit.(dời (shift) X về trái s-bit) Not(X) là tóan hạng “bù” của X X v Y là tóan hạng OR của X và Y X xor Y là tóan hạng XOR XY là tóan hạng AND 3. Mô tả thuật tóan MD5 Chúng ta bắt đầu bằng cách giả sử chúng ta có một tín hiệu input có chiều dài b- bit, và chúng ta muốn tìm tín hiệu md của nó . Ở đây b là một số nguyên ko dấu bất kỳ ; b có thể bằng zero, không cần thiết b là một bội số của 8, và nó có thể lớn tùy ý. Chúng ta hình dung các bits của tín hiệu input được viết như dưới đây: m_0 m_1 … m_{b-1} Sau đây có 5 bước để tính tóan một tín hiệu md từ một string input 3.1 Bước 1: Thêm vào các Padding Bits (các bit đệm): Sau đây được gọi là quá trình Padding : -Một tín hiệu được mở rộng sao cho chiều dài của nó có dạng ( p*512+448) bits ; p trong biểu thức trên là số nguyên > 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 <<<edi=addr string input mov eax,dtBufferLength <<<eax=chiều dài string input= b trong mô tả inc eax <<< eax=eax+1 add edi,eax <<< edi=edi+eax . padding có dạng bit như sau : 10 00 (dạng bit) (1- charHex=4bit, bit đầu =1, 3 bit sau =0) . Vậy 10 00 =1* 2^3 +0* 2^2 +0* 2 ^1+ 0* 2 ^0= 0x 80 (hay 80h) Các số hex sau có dạng : 00 Ta viết lại chuổi đã padded. 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. chuổi đã padded như sau: 68 65 6c 6c 6f 80 00 00 00 … 00 00 (tổng cộng 488-bit=56byte =11 2-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