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.. Rivest , tay này k
Trang 1Nế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
Trang 2nó đâ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
Trang 3thê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):
Trang 4Sau đâ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
Trang 5Ta 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
Trang 640bit 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