Thứ Hai, 15 tháng 10, 2007

Thuật toán số hóa thông điệp MD5

1. Mục đích

Tài liệu này mô tả thuật toán số hóa thông điệp MD5. Thuật toán nhận vào 1 thông điệp độ dài tùy ý và tạo ra một số 128 bit, là một dạng “vân tay“ hay “mã số thông điệp“ ( message digest ) của đầu vào. Người ta cho rằng sẽ không khả thi về mặt tính toán để tạo ra 2 thông điệp có cùng mã số thông điệp, hoặc tạo ra một thông điệp với mã số cho trước.Thuật toán MD5 được dự tính áp dụng cho những ứng dụng chữ ký điện tử, ở đó một file lớn phải được “nén“ một cách an toàn trước khi mã hóa với một khóa cá nhân ( private key ) dưới một hệ mã hóa công khai như RSA

Thuật toán MD5 được thiết kế để chạy tương đối nhanh trên các máy 32 bit, có thể được thực hiện một cách khá gọn.

Thuật toán MD5 là sự mở rộng của thuật toán MD4. MD5 chậm hơn một chút so với MD4 nhưng an toàn hơn. MD5 được thiết kế vì người ta cảm thấy có thể MD4 đã được chấp nhận trong sử dụng quá nhanh so với sự đánh giá nó. MD4 được thiết kế để chạy rất nhanh, nó đã “nằm trên ranh giới“ theo cách nói về nguy cơ của sự thành công trong việc phá mã. MD5 đã lùi lại một chút, từ bỏ một chút tốc độ cho sự bảo mật. Nó kết hợp một số ý kiến góp ý của các chuyên gia, thuật toán MD5 hiện đang được đánh giá và có thể được chấp nhận như một chuẩn.

2. Thuật ngữ và ký hiệu

Trong tài liệu này một “word“ là một lượng 32 bit và một “byte“ là một lượng 8 bit. Một dãy các bit có thể được xem như một dãy các byte, trong đó mỗi nhóm 8 bit liên tiếp được xem như một byte với bit cao của mỗi byte đặt trước. Tương tự, mỗi dãy các byte có thể xem như một dãy các word 32 bit, trong đõ mỗi nhóm 4 byte liên tiếp được xem như một word với byte thấp đặt trước.

Ký hiệu x_i nghĩa là phần tử x thứ i (“x sub i“). Nếu số thứ tự đó là một biểu thức ta viết nó trong ngoặc nhọn, ví dụ như x_{i+1} ; ^ ký hiệu cho số mũ.
Ký hiệu “+“ cho phép cộng các word, nghĩa là cộng theo môđun 2^32.
X <<< s ký hiệu giá trị 32 bit nhận được bằng cách dịch chuyển các bit của X (theo kiểu quay vòng ) sang trái s vị trí.
not(X) ký hiệu phép đối lập (NOT) các bit
X v Y ký hiệu phép OR các bit
X xor Y ký hiệu phép XOR các bit
XY ký hiệu phép AND các bit

3. Mô tả thuật toán MD5

Giả sử chúng ta có thông điệp b bit ở đầu vào, và ta muốn tìm mã số của thông điệp. Ở đây b là số không âm bất kỳ; b có thể bằng 0 và không cần chia hết cho 8, độ lớn có thể bất kỳ. Tưởng tượng rằng các bit của thông điệp được viết như sau :
m_0 m_1 m_2 … m_{b-1}

Mã số thông điệp được tính qua 5 bước sau

3.1 - Bước 1 : Các bit gắn thêm

Thông điệp được mở rộng, thêm bit vào phía sau sao cho độ dài của nó ( tính theo bit ) đồng dư với 448 theo môđun 512. Nghĩa là thông điệp được mở rộng sao cho nó còn thiếu 64 bit nữa thì sẽ có một độ dài chia hết cho 512. Việc này luông được thực hiện ngay cả khi bản thân độ dài thông điệp đã đồng dư với 448 theo môđun 512.
Việc thêm bit này thực hiện như sau : một bit “1“ được thêm vào sau thông điệp, sau đó các bit “0“ được thêm vào để có một độ dài đồng dư với 448 môđun 512. Trong tất cả các trường hợp, có ít nhất 1 và nhiều nhất 512 bit được thêm vào.

3.2 - Bước 2 : Gắn thêm độ dài

Dạng biểu diễn 64 bit độ dài b của chuỗi ban đầu được thêm vào phía sau kết quả của bước 1. Trong trường hợp b lớn hơn 2^64 thì chỉ có 64 bit thấp của b được sử dụng. ( Các bit này được thêm vào phía sau dưới dạng 2 word 32 bit, gắn word thấp trước theo quy ước ở trên )
3.3 - Bước 3 : Khởi tạo bộ đệm MD
Một bộ đệm 4 word (A,B,C,D) được dùng để tính mã số thông điệp. Ở đây mỗi A,B,C,D là một thanh ghi 32 bit. Những thanh ghi này được khởi tạo theo những giá trị hex sau ( các byte thấp trước ) :
word A : 01 23 45 67
word B : 89 ab cd ef
word C : fe dc ba 98
word D : 76 54 32 10

3.4 - Bước 4 : Xử lý thông điệp theo từng khối 16 word

Trước hết ta định nghĩa các hàm phụ, các hàm này nhận đầu vào là 3 word 32 bit và tạo 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))

Với mỗi bit, F hoạt động như một điều kiện : nếu X thì Y nếu không thì Z. Hàm F có thể định nghĩa bằng phép + thay vì v bởi vì XY và not(X)Z không bao giờ có “1“ ở cùng 1 vị trí bit.Các hàm G,H và I tương tự như F, ở chỗ chúng tác động theo từng bit tương ứng để tạo ra kết quả từ các bit của X,Y và Z

Bước này sử dụng một bảng 64 giá trị T[1 .. 64] được tạo ra từ hàm sin. Gọi T[i] là phần tử thứ i của bảng, thì T[i]là phần nguyên của 4294967296*sin(i) , i được tính theo radian.

Làm như sau :

/* Xử lý mỗi khối 16 word */
For i = 0 to N/16-1 do

/* Copy block i into X. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /* of loop on j */

/* Lưu A vào AA, B vào BB, C vào CC, D và DD . */
AA = A
BB = B
CC = C
DD = D

/* Vòng 1. */
/* Ký hiệu [abcd k s i] nghĩa là thực hiện như sau :
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện : */
[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]

/* Vòng 2. */
/*Ký hiệu [abcd k s i] nghĩa là thực hiện như sau
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện : */
[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]

/* Vòng 3. */
/* Ký hiệu [abcd k s t] nghĩ là làm như sau
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiện :*/
[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]

/* Vòng 4. */
/* Ký hiệu [abcd k s t] nghĩa là làm như sau
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Thực hiên: */
[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]

/* Then perform the following additions. (That is increment each
of the four registers by the value it had before this block was started.) */

/* Sau đó làm các phép cộng sau. ( Nghĩa là cộng vào mỗi thanh ghi giá trị của nó trước khi vào vòng lặp ) */

A = A + AA
B = B + BB
C = C + CC
D = D + DD

end /* of loop on i */

3.5 - Bước 5 : In ra

Mã số thông điệp được tạo ra là A,B,C,D. Nghĩa là chúng ta bắt đầu từ byte thấp của A, kết thúc với byte cao của D.

Đến đây đã mô tả xong thuật toán MD5. Mã nguồn tham khảo viết bằng C có thể tìm thấy ở phụ lục.

4. Tổng kết

Thuật toán số hóa thông điệp MD5 khá đơn giản để thực hiện, cung cấp một dạng “vân tay“ hay mã số của thông điệp với độ dài tùy ý. Người ta cho rằng độ khó để tìm được 2 thông điệp có cùng mã số là khoảng 2^64 bước tính, và độ khó để tim được một thông điệp với mã số cho trước là 2^128 bước tính. Thuật toán MD5 đã được dò tìm điểm yếu một cách cẩn thận. Tuy nhiên đây là một thuật toán tương đối mới ( ! ) và việc phân tích cẩn thận về sự an toàn là cần thiết.

5. Sự khác nhau giữa MD4 và MD5

Sau đây là sự khác nhau giữa MD4 và MD5 :

1. Vòng 4 đã được thêm vào

2. Mỗi bước đều được thêm vào một hằng số duy nhất

3. Hàm G ở vòng 2 được đổi từ (XY v XZ v YZ) thành (XZ v Y not(Z)) để làm giảm sự đối xứng trong G.

4. Mỗi bước đều sử dụng kết quả từ bước trước . Điều này nhằm tạo ra “hiệu ứng dây chuyền“ nhanh hơn

5. Thứ tự các word đầu vào ở vòng 2 và vòng 3 được thay đổi, để làm cho hai mẫu này ít giống nhau hơn

6. Số bit dịch chuyển ở mỗi vòng được tối ưu hóa, để tạo ra “hiệu ứng dây chuyền“ nhanh hơn. Lượng dịch chuyển ở mỗi vòng là khác nhau.

Tài liệu tham khảo

[1] Rivest, R., “The MD4 Message Digest Algorithm“, RFC 1320, MIT and
RSA Data Security, Inc., April 1992.

[2] Rivest, R., “The MD4 message digest algorithm“, in A.J. Menezes
and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO `90
Proceedings, pages 303-311, Springer-Verlag, 1991.

[3] CCITT Recommendation X.509 (1988), “The Directory -
Authentication Framework.“


Mỗi một người có một “dấu lăn tay” (fingerprint) riêng ko ai giống ai đúng ko các bạn?. Lúc 15 tuổi tui làm giấy CMND cho đến nay “dấu lăn tay” của tui vẫn vậy. Và có khi nào bạn hỏi: Ai đã tạo ra nó thế?!. Xin trả lời: đó là do Ông Trời tạo ra bạn ạ!!!.(lãng xẹt) Hihi
Từ những ý tưởng đó , con người mới nghĩ ra việc : tại sao chúng ta ko làm Ông Trời một phen. Chúng ta thử tạo ra “dấu lăn tay” cho 1 cái gì đó để phân biệt chúng với nhau. Ví dụ như tên của mỗi người chẳng hạn (các bạn nên có khái niệm tên (name) là một chuổi các ký tự được gọi là string). Hêhêhê . Do vậy , trong IT người ta bắt đầu nghiên cứu các “cái máy” tạo ra “dấu lăn tay” cho các chuổi string. Một trong những “cái máy” đó là “Thuật toán MD5” mà chúng ta sắp nghiên cứu đây.
“Dấu lăn tay” do Thuật tóan MD5 (gọi tắt là MD5) từ một string gọi là message digest (tín hiệu digest, gọi tắt là md) hay còn gọi là “MD5 hashes” (gọi tắt là hashes). Một tín hiệu hashes là một chuổi các ký tự hexa ( bao gồm số 0-9 và a-f, các số hex ấy mà!!). Về nguyên tắt tạo ra hashes là :
-Bất cứ string nào cũng điều có duy nhất một hashes, ko bao giờ có 2 hashes cho 1 string
-Hai string khác nhau thì có 2 hashes khác nhau, ko bao giờ trùng nhau.
-Hảy nhớ điều này: từ 1 hashes ta tìm ngược lại string của nó được ko? Điều này ko bao giờ làm được. Ko một “máy” nào làm được.Chúng ta nên nhớ điều này.
Đó là những gì mà thuật tóan MD5 làm ra.
TUT này chúng ta ko tìm hiểu sâu thật sâu về MD5, như là tại sao làm như thuật tóan thì đáp ứng các điều kiện trên vừa nói, đó là việc của các nhà phát minh, các nhà tóan học.Chúng ta chỉ tìm hiểu cách thực hiện của MD5 mà thôi. Từ đó chúng ta có thể ứng dụng nó để nhận dạng ra chương trình nào sử dụng MD5, và sau đó ….keygen nó …hihi

Sau đây tui xin trích dẫn một số tài liệu về MD5 mà tui tìm hiểu được trên Net. Các bạn đọc từ từ nhé ko thôi bị mắc nghẹn à.

MỘT SỐ THÔNG TIN CĂN BẢN:

MD5 LÀ GÌ ?

MD để chỉ cho “message digest” (Lấy 2 chử đầu). MD5 là một thuật tóan lấy một tín hiệu vào có chiều dài bất kỳ và đưa ra một tín hiệu digest có chiều dài cố định (128-bit, 32 ký tự hexa), được làm ra từ 1 giá trị hexa (chú ý : mỗi ký tự hex là 4 bit, do đó 128bit là 32 ký tự hex). OK, bây giờ nói rõ hơn một chút : MD5 là cách căn bản để lấy chùm ký tự ( là digits, alphabeic hay gì khác ), được gọi là string nhập vào, và thay đổi chúng thành một chùm ký tự dài 32 ký tự , được gọi là tín hiệu digest (message digest) hay hashes của string được nhập vào, chuổi 32 ký tự này được tạo ra từ các ký tự hexa ( những digits: 0-9 và các chử a-f). Điều này có nghĩa là, với một string nhập vào có chiều dài bất kỳ , MD5 sẽ luôn luôn cài đặt “một vài thứ” để thành một chuổi string dài 32 ký tự, mà các ký tự là các ký tự hexa. Tín hiệu digest sẽ ko có khỏang trống, hay dấu hoặc kép hay bất cứ thứ gì khác 0-9 và a-f trong tín hiệu hashes được xuất ra.
MD5 hashes có tiện dụng là những hashes tạo ra trông khác nhau hòan tòan từ những tín hiệu nhập vào hơi hơi giống nhau. Ví dụ sau sẽ làm rỏ hơn về điều này:
• The MD5 hash of jim is 5e027396789a18c37aeda616e3d7991b
• The MD5 hash of Jim is d54b3c8fcd5ba07e47b400e69a287966
• The MD5 hash of Jimmy is 495b3121d23f5988b133882b36aa7214

Như bạn thấy đó, có ba tín hiệu nhập vào “hơi hơi giống nhau” nhưng các tín hiệu MD5 hashes xuất ra hòan tòan khác nhau. Ví dụ này cũng chứng minh hai ký tự j và J là 2 ký tự khác nhau . Do đó chúng ta thấy “máy đẻ” ra MD5 hashes là lọai rất nhạy cảm. Ở đây cần chú ý thêm là trong ví dụ thứ 3 chỉ thêm vào 2 ký tự (my) ở cuối chuổi của ví dụ 2 , và hashes của nó đã thay đổi hòan tòan. Vì vậy chúng ta ko thể có hashes của chuổi “Blehlo” từ hashes của chuổi “Bleh” bằng cách “vá viếu” thêm vài ký tự - thay đổi trong chuổi string nhập vào thì tín hiệu hashes của nó cũng sẽ thay đổi hòan tòan. Và ở đây cũng nên chú ý với 3 string nhập vào có chiều dài ko giống nhau nhưng các hash sinh ra đều có chiều dài là 32 ký tự (bao gồm các số 0-9 và a-f), ở ví dụ sau cùng ta cũng thấy chuổi string nhập vào dài hơn 2 ký tự so với 2 string trước nhưng chuổi hash của nó cũng chỉ có 32 ký tự chử số hex.
Mặc dù tín hiệu MD5 hashes xuất ra ngẫu nhiên từ string nhập vào , nhưng thật ra chúng ta có một kiểu mẫu tạo hashes MD5(một thuật tóan MD5) được sử dụng để “quay” string nhập vào thành một md hay một hashes. Nếu bạn muốn sử dụng nó thì bạn có thể đọc ở tut này ở phần sau . Bởi vì MD5 được sử dụng một thuật tóan giống nhau cho mỗi lần tính tóan nên MD5 hashes của chuổi jim luôn luôn là
5e027396789a18c37aeda616e3d7991b
Trong thực tế , một số chương trình còn thêm vào một vào vài lọai thuật tóan khác khi md được sinh ra , làm cho MD5 cực kỳ thông dụng và là 1 công cụ rất mạnh. Nhưng có lẻ điều quan trọng nhất là trong thực tế MD5 được dùng như một cách tạo hashes hay ta gọi là hash chuổi ( biến chuổi thành 1 chuổi “vớ vẫn” nào đó)……

Tôi xin nói thật, những điều tui tìm hiểu được trên đây làm cho tui vô cùng “đắc ý”. Tóm lại chúng ta cần biết như sau:

-MD5: là một thuật tóan biến đổi 1 chuổi string thành 1 tín hiệu “message digest” hay còn gọi là “MD5 hashes”. Đó là một tín hiệu 128 bits – 32 ký tự hexa.
-hash một chuổi string là biến một string thành một tín hiệu message digest
-Thủ tục (procedure) hay hàm (function) trong chương trình để hash chuổi gọi là “máy sinh” MD5 hashes hay còn gọi nôm na là “máy hash”.

Bây giờ chúng ta sẽ bước sang một câu hỏi khác rất quan trọng.

CHÚNG TA “DỊCH NGƯỢC” LẠI MỘT TÍN HIỆU MD5 HASHES NHƯ THẾ NÀO ?

Như trên tui đã nói : từ 1 hashes ta tìm ngược lại string của nó được ko? Điều này ko bao giờ làm được. Ko một “máy” nào làm được.
Vậy ở đây câu trả lời là : “Bạn không thể” . Cách hash một string có nghĩa là tín hiệu md xuất ra bằng thuật tóan MD5 là ko thể đảo ngược. Không thể biết cách tìm ra chuổi origin từ tín hiệu MD5 hashes. Vì như ví dụ ở phần trước, những chuỗi có vẽ giống nhau nhưng tín hiệu md sinh ra hòan tòan khác nhau Tức là chúng ta ko thể nào “decode” (dịch ngược) được một chuổi MD5 hashes. Chỉ có một cách có được chuổi origin là bằng cách “brute force cracking”. Tức là phải duyệt qua rất nhiều tổ họp các ký tự của chuổi vào cho đến khi một trong những chuổi md được tạo ra của chúng bằng với chuổi md cần tìm origin. Tuy nhiên , với khả năng máy tính thời nay muốn làm điều này phải mất rất nhiều năm. Mặt khác ở đây chúng ta cần chú ý đó là tín hiệu MD5 hashes được thiết kế ra là “độc nhất vô nhị”. Trên lý thuyết cũng có khả năng 2 chuổi khác nhau có tín hiệu md giống nhau nhưng khả năng này rất rất nhỏ (1/(16^32) hay vào khỏang (3.4E+38). Bởi vậy có một lần tui tham gia forum HVA và có người sử dụng chương trình tìm password cho tập tin WINRAR bị mất password và bác Comp đã kiến nghị ko nên dùng chương trình đó là lý do trên. Vì khả năng tìm ra password rất “dài hơi” và máy tính chắc chạy vài tuần của chưa tìm ra. Hảy bỏ ý định đó đi các bạn.

MD5 ĐƯỢC SỬ DỤNG CHO VIỆC GÌ ?

Chính các đặc điểm của MD5 làm cho nó thường được ứng dụng trong một số trường hợp như sau:
-Nó thường được dùng để checksum tòan bộ file. Các nhà phát triển ứng dụng thường dùng MD5 trong việc cho phép download file trên NET. Họ sẽ cho “xuất bản” một tín hiệu md của file download. Khi chúng ta tải file về , thì file chúng ta vừa download sẽ có một tín hiệu md, nếu tín hiệu này khớp với tín hiệu các nhà phát triển ứng dụng đã “xuất bản” ở trên. Thì OK, ko có vấn đề. Nếu hai tín hiệu md này khác nhau, có thể có trong file download có virut hay cái gì đó tương tự.
-Một ứng dụng thường được dùng nữa là hash một password. Được dùng cho việc bảo mật một ứng dụng, hay những gì tương tự …v….v….

Đây là một số thông tin căn bản chúng ta cần biết qua khi bắt đầu tìm hiểu về thuật tóan MD5. Ở đây tui cần nói thêm một chút:

-Chúng ta chỉ có thể tạo ra tín hiệu message digest từ một chuổi string ( đây được gọi là quá trình “encode”).Chúng ta ko thể “dịch ngược” một message digest ra một string origin (quá trình “dịch ngược” gọi là “decode”). Khi tìm hiểu về MD5, tui có hỏi trên Forum HVA về các soft dùng MD5, và có một người trả lời là “bạn cần soft encode hay decode”. Và hacnho trả lời giúp tui : dĩ nhiên là encode. Thật tình tui ko thể nào chịu nổi lọai người này. Họ chỉ biết trình diễn kiến thức. Đây ko phải là “văn hóa” khi tham gia một forum. Mong mọi người nên chân thành với nhau nhiều hơn.
-Một số người sai lầm khi hiểu rằng “MD5 hashes “ là thuật tóan tựa như MD5 ,tức là thuật tóan trên nền tản MD5 biến đổi đi đôi chút. (Các thuật tóan này tôi gọi nôn na là thuật tóan “Lai căn MD5”). Điều này sai lầm , benina chỉ xin nhắc lại : MD5 hashes = message digest.
-Đứng về mặt cracking, một số người khi chưa tìm hiểu kỹ MD5 và thấy decode ko được nên cho rằng các soft dùng thuật tóan MD5 là ko keygen được “bất khả xâm phạm” . Lại thêm một sai lầm nữa. Vì sau vậy?. Vì nếu 1 soft được bảo vệ bằng đúng “chính xác thuật tóan MD5” thì quá dễ để tìm ra số serial vì chúng ta đã biết chính xác thuật tóan này diễn ra như thế nào. Vì vậy các soft chỉ dùng thuật tóan “lai căn MD5” , hay lồng các thuật tóan khác với thuật tóan MD5. Vì vậy các bạn muốn tìm các soft trong thực tế sử dụng MD5 rất khó. (có thể nói là ko có vì ko coder nào ngu đến như vậy!). Tui chỉ tìm được một soft có thuật tóan khá giống thuật tóan MD5 mà thôi. Thực ra tui tìm trên Net thấy có 2 soft có thuật tóan “sát” với MD5, nhưng ko còn đường download trên Net nữa vì quá cũ. Tui phải ra tiệm bán các đĩa CD, và tìm được 1 Soft (mô phật! hên thiệt). Trong quá trình tìm hiểu MD5, tui cũng thu thập được một số soft có thuật tóan “Lai căn MD5”.Rồi tui sẽ share cho các bạn

Không có nhận xét nào: