Tải bản đầy đủ (.doc) (6 trang)

MD5.doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (170.31 KB, 6 trang )

Đị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 << c) or (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]) <<< 12) Nhận xét: Vòng 1 dùng hàm F, Với giá trị t
từ 1 -> 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

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×