Bài toán thám mã MD5 và vấn đề hiệu năng

Một phần của tài liệu Nghiên cứu một số thuật toán thám mã sử dụng công nghệ tính toán song song trên các bộ xử lý đồ họa (Trang 36)

Trong mật mã học, MD5 (viết tắt của tiếng Anh Message-Digest algorithm 5) là một hàm băm mật mã đƣợc sử dụng phổ biến trong nhiều ứng dụng bảo mật, và kiểm tra tính toàn vẹn của tập tin. Giải thuật mã hóa MD5 nhận đầu vào là một xâu có độ dài thay đổi và cho đầu ra là giá trị băm độ dài không đổi 128-bit.

Giải mã MD5 là một trong những bài toán đòi hỏi sự tính toán lớn. Vì MD5 là hàm băm một chiều, tức là không thể dịch ngƣợc mật mã lại đƣợc bằng các từ khóa hay thuật toán mã hóa của chính MD5 hay các thuật toán mã hóa khác.

Hiện nay các thuật toán giải mã MD5 chủ yếu là dùng phép so sánh, cụ thể là với một không gian mật khẩu đã cho (không gian mật khẩu này có thể đƣợc hình thành nên bằng nhiều cách tùy chiến lƣợc của chƣơng trình giải mã), chƣơng trình sẽ tiến hành mã hóa từng mật khẩu trong không gian đó sang mã MD5, sau đó đem so sánh mã này với mã MD5 cần đƣợc giải mã. Nếu hai mật mã MD5 này trùng nhau, thì mật mã mà chƣơng trình đang xét chính là mật mã cần tìm, và bài toán đƣợc giải quyết. Tuy nhiên, nếu hai mã MD5 không khớp, thì chƣơng trình sẽ tiếp tục thử với các mật khẩu khác trong không gian mật khẩu để tạo ra các tổ hợp mật mã mới, và mã hóa chúng dƣới dạng MD5 và tiếp tục đem so sánh với mã MD5 đã cho. Công việc cứ tiếp tục nhƣ vậy cho đến khi giải đƣợc mật mã, hoặc không tìm đƣợc mật mã không gian mật khẩu đã cho.

Do đây là một bài toán ngƣợc với chi phi tính toán rất lớn, nên việc cài đặt trên các hệ thống tính toán thông dụng là không khả thi. Thực tế các chƣơng trình thám mã đƣợc viết để chạy trên các hệ thống tính toán mạnh nhƣ phần cứng chuyên dụng, hoặc chạy trên một hoặc nhiều cụm cluster gồm các máy tính nối với nhau. Đặc biệt, xu hƣớng sử dụng các phần cứng chuyên dụng ngày càng tỏ ra có ƣu thế về nhiều mặt: giá thành, điện năng, mặt bằng diện tích, và tính dễ sử dụng. Đi đầu trong lĩnh vực sản xuất các card đồ họa dùng cho mục đích chung GPGPU là hãng NVIDIA. NVIDIA cung cấp các thiết bị

36

phần cứng là card đồ họa và một kiến trúc phần mềm đi kèm cho phép tƣơng tác với các thiết bị phần cứng gọi là CUDA. Với CUDA ta có thể viết chƣơng trình để làm việc với card, rất dễ hiểu và dễ lập trình.

3.2.Mã hóa MD5

Giải thuật mã hóa MD5 (tài liệu về MD5 [10]) nhận đầu vào là một bản tin có độ dài bất kỳ và sinh ra một bản tin tóm lƣợc (message digest) có độ dài 128 bit. Giải thuật đƣợc dự đoán rằng không thể tính toán để sinh ra hai bản tin mà có cùng tóm lƣợc, hay để sinh ra bản tin mà có tóm lƣợc của nó biết trƣớc. Giải thuật MD5 đƣợc sử dụng trong các ứng dụng chữ ký số, ở đó một file kích thƣớc lớn phải đƣợc nén lại theo một nghĩa an toàn trƣớc khi đƣợc mã hóa bằng một khóa riêng (bí mật) trong một hệ mật mã khóa công khai nhƣ là RSA.

MD5 chuyển một đoạn thông tin chiều dài thay đổi thành một kết quả chiều dài không đổi 128 bit. Mẩu tin đầu vào đƣợc chia thành từng đoạn 512 bit; mẩu tin sau đó đƣợc độn sao cho chiều dài của nó chia chẵn cho 512. Công việc độn vào nhƣ sau: đầu tiên một bit đơn, 1, đƣợc gắn vào cuối mẩu tin. Tiếp theo là một dãy các số zero sao cho chiều dài của mẩu tin lên tới 64 bit ít hơn so với bội số của 512. Những bit còn lại đƣợc lấp đầy bằng một số nguyên 64-bit đại diện cho chiều dài của mẩu tin gốc.

Giải thuật MD5 chính hoạt động trên trạng thái 128-bit, đƣợc chia thành 4 từ 32-bit, với ký hiệu A, B, CD. Chúng đƣợc khởi tạo với những hằng số cố định. Giải thuật chính sau đó sẽ xử lý các khối tin 512-bit, mỗi khối xác định một trạng thái. Quá trình xử lý khối tin bao gồm bốn giai đoạn giống nhau, gọi là vòng; mỗi vòng gồm có 16 tác vụ giống nhau dựa trên: hàm phi tuyến F, cộng mô đun, và dịch trái.

Hình 3.1 dƣới đây mô tả một tác vụ trong một vòng; một hàm F đƣợc dùng trong mỗi vòng. Mi chỉ ra một khối tin nhập vào 32-bit, và Ki chỉ một hằng số 32-bit, khác nhau cho mỗi tác vụ.

s chỉ sự xoay bit về bên trái s đơn vị; s thay dổi tùy theo từng tác vụ. là phép cộng thêm với modulo 232.

37

Hình 3.1. Một thao tác MD5

MD5 bao gồm 64 tác vụ thế này, nhóm trong 4 vòng, mỗi vòng 16 tác vụ.

Giải thuật MD5 đƣợc thiết kế đạt tốc độ nhanh nhất ở trên các máy tính 32 bit. Thêm nữa, giải thuật MD5 không đòi hỏi các bảng thay thế lớn, và mã nguồn của giải thuật khá gọn. Sau đây là mô tả chi tiết về giải thuật mã hóa MD5.

Một số quy ước:

Một từ (word) là tƣơng đƣơng với 32-bit, và một byte tƣơng đƣợc 8-bit.

Một chuỗi các bit có thể đƣợc hiểu theo nghĩa nhƣ là một chuỗi các byte, và mỗi nhóm 8 bit đƣợc xem nhƣ một byte với bit MSB (bit cao) đƣợc viết trƣớc.

Một chuỗi các byte đƣợc hiểu nhƣ là một chuỗi các từ (word) 32 bit. Trong đó, mỗi nhóm 4 byte này đƣợc xem là một từ (word) với byte thấp đƣợc viết trƣớc.

Dấu “+” biểu thị phép cộng các word.

X<<<s : biểu thị giá trị 32 bit thu đƣợc từ phép dịch bit quay vòng sang trái s bit từ X. Not(X) : phép bù từng bit của X

X v Y : phép OR từng bit X và Y X xor Y : phép XOR từng bit X và Y XY : phép AND từng bit X và Y

38

Giả sử chúng ta có một bản tin đầu vào độ dài b và muốn tìm một tóm lƣợc của nó. Ở đây b là một số nguyên không âm bất kỳ; b có thể là 0, b không cần là bội của 8, và có thể lớn tùy ý. Hình dung rằng các bit của bản tin đƣợc viết nhƣ sau :

m_0 m_1 ... m_{b-1}

Để tính toán tóm lƣợc của bản tin m , giải thuật thực hiện theo 5 bƣớc

Bước 1. Độn thêm các bit

Bản tin vào đƣợc độn thêm (mở rộng) sao cho chiều dài của nó (tính bằng bit) đồng dƣ với 448 theo modulo 512. Có nghĩa là, bản tin đƣợc mở rộng sao cho chỉ cần thêm 64 bit nữa sẽ là bội của 512. Việc độn luôn đƣợc thực hiện, bất kể chiều dài của bản tin đầu vào đã đồng dƣ với 448 theo modulo 512.

Việc độn đƣợc tiến hành nhƣ sau : Một bit đơn “1” đƣợc chèn vào sau bản tin, sau đó các bit “0” đƣợc chèn vào tiếp sao cho chiều dài tính theo bit của bản tin đã đƣợc độn là đồng dƣ với 448 theo modulo 512. Nói chung, có ít nhất là một bit và nhiều nhất là 512 bit sẽ đƣợc chèn vào phía sau.

Bước 2. Chèn độ dài (adsbygoogle = window.adsbygoogle || []).push({});

Một số 64 bit biểu diễn cho b (chiều dài của bản tin ban đầu) đƣợc chèn vào kết quả ở bƣớc 1. Thậm chí nếu b > 2^64, thì chỉ 64 bit thấp của b đƣợc sử dụng. Các bit này (64 bit) đƣợc xem nhƣ là 2 từ 32-bit và đƣợc chèn theo thứ tự thấp của từ trƣớc nhƣ theo quy ƣớc ở trên.

Nhƣ vậy bản tin sau khi độn các bit và b, có chiều dài là bội của 512 bit. Hay, bản tin này cũng có chiều dài là bội của 16 word (32-bit). Đặt M[0,1. . . N-1] là các từ của bản tin kết quả, ở đây N là bội của 16.

Bước 3. Khởi tạo bộ đệm MD

Có một bộ đệm gồm 4 word (A, B, C, D) đƣợc dùng để tính toán bản tin tóm lƣợc. Ở đây mỗi từ A, B, C, D là một thanh ghi 32-bit. Các thanh ghi này đƣợc khởi tạo với các giá trị Hexa với các byte thấp viết trƣớc, nhƣ sau :

word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10

39

Trƣớc tiên ta định nghĩa các hàm sau, đều nhận đầu vào là 3 từ 32-bit và sinh ra một từ 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))

Ở bƣớc này cần thêm một mảng bảng T có 64 phần tử đƣợc xây dựng từ hàm sine. Giả sử T[i] biểu thị phần tử thứ i của bảng, công thức cho T là nhƣ sau

T[i] = 2^32 * abs(sin(i)) (abs là hàm lấy giá trị tuyệt đối) Sau khi có các hàm và bảng T, thực hiện tính toán nhƣ sau :

/* Xử lý từng khối gồm 16 từ. */ For i = 0 to N/16-1 do

/* Copy khối thứ i vào X. */ For j = 0 to 15 do

Set X[j] to M[i*16+j]. end /* kết thúc vòng lặp j */

/* Lưu lại các giá trị A, B, C, D thành AA, BB, CC, DD tương ứng . */ AA = A

BB = B CC = C DD = D

/* Vòng 1. */

/* Ký hiệu [abcd k s i] là phép toán

a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ /* Thực hiện 16 phép toá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]

40

/* Vòng 2. */

/* Ký hiệu [abcd k s i] là phép toán

a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ /* Thực hiện 16 phép toá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] là phép toán

a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ /* Thực hiện 16 phép toá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] là phép toán (adsbygoogle = window.adsbygoogle || []).push({});

a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ /* Thực hiện 16 phép toá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] /* Sau đó thực hiện các phép cộng sau */

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

41

end /* Kết thúc vòng lặp i */

Bước 5. Lấy kết quả đầu ra

Bản tin tóm lƣợc bao gồm bốn từ liên tiếp A,B,C,D. Bắt đầu với byte thấp của A và kết thúc với byte cao của D.

3.3.Tổng kết về mã MD5

Giải thuật mã hóa MD5 đơn giản khi thực hiện, cung cấp cho ta một tóm lƣợc của một bản tin có chiều dài bất kỳ. Và sẽ là khó khăn để tìm ra hai bản tin mà có cùng một tóm lƣợc. Một số ví dụ về mã hóa MD5

MD5 ("") = d41d8cd98f00b204e9800998ecf8427e MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0

MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f MD5 ("1234567890123456789012345678901234567890123456789012345678901234567890 1234567890") = 57edf4a22be3c955ac49da2e2107b67a 3.4.Các ứng dụng của MD5

MD5 – giải thuật mã hóa bản tin 5 đƣợc thiết kế bởi giáo sƣ Ronald L. Rivest vào năm 1991 để thay thế cho giải thuật MD4 cho ứng dụng chính trong mật mã học. MD5 đã đƣợc sử dụng rộng rãi trong nhiều ứng dụng bảo mật cũng nhƣ trong việc kiểm tra tính toàn vẹn của tập tin kể từ khi nó đƣợc công bố nhƣ là một chuẩn của Internet (RFC 1321) vào năm 1992.

42

Ví dụ dƣới đây minh họa giá trị MD5 checksum của một file thay đổi nhƣ thế nào khi một bit đơn của file bị thay thế, giả sử ta có hai file text chứa các đoạn text: “Test B” và “Test C”, hai đoạn text này chỉ khác nhau một bit nhị phân giữa ký tự B và C. Sau đó tính toán các giá trị MD5 checksum.

Giá trị MD5 checksum cho “Test B”

C C 5 0 6 D E 5 3 9 3 8 E 1 1 3 2 D 6 C F B 4 7 4 6 C 3 7 E 1 3

Giá trị MD5 checksum cho “Test C”

C 7 8 B 7 0 9 C 4 7 2 F 5 4 7 6 5 4 6 E 2 7 D 8 8 E 7 6 3 F A 5

Ta có thể nhận thấy các giá trị MD5 checksum thay đổi hoàn toàn khi một file nào đó chỉ thay đổi chỉ 1 bit.

Trong các hệ thống xác thực, MD5 đƣợc dùng đảm bảo an toàn cho các thông tin quan trọng khi lƣu trữ và truyền tải, ví dụ các thông tin đăng nhập, mật khẩu ...Chắc chắn rằng mọi ngƣời dùng máy tính có ít nhất một lần phải nhập password để truy cập tài nguyên hệ thống, các hệ thống xác thực tốt không lƣu các password này ở dạng thông thƣờng, thay vào đó chúng lƣu mã MD5 của các password và quá trình kiểm tra đƣợc áp dụng là so sánh mã MD5 đã lƣu của một password với mã MD5 của một password đƣợc nhập. Nên ngay cả trong trƣờng hợp có các mối đe dọa xâm nhập vào hệ thống thì chúng cũng chỉ thu đƣợc mã MD5 của mật khẩu ngƣời dùng.

Một số hệ điều hành sử dụng MD5 để lƣu mật mã của password và có các công cụ dựa MD5 trong gói phân phối chuẩn. Hệ FreeBSD có một hỗ trợ nguyên thủy của MD5. Linux là một hệ thống khác sử dụng MD5 nhƣ phƣơng thức mặc định để bảo vệ mật khẩu. Hai hệ điều hành khác, Mac OS X và Windows sử dụng các phƣơng pháp khác nhau để lƣu trữ mật khẩu, nhƣng cách tiếp cận thì cũng rất giống nhau.

3.5.Thám mã MD5

Giải mã MD5 là một trong những bài toán đòi hỏi tính toán lớn. Vì nhƣ ta đã biết mật mã MD5 là mật mã một chiều, tức là không thể dịch ngƣợc mật mã lại đƣợc bằng các từ khóa hay thuật toán mã hóa (của chính MD5) hay thuật toán mã hóa khác. Hiện nay các thuật toán giải mã MD5 chủ yếu là dùng phép so sánh, tức là đối với một bảng ký tự đầu vào, độ dài của chuỗi ký tự cần tìm, chƣơng trình sẽ tự tổ hợp và sắp xếp từng mật mã có độ dài nhỏ nhất cho đến độ dài lớn nhất, và từ ký tự đầu tiên của bảng ký tự cho tới ký tự cuối cùng của bảng mã.

43

Mỗi lần tổ hợp ra một mật mã, chƣơng trình sẽ tiến hành mã hóa mật mã vừa tạo đƣợc sang mã MD5, sau đó đem so sánh với mã MD5 cần đƣợc giải mã. Nếu nhƣ hai mật mã MD5 này trùng nhau, thì mật mã mà chƣơng trình vừa tạo ra đƣợc chính là mật mã cần tìm và bài toán đƣợc giải quyết. Tuy nhiên, nếu hai mã MD5 không khớp, thì chƣơng trình sẽ tiếp tục tạo ra các tổ hợp mật mã mới, và mã hóa chúng dƣới dạng MD5 và tiếp tục đem so sánh với mã MD5 đã cho. Công việc cứ tiếp tục nhƣ vậy cho đến khi giải đƣợc mật mã, hoặc không tìm đƣợc mật mã đó với bảng ký tự ban đầu đã cho (bảng ký tự đầu vào bị thiếu). Trong bài toán giải mã mật mã MD5 với bảng mã ký tự đầu vào là loweralpha-numeric gồm các ký tự:

~0: “0123456789”

~a: “abcdefghijklmnopqrstuvwxyz”

Tổng quát nếu bảng mã ký tự đầu vào mà có độ dài là n (có chứa n ký tự) , độ dài password cần phá ta dự đoán từ k1 đến k2 . Thì số password cần sinh tối đa sẽ là :

44 (adsbygoogle = window.adsbygoogle || []).push({});

CHƯƠNG 4 - GPU VÀ CÔNG NGHỆ TÍNH TOÁN

ĐA DỤNG GPGPU

Công nghệ GPU là một hƣớng tiếp cận mới đối với các bài toán cần khối lƣợng tính toán lớn. Trong lĩnh vực thám mã, công nghệ này đã có nhiều những nghiên cứu và ứng dụng. Chƣơng này xin trình bày về công nghệ tính toán dựa trên các bộ xử lý đồ họa, cụ thể là các bộ xử lý đồ họa của Nvidia. Đồng thời trình bày về môi trƣờng phát triển ứng dụng của Nvidia là CUDA.

4.1.Các bộ xử lý đồ họa đa lõi của Nvidia

Trong vài năm gần đây, năng lực tính toán của các bộ xử lý đồ hoạ (GPU) đã tăng lên với tốc độ đáng kể so với CPU. Tính đến tháng 6/2008, GPU thế hệ GT200 của NVidia đã đạt tới ngƣỡng 933GFlops gấp hơn 10 lần so với bộ xử lý hai lõi Intel Xeon 3.2 GHz tại cùng thời điểm. Hình 4.1 thể hiện sự tăng tốc về năng lực tính toán của các bộ xử lý đồ hoạ nVidia so với bộ xử lý Intel.

Hình 4.1. GPU dành nhiều transistor hơn CPU để xử lý dữ liệu

Tuy vậy, sự vƣợt trội về hiệu năng này không đồng nghĩa với sự vƣợt trội về công nghệ. GPU và CPU đƣợc phát triển theo hai hƣớng khác biệt: trong khi công nghệ CPU cố gắng tăng tốc cho một nhiệm vụ đơn lẻ thì công nghệ GPU lại tìm cách tăng số lƣợng nhiệm vụ có thể thực hiện song hành. Chính vì vậy, trong khi số lƣợng lõi tính toán trong CPU

45

chƣa đạt đến con số 8 lõi thì số lƣợng lõi xử lý GPU đã đạt đến 240 và còn hứa hẹn tiếp

Một phần của tài liệu Nghiên cứu một số thuật toán thám mã sử dụng công nghệ tính toán song song trên các bộ xử lý đồ họa (Trang 36)