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

Trong mật mã học, MD5 (viết tắt của tiếng Anh Message-Digest algorithm 5, giải thuật Tiêu hóa tin 5) là một hàm băm mật mã được sử dụng phổ biến với giá trị băm dài 128-bit. Là một chuẩn Internet (RFC 1321), MD5 đã được dùng trong nhiều ứng dụng bảo mật, và cũng được dùng phổ biến để kiểm tra tính toàn vẹn của tập tin. Một bảng băm MD5 thường được diễn tả bằng một số hệ thập lục phân 32 ký tự.

MD5 được thiết kế bởi Ronald Rivest vào năm 1991 để thay thế cho hàm băm trước đó, MD4

 

doc6 trang | Chia sẻ: luyenbuizn | Lượt xem: 1710 | Lượt tải: 0download
Nội dung tài liệu Sự khác nhau giữa MD4 và MD5, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Định nghĩa Trong mật mã học, MD5 (viết tắt của tiếng Anh Message-Digest algorithm 5, giải thuật Tiêu hóa tin 5) là một hàm băm mật mã được sử dụng phổ biến với giá trị băm dài 128-bit. Là một chuẩn Internet (RFC 1321), MD5 đã được dùng trong nhiều ứng dụng bảo mật, và cũng được dùng phổ biến để kiểm tra tính toàn vẹn của tập tin. Một bảng băm MD5 thường được diễn tả bằng một số hệ thập lục phân 32 ký tự. MD5 được thiết kế bởi Ronald Rivest vào năm 1991 để thay thế cho hàm băm trước đó, MD4 CHÚNG TA “DỊCH NGƯỢC” LẠI MỘT TÍN HIỆU MD5 HASHES NHƯ THẾ NÀO ? Như trên đã nói: từ 1 hashes ta tìm ngược lại string của nó được không? Điều này không bao giờ 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à không thể đảo ngược. Không thể biết cách tìm ra chuổi origin từ tín hiệu MD5 hashes. Tức là chúng ta không 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 khoảng (3.4E+38), vì thế để brute force một md5 thì máy tính chắc chạy vài tuần cũng chưa tìm ra. 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 toàn 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, không 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…. Ví dụ mã hóa của md5 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. 5. Sự khác nhau giữa MD4 và MD5      Sau đây là sự khác nhau giữa MD4 và MD5:        1. Một vòng thứ tư đã được thêm vào.        2. Mỗi bước bây giờ có một phụ gia duy nhất không đổi.        3. Các chức năng g ở vòng 2 đã được thay đổi từ (XY v XZ v YZ) để        (XZ v Y not (Z)) để làm g ít đối xứng.        4. Mỗi bước bây giờ có thêm trong kết quả của bước trước. Điều này        thúc đẩy nhanh hơn "thác hiệu quả".        5. Thứ tự từ đầu vào được truy cập trong vòng 2 và        3 là thay đổi, để làm cho các mô hình nhỏ như nhau.        6. Số tiền chuyển đổi trong mỗi vòng được khoảng        tối ưu hóa, để mang lại một nhanh hơn "hiệu ứng thác." Những thay đổi trong        viên đạn khác nhau là khác nhau. //Chú ý: Tất cả các biến đều là biến không dấu 32 bit và bao phủ mô đun 2^32 khi tính toán var int[64] r, k //r xác định số dịch chuyển mỗi vòng r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22} r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20} r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23} r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21} //Sử dụng phần nguyên nhị phân của sin của số nguyên làm hằng số: for i from 0 to 63 k[i] := floor(abs(sin(i + 1)) × (2 pow 32)) //Khởi tạo biến: var int h0 := 0x67452301 var int h1 := 0xEFCDAB89 var int h2 := 0x98BADCFE var int h3 := 0x10325476 //Tiền xử lý: append "1" bit to message append "0" bits until message length in bits ≡ 448 (mod 512) append bit (bit, not byte) length of unpadded message as 64-bit little-endian integer to message //Xử lý mẩu tin trong đoạn 512-bit tiếp theo: for each 512-bit chunk of message break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15 //Khởi tạo giá trị băm cho đoạn này: var int a := h0 var int b := h1 var int c := h2 var int d := h3 //Vòng lặp chính: for i from 0 to 63 if 0 ≤ i ≤ 15 then f := (b and c) or ((not b) and d) g := i else if 16 ≤ i ≤ 31 f := (d and b) or ((not d) and c) g := (5×i + 1) mod 16 else if 32 ≤ i ≤ 47 f := b xor c xor d g := (3×i + 5) mod 16 else if 48 ≤ i ≤ 63 f := c xor (b or (not d)) g := (7×i) mod 16 temp := d d := c c := b b := b + leftrotate((a + f + k[i] + w[g]) , r[i]) a := temp //Thêm bảng băm của đoạn vào kết quả: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d var int digest := h0 append h1 append h2 append h3 //(expressed as little-endian) //định nghĩa hàm dịch trái leftrotate (x, c) return (x > (32-c)); Đây là quá trình thực hiện xử lý của 4 hàm F, G, H, I ở trên: Vòng 1 (Round 1): Ký hiệu [abcd k s t] là bước thực hiện của phép toán a = b + ((a + F(b, c, d) + X[k] + T[t]) <<< s) Quá trình thực hiện 16 bước sau: [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] Giải thích: ví dụ biểu thức thứ 2 là [DABC 1 12 2], tương đương với: D = A + ((D + F(A,B,C) + X[1] + T[2]) 16 và k từ 1 -> 15 Vòng 2 (Round 2): Tương tự, ký hiệu [abcd k s t] là của biểu thức : a = b + ((a + G(b, c, d) + X[k] + T[t]) <<< s) Quá trình thực hiện 16 bước : [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] Nhận xét: Vòng 2 dùng hàm G, với t từ 17 -> 32 và k = 1 + 5k mod 16 Vòng 3 (Round 3): Tương tự, ký hiệu [abcd k s t] là của biểu thức : a = b + ((a + H(b, c, d) + X[k] + T[t]) <<< s) Quá trình thực hiện 16 bước: [ABCD 5 4 33] [DABC 8 11 34] [CDAB 1 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 5 16 47] [BCDA 2 23 48] Nhận xét: Vòng 3 dùng hàm H, với t từ 33 -> 48 và k =5 + 3k mod 16 Vòng (Round 4): Tương tự, ký hiệu [abcd k s t] là của biểu thức: a = b + ((a + I(b,c,d) + X[k] + T[t]) <<< s) Quá trình thực hiện 16 bước : [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] [ABCDb 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] Nhận xét: Vòng 4 dùng hàm I, với t từ 49 -> 64 và k =7k mod 16 /* 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 */ Bước 5 : Tính kết quả message digest. Sau khi thực hiện xong bước 4, thông điệp thu gọn nhận được từ 4 thanh ghi A, B, C, D, bắt đầu từ byte thấp của thanh ghi A và kết thúc với byte cao của thanh ghi D bằng phép nối như sau: Message Digest = A || B || C || D. ( || phép toán nối)

Các file đính kèm theo tài liệu này:

  • docty_koxoa.doc
  • docMD5.doc
  • docxMD5.docx
  • pdfMD5.pdf
  • pptMD5.ppt
Tài liệu liên quan