- Để kiểm tra tính toàn vẹn của một khối data lớn, người ta sử dụng chữ ký số để đại diện cho khối data đó (giống như chữ ký trên văn bản) bằng cách dùng hàm băm: với input là một message bất kỳ, output là một chuỗi bít có chiều dài xác định trước, chuỗi bít này được gọi là message_digest.
- Các tính chất cơ bản của hàm băm:
+ Là hàm một chiều, không thể thực hiện phép biến đổi ngược như trong quá trình mã hóa và giải mã, nghĩa là với một message_digest cho trước, khó có thể tìm được một message nào mà có hàm băm bằng message_digest này.
+ Khó có thể tìm được hai message mà có cùng một message_digest.
- Các giải thuật băm được sử dụng hiện nay là: MD2, MD4, MD5, SHS. Trong đó MD5 là giải thuật băm được sử dụng phổ biến và nó sẽ được trình bày trong phần dưới.
- Giải thuật MD5 được phát triển bởi Ron Rivest ở MIT: nhận đầu vào là một khối data (message) có chiều dài bất kỳ, xử lý nó thành các khối 512 bít, tạo đầu ra là một message_digest 128 bít. Quá trình bao gồm các bước sau:
* Bước 1: message ban đầu được thêm (padding) một số bít (bắt đầu là bít 1, kế tiếp là các bít 0, số bít thêm vào từ 1 tới 512 bít) sao cho tổng số bít sau khi thêm vào cộng với 64 (chiềi dài của message ban đầu) là bội số của 512.
K bít
Bội số của 512 bít
Hình 1: Tạo message_digest sử dụng MD5.
* Bước 2: khởi tạo bộ đệm MD. Bộ đệm 128 bít được dùng để chứa kết quả trung gian và cuối cùng của hàm băm. Có thể xem bộ đệm như là 4 thanh ghi 32 bít. Các thanh ghi này được khởi tạo (dạng số hex) như sau:
A = 01234567; B = 89abcdef; C = fedcba98; D = 76543210
* Bước 3: xử lý message thành từng khối 512 bít (16 từ 32 bít). Quá trình tính toán được chia thành từng giai đoạn, số giai đoạn bằng số chiều dài (tính theo bít) của message sau khi đã padding chia cho 512. Mỗi giai đoạn nhận đầu vào là khối 512 bít của message đã được padding và message_digest của giai đoạn trước, cho ra kết quả là message_digest mới (xem hình 1). Mỗi giai đoạn thực hiện trong 4 bước (vòng), bốn vòng có cấu trúc giống nhau nhưng mỗi vòng sử dụng một hàm luận lý khác nhau, được đặc tả là F, G, H, I. Trong hình 2, bốn vòng được đặt nhãn là fF , fG , fH , fI , để chỉ rằng mỗi vòng có cấu trúc hàm tổng quát như nhau nhưng tùy thuộc vào sự khác nhau của hàm thao tác (F, G, H, I).
Message 100 000 ... K mod 264 Y0 Y1 … … … Yp … … YL-1 … 512 bít 512 bít 512 bít 512 bít HMD5 HMD5 HMD5 HMD5 Digest 128 bít 512 512 512 512 128 128 128 128 ABCD MDq 128 Yq
Hình 2: Xử lý MD5 của khối đơn 512 bít (HDMD5).
Mỗi vòng được thực hiện 16 bước tuần tự trên các data A, B, C, D (hình 3). Biểu thức tính toán được sử dụng trong mỗi vòng có dạng:
a = b + CLSs(a + g(b,c,d) + X[k] + T[i]). Trong đó:
. a, b, c, d: là 4 word A, B, C, D theo thứ tự nào đó. . g: là một trong các hàm F, G, H, I. F(b,c,d) = (b & c) | (~b & d) G(b,c,d) = (b & d) | (c & ~d) ABCD fF(ABCD, Yq, T[1..16] ABCD fG(ABCD, Yq, T[17..32] ABCD fH(ABCD, Yq, T[33..48] ABCD fI(ABCD, Yq, T[49..64] + + + + A B C D 32 A B C D A B C D A B C D 512 MDq+1 128
H(b,c,d) = b ^ c ^ d I(b,c,d) = c ^ (b & ~d) . CLSs: dịch vòng bên trái s bít.
. X[k] = M[q*16 + k] : từ 32 bít thứ k của khối 512 bít thứ q của message. . T[i] = 232 * abs(sin(i)) : từ 32 bít thứ i (i tính theo radian) (xem bảng). . Phép toán cộng (+) tính cho modulo 232
Hình 3: Tác vụ của MD5: [abcd k s i]
Bảng T được xây dựng từ hàm sin
a b c d g + + CLSs + X[k] T[i]
T1 = D76AA478 T17 = F61E2562 T33 = FFFA3942 T49 = F4292244T2 = E8C7B756 T18 = C040B340 T34 = 8771F681 T50 = 432AFF97 T2 = E8C7B756 T18 = C040B340 T34 = 8771F681 T50 = 432AFF97 T3 = 242070D8 T19 = 265E5A51 T35 = 69D96122 T51 = AB9423A7 T4 = C1BDCEEE T20 = E9B6C7AA T36 = FDE5380C T52 = FC93A039 T5 = F57C0FAF T21 = D62F105D T37 = A4BEEA44 T53 = 655B59C3 T6 = 4787C62A T22 = 02441453 T38 = 4BDECFA9 T54 = 8F0CCC92 T7 = A8304613 T23 = D8A1E681 T39 = F6BB4B60 T55 = FFEFF47D T8 = FD469501 T24 = E7D3FBC8 T40 = BEBFBC70 T56 = 85845DD1 T9 = 698098D8 T25 = 21E1CDE6 T41 = 289B7EC6 T57 = 6FA87E4F T10 = 8B44F7AF T26 = C33707D6 T42 = EAA127FA T58 = FE2CE6E0 T11 = FFFF5BB1 T27 = F4D50D87 T43 = D4EF3085 T59 = A3014314 T12 = 895CD7BE T28 = 455A14ED T44 = 04881D05 T60 = 4E0811A1 T13 = 6B901122 T29 = A9E3E905 T45 = D9D4D039 T61 = F7537E82 T14 = FD987193 T30 = FCEFA3F8 T46 = E6DB99E5 T62 = BD3AF235 T15 = A679438E T31 = 676F02D9 T47 = 1FA27CF8 T63 = 2AD7D2BB T16 = 49B40281 T32 = 8D2A4C8A T48 = C4AC5665 T64 = EB86D391
- Các tác vụ [abcd k s i] trong mỗi vòng là:
ABCD 0 7 1 1 5 17 5 4 33 0 6 49 DABC 1 12 2 6 9 18 8 11 34 7 10 50 CDAB 2 17 3 11 14 19 11 16 35 14 15 51 BCDA 3 22 4 0 20 20 14 23 36 5 21 52 ABCD 4 7 5 5 5 21 1 4 37 12 6 53 DABC 5 12 6 10 9 22 4 11 38 3 10 54 CDAB 6 17 7 15 14 23 7 16 39 10 15 55 BCDA 7 22 8 4 20 24 10 23 40 1 21 56 ABCD 8 7 9 9 5 25 13 4 41 8 6 57 DABC 9 12 10 14 9 26 0 11 42 15 10 58 CDAB 10 17 11 3 14 27 3 16 43 6 15 59 BCDA 11 22 12 8 20 28 6 23 44 13 21 60 Vòng 1 Vòng 2 Vòng 3 Vòng 4
ABCD 12 7 13 13 5 29 9 4 45 4 6 61
DABC 13 12 14 2 9 30 12 11 46 11 10 62
CDAB 14 17 15 7 14 31 15 16 47 2 15 63
BCDA 15 22 16 12 20 32 2 23 48 9 21 64
- Các phép toán dùng trong giải thuật MD5 gồm có: + Phép toán đối (~): bù bít.
+ Phép toán and (&): and các bít của hai toán hạng 32 bít với nhau. + Phép toán or (|): or các bít của hai toán hạng 32 bít với nhau. + Phép toán xor (^): xor các bít của hai toán hạng 32 bít với nhau. + Phép toán cộng (+): cộng modulo 232 hai toán hạng 32 bít với nhau. + Phép toán dịch trái vòng (w << s): dịch trái vòng w (32 bít) với s bít.
* Bước 4: xuất (output). Tất cả khối 512 bít L đã được xử lý thì đầu ra ở giai đoạn thứ L là message_digest 128 bít.
Có thể tóm tắt hoạt động của MD5 như sau: MD0 = IV
MDq+1 = MDq + fI(Yq , fH(Yq , fG(Yq ,fF(Yq ,MDq)))) MD = MDL-1
Trong đó:
+ IV: giá trị khởi tạo của bộ đệm ABCD được xác định trong bước 2. + Yq: khối message 512 bít thứ q.
+ L: số khối message (đã được padding). + MD: giá trị message_digest cuối cùng.