Giải nén (inflate)

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

Trong tất cả các trƣờng hợp, giải thuật giải nén có dạng nhƣ sau:

do (Lặp cho đến khi hết dữ liệu hoặc gặp block cuối) Đọc header của block từ dữ liệu vào;

if (block không nén)

Bỏ qua các bit còn lại trong byte hiện tại; Đọc LEN và NLEN;

Copy LEN byte dữ liệu tới output; else

if (block nén với mã Huffman động) Đọc biểu diễn các cây mã Huffman; do

Giải mã giá trị value từ input; if value < 256

Copy value tới output; else

if value = end-of-block (256) break;

else

Giải mã distance từ input data;

Dịch về sau distance byte trong outputvà copy length byte từ vị trí

32

đó tới output; while (chưa hết block đang xét);

while (chưa hết dữ liệu) hoặc (chưa phải là block cuối);

Đoạn mã trên nhận dữ liệu đầu vào và tiến hành xử lý qua các block, thể hiện ở việc đọc block header trƣớc khi xử lý. Nhƣ mô tả ở phần trƣớc, chỉ có 3 loại block trong dữ liệu nén. Đối với block không nén thì việc giải mã là đơn giản, chỉ cần đọc ra giá trị LEN là độ dài của dữ liệu literal trong block đó và copy LEN byte dữ liệu tới output.

Đối với block nén bằng mã Huffman cố định thì bảng mã Huffman cho các bộ literal/length và distance đã đƣợc định nghĩa sẵn trong đặc tả.

Ta xét các block nén bằng mã Huffman động, thực tế đây là loại block phổ biến hơn trong dữ liệu nén.

 Bởi vì các bộ literal/length và distance đƣợc mã hóa bằng mã Huffman theo độ dài (canonical Huffman) , và các độ dài này lại đƣợc mã hóa bằng mã Huffman theo độ dài, nên trƣớc hết cần phải giải mã bộ Code Length để lấy thông tin về độ dài từ mã. Cách giải mã canonical Huffman khi biết chiều dài từ mã đã đƣợc mô tả trong phần b) của mục 2.2.1

 Tiếp theo, dùng bộ mã Huffman của bộ Code Length để giải mã cho ra hai bộ mã Huffman của bộ literal/length và bộ distance

 Tiếp theo sử dụng 2 bộ mã Huffman của literal/length và distance để giải mã dữ liệu nén

 Tiếp theo giải nén dữ liệu nén bằng giải thuật LZ77

2.4.Phương thức mã hóa và giải mã

Từ phiên bản 9.0 trở đi, Winzip hỗ trợ hệ thống mã hóa mạnh AES với các độ dài khóa là 128 và 256 bit. Khóa AES đƣợc tạo ra từ mật khẩu ngƣời dùng cung cấp nhờ hàm băm PBKDF2 nhƣ mô tả ở phần 2.1. Sau đó khóa này có thể đƣợc dùng để mã hóa hoặc giải mã tùy theo ngữ cảnh cụ thể.

AES viết tắt của Advanced Encrypt Standard là một thuật toán mã hóa khối, đƣợc chuẩn hóa từ hệ Rijndael vào năm 2001. Trƣớc đó vào năm 1997, NIST kêu gọi xây dựng một hệ thống mã hóa mới thay thế cho DES và hệ Rijndael của Daemen và Rijmen đã đƣợc chọn.

33

AES làm việc với các khóa có độ dài 128, 192, 256 bit . Độ dài khối dữ liệu là 128 bit. Trong thuật toán sử dụng Nr vòng lặp, phụ thuộc độ dài khóa. Hình trên cho thấy sự kết hợp của độ dài khóa, kích thƣớc khối dữ liệu và số vòng lặp đƣợc sử dụng trong AES. Thuật toán AES đƣợc đặc tả chi tiết trong tài liệu F.I.P.S-197 về mã AES [1].

2.4.1.Mã hóa

Winzip thực hiện mã hóa tài liệu sau khi nén và chỉ áp dụng cho nội dung của file, không kết hợp với bất kỳ dữ liệu nào khác. Tài liệu đƣợc mã hóa theo từng byte sử dụng giải thuật AES hoạt động trong chế độ đếm “CTR”, có nghĩa là độ dài của dữ liệu nén và độ dài của dữ liệu nén, mã hóa là nhƣ nhau. Mặc dù dữ liệu đƣợc mã hóa theo từng byte nhƣng trong khi xử lý, nó đƣợc biểu diễn dƣới dạng các block có kích thƣớc là 16 byte.

Hình 2.4. Mã hóa AES trong chế độ CTR

Hình 2-4 minh họa chế độ đếm của giải thuật AES với CTR là bộ đếm, M là message (hoặc plaintext). Bộ đếm đƣợc khởi tạo ban đầu bằng 0, các giá trị đếm tăng dần đƣợc mã (adsbygoogle = window.adsbygoogle || []).push({});

34

hóa sử dụng giải thuật mã hóa khối AES (hàm F ở trên hình) và cho kết quả đầu ra là các khối X-i. Sau đó các khối M-i và X-i tƣơng ứng đƣợc XOR với nhau để tạo ra các khối ciphertext C-i. Chú ý rằng ở đây CTR-i, M-i và X-i đều có kích thƣớc là BLOCK_SIZE (16 byte).

2.4.2.Giải mã

Do phép XOR là đảo của chính nó nên quy trình giải mã hoàn toàn giống với quy trình mã hóa. Với cùng khóa AES, ta tiến hành mã hóa giá trị bộ đếm counter rồi thực hiện XOR kết quả với ciphertext thì sẽ thu đƣợc plaintext.

Để thực hiện công việc này, ta xây dựng một hàm AES_ctr nhận đầu vào là dữ liệu đọc từ tệp nén ZIP data_compressed_encrypted có kích thƣớc CHUNK, thực hiện giải mã và cho đầu ra là dữ liệu data_compressed có cùng kích thƣớc, mã giả của hàm này nhƣ sau:

len=0;

pos=BLOCK_SIZE;/*kích thước khối dữ liệu trong AES (16 byte) */ counter = 0; /*bộ đếm có kích thước BLOCK_ SIZE, ban đầu = 0 */ While (len < CHUNK) /*lặp cho đến khi hết dữ liệu*/

{

/*tiến hành xử lý từng khối kích thước BLOCK_SIZE*/ if (pos == BLOCK_SIZE)

{

/*tăng giá trị bộ đếm*/ counter++;

/*mã hóa bộ đếm bằng giải thuật mã hóa khối AES, đầu ra là bộ đệm enc_buf có kích thước BLOCK_SIZE*/

enc_buf = aes_encrypt(AesKey,counter); pos = 0;

}

/* thực hiện xor bộ đệm với dữ liệu mã hóa */ data_compressed[len++]=

data_compressed_encrypted[len++] ^ enc_buf[pos++]; }

35

CHƯƠNG 3 - TỔNG QUAN VỀ MÃ HÓA MD5

Chƣơng này trình bày về mã hóa MD5, một phƣơng thức mã hóa rất phổ biến trên thế giới và đƣợc ứng dụng rộng rãi. Mã MD5 là một dạng mã hóa 1 chiều và việc thám mã MD5 là một bài toán ngƣợc, đòi hỏi khối lƣợng tính toán thử sai lớn. Dƣới đây sẽ trình bày kỹ về các giải thuật liên quan đến MD5, phục vụ cho việc thiết kế giải thuật song song thám mã MD5 trên bộ xử lý đồ họa.

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

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

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

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

Ở 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

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

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