Họ hàm băm MD (Message-Digest algorithm)

Một phần của tài liệu Nghiên cứu các thuật toán mã hóa khóa công khai và ứng dụng trong chữ ký điện tử (Trang 32 - 39)

1. Lý do nghiên cứu đề tài

2.1.2.2Họ hàm băm MD (Message-Digest algorithm)

Hàm băm MD4

Mô tả sơ lược về thuật toán.

Thuật toán MD4 nhận dữ liệu vào là một chuỗi bit x có chiều dài b 0 tuỳ ý và sinh ra chuỗi mã băm của x có chiều dài cố định 128 bit. Trước tiên, chuỗi bit x được định dạng lại bằng cách thêm r >0 bit phụ vào sao cho chiều dài của chuỗi bit mới (sau khi thêm) b’=b+r là bội số của 512. Sau đó, ta chia chuỗi bit mới này thành m khối (block) mỗi khối có độ dài đúng bằng 512 bit (tức là b’=512*m). Mỗi khối bit này được chia thành một dãy gồm 16 từ, mỗi từ có 32 bit. Thuật toán MD4 tuần tự xử lý dãy m khối trong m lược tính toán, với dữ liệu đầu vào tại lược tính thứ k (1 k m) là khối thứ k trong dãy và mã băm nhận được sau (k-1) lược tính toán trước đó (mã băm đầu vào ứng với bước k=1 được khởi tạo từ trước) để sinh ra mã băm của lược tính toán thứ k. tại bước tính toán thứ k khối dữ liệu đầu vào 512 bit (xem như là dãy gồm 16 từ) liên tiếp đi qua 3 loạt (round) tính toán, trong mỗi loạt gồm có 16 bước, mỗi bước thực hiện tính toán với dữ liệu vào là một từ trong dãy và kết quả nhận được từ bước trước. Kết quả sau khi qua 3 loạt tính toán trên sẽ được kết hợp với mã băm trước đó để sinh ra mã băm mới. Sau khi đã xử lý hết m khối mã băm nhận được sau cùng là kết quả ta cần tìm.

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/

Trong quá trình tính toán, MD4 sử dụng 4 từ 32 bit :H1, H2, H3, H4 gọi là các chaining variable, để lưu trữ mã băm tạm thời tại mỗi lược tính toán.

Các bước thực hiện thuật toán:

Thuật toán MD4 sử dụng các hàm sau cho các loạt tính toán:

F(x,y,z)=(x y) (x z) G(x,y,z)=(x y) (y z) (z x) H(x,y,z)=(x y z)

Định nghĩa các giá trị khởi tạo cho các biến H1,H2,H3,H4

H1=0x67452301, H2=0xefcdab89, H3=0x98badcfe, H4=0x10325476.

Định nghĩa các hằng số cộng thêm cho mỗi bước

y[j]=0, 0<=j<=16;

y[j]=0x5a827999, 17<=j<=32; y[j]=0x6ed9eba1, 33<=j<=48;

Khởi tạo mảng thứ tự truy xuất của các từ 32 bit:

z[01..16]=[0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15], z[17..32]=[0;4;8;12;1;5;9;13;2;6;10;14;3;7;11;15], z[33..48]=[0;8;4;12;2;10;6;14;1;9;5;13;3;11;7;15].

Định nghĩa số vị trí bit xoay trái cho mỗi bước:

s[01..16]=[3;7;11;19;3;7;11;19;3;7;11;19;3;7;11;19], s[17..32]=[3;5;9;13;3;5;9;13;3;5;9;13;3;5;9;13], s[33..48]=[3;9;11;15;3;9;11;15;3;9;11;15;3;9;11;15]. Chuẩn bị tính toán

Ngoài chuỗi bit dữ liệu làm đầu vào cho hàm băm, ta cần thêm thông tin về chiều dài chuỗi bit dữ liệu cho hàm băm. Thực hiện điều này bằng cách thêm vào chuỗi bit dữ liệu 64 bit chứa giá trị là chiều dài ban đầu của chuỗi bit đầu vào. Ngoài ra, ta cần phải định dạng chuỗi bit đầu vào thành

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/

các khối 512 bit, thuật toán sẽ thực hiện tuần tự xử lý dãy các khối 512 bit đó. Vì chuỗi bit dữ liệu ban đầu có chiều dài tuỳ ý, do đó ta cần thêm vào một số bit phụ sao cho chiều dài cuối cùng của chuỗi bit đầu vào phải là bội của 512. (cần thêm các bit phụ vào chuỗi bit dữ liệu sao cho chiều dài của chuỗi bit thu được sau khi thêm vào sẽ đồng dư với 448 theo modulo 512). Để đảm bảo mọi chuỗi bit dữ liệu trước khi xử lý đều đã được thêm các bit phụ, nếu chiều dài của chuỗi bit ban đầu đã đồng dư với 448 theo modulo 512 thì ta vẫn phải thực hiện thêm các bit phụ (khi đó số bit phụ sẽ là 512 bit). Trước tiên ta thêm bit 1 vào chuỗi bit ngay sau bit cuối cùng, sau đó lần lượt thêm các bit 0 vào cho đến khi chiều dài của chuỗi bit đồng dư 448 modulo 512. Như vậy số bit thêm vào ít nhất là 1 nhiều nhất là 512.

Thêm chiều dài chuỗi bit : Chuỗi bit chứa giá trị của chiều dài ban đầu của chuỗi bit dữ liệu được thêm vào kết quả của bước trước. Trong trường hợp giá trị của chiều dài chuỗi bit dữ liệu ban đầu vượt quá 264

thì ta chỉ lấy 64 bit thấp. Sau hai lượt thêm ở trên chuỗi bit nhận được có chiều dài b’, bội của 512, tức b’=512.m, trong đó m là số các khối bit có độ dài 512.

Thực hiện tính toán: For i=0 to (m-1) do For j=0 to 15 do Xj=x16i+j (A,B,C,D) (H1, H2,H3,H4) for j=0 to 15 do t(A+F(B,C,D)+X[z[j]]+y[j]) <<<s[j] (A,B,C,D)(D,t,B,C) for j=16 to 31 do t(A+G(B,C,D)+X[z[j]]+y[j])<<<s[j] (A,B,C,D)(D,t,B,C) for j=32 to 47 do t(A+H(B,C,D)+X[z[j]]+y[j])<<<s[j] (A,B,C,D)(D,t,B,C) (H1, H2,H3,H4) (H1+A,H2+B,H3+C,H4+D)

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/

Kết thúc thuật toán

Ghép nối bốn từ 32 bit H1, H2,H3,H4 lại thành một chuỗi bit H=H1H2H3H4 ta được chuỗi bit có chiều dài đúng bằng 128 bit. Đây là kết quả cuối cùng của thuật toán.

Hàm băm MD5

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

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í. (adsbygoogle = window.adsbygoogle || []).push({});

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

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}

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/

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ôn đượ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.

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).

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

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))

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/

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 là phần tử thứ i của bảng, thì Tlà 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.

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) <<< 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] (adsbygoogle = window.adsbygoogle || []).push({});

[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]

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/ /*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) <<< 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) <<< 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

Số hóa bởi trung tâm học liệu http://www.lrc-tnu.edu.vn/ C = C + CC

D = D + DD

end /* of loop on i */

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.

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.

Một phần của tài liệu Nghiên cứu các thuật toán mã hóa khóa công khai và ứng dụng trong chữ ký điện tử (Trang 32 - 39)