Tải bản đầy đủ (.pdf) (95 trang)

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

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 (2.84 MB, 95 trang )

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
--------------------------------------LÊ ĐỨC HÙNG

LÊ ĐỨC HÙNG

CÔNG NGHỆ THÔNG TIN

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

LUẬN VĂN THẠC SĨ KHOA HỌC
CÔNG NGHỆ THÔNG TIN
KHOÁ 2009-2010

Hà Nội – 2011


LỜI CAM ĐOAN
Tôi – Lê Đức Hùng – xin cam đoan:
 Luận văn tốt nghiệp Thạc sĩ này là công trình nghiên cứu của bản thân tôi dƣới sự
hƣớng dẫn của Tiến sĩ Nguyễn Hữu Đức.
 Các kết quả trong Luận văn tốt nghiệp là trung thực, không phải sao chép toàn văn
của bất kỳ công trình nào khác.
Hà Nội, ngày 1 tháng 11 năm 2010

Lê Đức Hùng

1



LỜI CẢM ƠN
Tôi xin gửi lời cảm ơn sâu sắc tới Tiễn sĩ Nguyễn Hữu Đức, thầy đã trực tiếp hƣớng
dẫn tôi trong quá trình thực hiện luận văn này. Thầy là ngƣời ra đƣa ra ý tƣởng và hỗ trợ
tôi rất nhiều trong việc định hƣớng tìm hiểu, triển khai các giải thuật thám mã và công
nghệ GPU.
Tôi xin gửi lời cảm ơn chân thành tới Phó giáo sƣ, Tiến sĩ Nguyễn Thanh Thủy,
thầy đã hỗ trợ tôi về mặt ý tƣởng và định hƣớng cho đề tài từ khi mới bắt đầu.
Tôi xin gửi lời cảm ơn đến Trung tâm Tính toán Hiệu năng cao – Trường Đại học
Bách Khoa Hà Nội, nơi tôi đang làm việc. Trung tâm đã hỗ trợ tôi rất nhiều về mặt
chuyên môn cũng nhƣ cơ sở vật chất để thực hiện luận văn này.
Tôi xin gửi lời cảm ơn đến các thành viên của Trung tâm Tính toán Hiệu năng cao đã
giúp đỡ tôi trong những lúc khó khăn, cùng thảo luận và làm việc với tinh thần hăng say
nhiệt huyết trong suốt thời gian qua.
Cuối cùng, con xin cảm ơn gia đình đã động viên giúp đỡ con trong suốt quá trình
học tập cũng nhƣ làm luận văn.

2


MỤC LỤC
LỜI CAM ĐOAN ................................................................................................................ 1
LỜI CẢM ƠN ...................................................................................................................... 2
DANH MỤC HÌNH VẼ ...................................................................................................... 6
DANH MỤC BẢNG ........................................................................................................... 7
DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ ............................................................... 8
CHƢƠNG 1 -

GIỚI THIỆU CHUNG ........................................................................... 10


1.1. Tổng quan về mật mã học .................................................................................... 10
1.2. Giới thiệu bài toán thám mã tệp nén Zip và thám mã MD5 ................................ 11
1.2.1. Bài toán thám mã tệp nén Zip ....................................................................... 11
1.2.2. Giới thiệu về bài toán thám mã MD5 ............................................................ 12
1.3. GPGPU – Giải pháp cho bài toán thám mã ......................................................... 13
1.4. Mục tiêu của luận văn .......................................................................................... 14
1.5. Cấu trúc của luận văn ........................................................................................... 14
CHƢƠNG 2 -

TỔNG QUAN VỀ NÉN VÀ MÃ HÓA TRONG TỆP TIN ZIP ........... 16

2.1. Thông tin mã hóa AES trong tệp nén ZIP ............................................................ 16
2.1.1. Phƣơng thức nén và cờ mã hóa ..................................................................... 16
2.1.2. AES extra data field ...................................................................................... 16
2.1.3. Định dạng dữ liệu mã hóa ............................................................................. 17
2.2. Hàm băm sinh khóa và cách kiểm tra một mật khẩu ứng cử ............................... 19
2.3. Phƣơng thức nén và giải nén ................................................................................ 21
2.3.1. Nén (deflate) .................................................................................................. 21
2.3.2. Giải nén (inflate) ........................................................................................... 31
2.4. Phƣơng thức mã hóa và giải mã ........................................................................... 32
2.4.1. Mã hóa ........................................................................................................... 33
2.4.2. Giải mã .......................................................................................................... 34
CHƢƠNG 3 -

TỔNG QUAN VỀ MÃ HÓA MD5 ....................................................... 35

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

3



3.2. Mã hóa MD5 ........................................................................................................ 36
3.3. Tổng kết về mã MD5 ........................................................................................... 41
3.4. Các ứng dụng của MD5 ....................................................................................... 41
3.5. Thám mã MD5 ..................................................................................................... 42
CHƢƠNG 4 -

GPU VÀ CÔNG NGHỆ TÍNH TOÁN ĐA DỤNG GPGPU................. 44

4.1. Các bộ xử lý đồ họa đa lõi của Nvidia ................................................................. 44
4.2. Kiến trúc của GPU Tesla ...................................................................................... 46
4.3. Môi trƣờng phát triển ứng dụng cho GPU – CUDA............................................ 50
4.3.1. Khả năng mở rộng của CUDA ...................................................................... 50
4.3.2. Các khái niệm chính ...................................................................................... 52
4.3.3. Lập trình không đồng nhất ............................................................................ 59
4.3.4. Khả năng tính toán ........................................................................................ 61
4.4. Hệ thống GPU-Cluster ......................................................................................... 61
4.4.1. Phần cứng ...................................................................................................... 61
4.4.2. Phần mềm ...................................................................................................... 62
4.5. Giao diện lập trình................................................................................................ 63
4.5.1. Biên dịch với NVCC ..................................................................................... 64
4.5.2. CUDA C ........................................................................................................ 64
4.6. Tổng kết ............................................................................................................... 65
CHƢƠNG 5 HỌA

KHÔI PHỤC MẬT KHẨU CHO TỆP NÉN ZIP TRÊN BỘ XỬ LÝ ĐỒ
66

5.1. Tiếp cận theo phƣơng pháp vét cạn ..................................................................... 66
5.2. Tiếp cận theo phƣơng pháp phân tích cấu trúc mật khẩu .................................... 69

CHƢƠNG 6 -

THÁM MÃ MD5 TRÊN CÁC BỘ XỬ LÝ ĐỒ HỌA .......................... 73

6.1. Giải thuật .............................................................................................................. 73
6.2. Cài đặt module chƣơng trình ............................................................................... 75
6.3. Thực hiện giải thuật trên nhiều GPU ................................................................... 76
CHƢƠNG 7 -

THỬ NGHIỆM VÀ ĐÁNH GIÁ ........................................................... 79

7.1. Thiết lập môi trƣờng thử nghiệm ......................................................................... 79
4


7.2. Thử nghiệm và đánh giá bài toán thám mã tệp nén Zip ...................................... 81
7.2.1. Thử nghiệm ................................................................................................... 81
7.2.2. Đánh giá ........................................................................................................ 83
7.3. Thử nghiệm và đánh giá bài toán thám mã MD5 ................................................ 84
7.3.1. Thử nghiệm ................................................................................................... 84
7.3.2. Đánh giá ........................................................................................................ 85
CHƢƠNG 8 -

KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN ............................................. 86

8.1. Kết luận ................................................................................................................ 86
8.2. Hƣớng phát triển .................................................................................................. 86
TÀI LIỆU THAM KHẢO ................................................................................................. 88
PHỤ LỤC .......................................................................................................................... 89
Phụ lục A. Cấu trúc của một tệp nén ZIP....................................................................... 89

Phụ lục B. Một số hàm thông dụng trong CUDA.......................................................... 93

5


DANH MỤC HÌNH VẼ
Hình 1.1. Mã hóa, giải mã tệp nén Zip .............................................................................. 11
Hình 2.1. Giải thuật kiểm tra một mật khẩu có phải là ứng cử ......................................... 20
Hình 2.2. Ví dụ nén dữ liệu sử dụng giải thuật LZ77 ....................................................... 23
Hình 2.3. Ví dụ giải nén dữ liệu sử dụng giải thuật LZ77 ................................................ 23
Hình 2.4. Mã hóa AES trong chế độ CTR ......................................................................... 33
Hình 3.1. Một thao tác MD5 ............................................................................................. 37
Hình 4.1. GPU dành nhiều transistor hơn CPU để xử lý dữ liệu ...................................... 44
Hình 4.2. Số phép tính dấu phẩy động trên giây và băng thông bộ nhớ của CPU và GPU
........................................................................................................................................... 45
Hình 4.3. Kiến trúc Tesla................................................................................................... 47
Hình 4.4. CUDA đƣợc thiết kế để hỗ trợ nhiều ngôn ngữ hoặc các API khác nhau. ........ 50
Hình 4.5. Khả năng tự mở rộng ......................................................................................... 52
Hình 4.6. Lƣới của các block............................................................................................. 55
Hình 4.7. Phân cấp bộ nhớ ................................................................................................ 59
Hình 4.8. Lập trình không đồng nhất ................................................................................ 60
Hình 4.9. Các nút trong mô hình GPU Cluster.................................................................. 62
Hình 6.1. Kiểm tra mật khẩu theo lô ................................................................................. 73

6


DANH MỤC BẢNG
Bảng 2.1. Cấu trúc tƣờng extra .......................................................................................... 17
Bảng 2.2. Bảng mã cho bộ ký tự length ............................................................................ 28

Bảng 2.3. Bảng mã cho bộ ký tự distance ......................................................................... 29
Bảng 2.4. Mã Huffman cố định cho bộ Literal/length ...................................................... 29
Bảng 4.1. Ví dụ Makefile trộn mã CUDA + MPI ............................................................. 63
Bảng 7.1. Thời gian xác định tập mật khẩu ứng cử trên CPU và GPU ............................. 81
Bảng 7.2. Tốc độ sinh khóa trên GPU ............................................................................... 82
Bảng 7.3. Thời gian khôi phục mật khẩu trên GPU theo tiếp cận 1 .................................. 82
Bảng 7.4. Bảng tốc độ sinh và duyệt khóa so sánh 2 cách tiếp cận .................................. 83
Bảng 7.5. Thời gian khôi phục mật khẩu trên GPU theo tiếp cận 2 .................................. 83
Bảng 7.6. Minh hoạ tốc độ kiểm tra khóa MD5 trên CPU và các GPU ............................ 84
Bảng 7.7. minh hoạ hiệu năng thực hiện công việc thám mã MD5 trên CPU và GPU .... 85

7


DANH MỤC TỪ VIẾT TẮT VÀ THUẬT NGỮ
TỪ VIẾT TẮT

NGHĨA TIẾNG ANH

MD5

Message-Digest algorithm 5

Giải thuật băm mật mã với độ dài mã
128-bit (thay thế cho MD4).

PKZip

Phil Katz Zip


Giải thuật nén sử dụng trong tệp tin Zip

LZMA

Lempel–Ziv–Markov chain
algorithm

Giải thuật nén sử dụng trong tệp tin Zip

DES

Data Encryption Standard

Hệ mã đối xứng mã hóa dữ liệu. Có
nhiều điểm yếu.

AES

Advanced Encryption
Standard

Thuật toán mã hóa khối, mã hóa dữ liệu
cải tiến và là hệ mã mạnh, có kích thƣớc
khóa là 128-bit, 192-bit hoặc 256-bit.

RC4

Rivest Cipher 4

Hệ mã đối xứng.


GPU

Graphic Processing Unit

Bộ xử lý đồ họa

GPGPU

General-purpose computing
on graphics processing units

Tính toán đa dụng trên các bộ xử lý đồ
họa.

CUDA

Compute Unified Device
Architecture

Ngôn ngữ lập trình cho các bộ xử lý đồ
họa của hãng NVIDIA

Password-Based Key
Derivation Function

Giải thuật sinh mã từ mật khẩu ban đầu
có giá trị salt ngẫu nhiên.

PVV


Password Verify Value

Giá trị kiểm tra mật khẩu có kích thƣớc
2 byte.

MSB

Most significant bit

Bit cao nhất.

SM

Streaming Multiprocessors

Đa xử lý dòng lệnh

CWD

Compute Work Distribution

Đơn vi phân phát công việc tính toán.

Scalar Processor

Xử lý vô hƣớng

PBKDF2


SP

CHÚ GIẢI

8


Đơn vị chức năng đặc biệt, dành cho
tính toán siêu việt.

SFU

Special Function Unit

SIMT

Single-Instruction, Multiple- Đơn dòng lệnh, đa tiến trình.
Thread

9


CHƯƠNG 1 - GIỚI THIỆU CHUNG
1.1. Tổng quan về mật mã học
Mật mã học (tiếng Anh là Cryptography hoặc Cryptology) là ngành khoa học nghiên cứu
về các kỹ thuật toán học liên quan tới các khía cạnh an toàn thông tin. Trƣớc thời kỳ hiện
đại, mật mã học chỉ tập trung duy nhất tới tính bí mật của bản tin – tức là gắn liền với sự
mã hóa, đó là quá trình chuyển đổi các thông tin thông thƣờng (bản rõ) ở dạng có thể
nhận thức đƣợc thành một dạng không thể nhận thức đƣợc, làm cho thông tin không thể
đọc đƣợc nếu nhƣ không có các kiến thức bí mật (đƣợc gọi là khóa dùng để giải mã cho

bản tin đó). Việc mã hóa đƣợc dùng để đảm bảo tính bí mật của thông tin trong lƣu trữ
cũng nhƣ trong thông tin liên lạc, chẳng hạn trong công tác tình báo, quân sự, ngoại giao
hay là kinh tế, thƣơng mại. Trong những thập niên gần đây, lĩnh vực này đã đƣợc mở
rộng vƣợt ra ngoài các mối quan tâm về tính bí mật và bao gồm các kỹ thuật khác nhƣ
kiểm tra tính toàn vẹn của thông điệp, xác thực định danh ngƣời gửi/nhận, chữ ký số,
chứng thực khóa công khai.
Về mặt thuật ngữ, cho đến thời kỳ hiện đại, thuật ngữ cryptography đƣợc dùng để nhắc
đến việc sử dụng và thực hành các kỹ thuật mật mã hóa. Nhiều ngƣời sử dụng thuật ngữ
cryptography và cryptology hoán đổi cho nhau trong tiếng Anh. Tuy vậy, theo các
chuyên gia về mật mã cryptology dùng để chỉ sự nghiên cứu kết hợp của mật mã hóa
(cryptography) và thám mã (cryptanalysis).
Thám mã (tiếng Anh là Cryptanalysis) – là khoa học nghiên cứu về các phƣơng pháp lấy
lại ý nghĩa của các thông tin đã bị mã hóa, mà không cần truy xuất tới các thông tin bí
mật mà thƣờng là cần phải có để có thể làm đƣợc điều đó. Thông thƣờng, điều này liên
quan đến hiểu biết về cách hệ thống làm việc và tìm ra một khóa bí mật. Mục tiêu của
thám mã (phá mã) là tìm những điểm yếu hoặc không an toàn trong phƣơng thức mật mã
hóa. Thám mã có thể đƣợc thực hiện bởi những kẻ tấn công mục đích xấu, nhằm làm
hỏng hệ thống; hoặc bởi những ngƣời thiết kế ra hệ thống (hoặc những ngƣời khác) với ý
định đánh giá độ an toàn của hệ thống.
Khoa học thám mã luôn đi cùng với khoa học mật mã trong suốt chiều dài lịch sử của mật
mã học – một thuật toán mã hóa mới đƣợc thiết kế để thay thế những thiết kế cũ bị hỏng,
và các kỹ thuật thám mã mới đƣợc phát minh để phá vỡ các đề án cải thiện này. Hai

10


Chương1 – Giới thiệu chung
nhánh nghiên cứu này đƣợc xem nhƣ hai mặt của cùng vấn đề an toàn an ninh thông tin:
sự phát triển của một nhánh luôn thúc đẩy sự phát triển của nhánh kia và ngƣợc lại.
Trong lịch sử phát triển, sự phát triển vƣợt trƣớc của một nhánh so với nhánh còn lại đôi

khi mang đến những lợi ích to lớn cho đời sống, thậm chí còn quyết định vận mệnh của
cả một đất nƣớc.Ví dụ nhƣ sự thành công trong việc thám mã Zimmermann Telegram
trong thế chiến thứ nhất đã kéo Hoa Kỳ vào cuộc chiến, hay việc thám mã thành công hệ
mã German đƣợc đánh giá góp phần rút ngắn thế chiến thứ hai đi vài tháng [4].

1.2. Giới thiệu bài toán thám mã tệp nén Zip và thám mã MD5
1.2.1. Bài toán thám mã tệp nén Zip
Ban đầu, các phƣơng pháp nén nhƣ PKZip, Deflate, LZMA đƣợc sử dụng nhằm giảm
thiểu kích thƣớc dữ liệu, từ đó giúp cho việc lƣu trữ cũng nhƣ trao đổi chúng đƣợc hiệu
quả.
Do việc bảo mật thông tin thƣờng luôn đi kèm với các kỹ thuật lƣu trữ và trao đổi thông
tin nên bên cạnh các giải thuật nén hiệu quả, những công cụ nén phổ biến nhƣ WinZip
hay WinRar thƣờng tích hợp khả năng mã hoá thông tin nén, thông thƣờng là sử dụng
những hệ mã đối xứng phổ biến nhƣ DES hay AES.
Để thuận tiện cho ngƣời dùng, khoá bí mật cho các hệ mã này đƣợc sinh ra từ một mật
khẩu do ngƣời gửi nhập vào thông qua một hàm băm và đƣợc sử dụng để mã hoá tài liệu.
Sau đó mật khẩu đƣợc ngƣời gửi chuyển đến cho ngƣời nhận qua một kênh an toàn và
đƣợc ngƣời nhận sử dụng để sinh khoá cho quá trình giải mã. Quá trình mã hoá và giải
mã tệp nén Zip đƣợc mô tả nhƣ trong hình 1.1.

Hình 1.1. Mã hóa, giải mã tệp nén Zip

Bài toán thám mã tệp nén Zip đƣợc đặt ra ở đây là: cho một tệp nén Zip đƣợc bảo vệ bởi
mật khẩu, hãy xác định nội dung tài liệu trong đó mà không cần sử dụng mật khẩu này.

11


Chương1 – Giới thiệu chung
Trong thực tế, với các hệ mã yếu nhƣ RC4 hay DES, việc thám mã có thể đƣợc tiến hành

thông qua phƣơng pháp tấn công vét cạn trên không gian khoá trong thời gian chấp nhận
đƣợc. Các kết quả nghiên cứu về giải mã mã DES [3], và tấn công trên hệ mã RC4 [5] là
những minh chứng cho kỹ thuật này.
Với các hệ mã mạnh nhƣ AES (hệ mã đƣợc sử dụng phổ biến trong các phiên bản mới
của WinZip) việc tấn công vét cạn nhƣ vậy là không khả thi. AES[1], tiêu chuẩn mã hóa
tiên tiến, là một thuật toán mã hóa khối. AES làm việc với các khối dữ kiệu 128 bít (4x4
bytes) và khóa của nó có độ dài là 128, 192 hoặc 256 bít. AES có thể dễ dàng thực hiện
với tốc độ cao bằng phần mềm hoặc phần cứng và không đòi hỏi nhiều bộ nhớ. Là một hệ
thống mã hóa mạnh, AES-128/AES-256 với kích thƣớc khóa là 128/256 bít có đến 2128
/2256 khả năng phải thử để có thể tìm ra đƣợc mật khẩu ban đầu. Một số nghiên cứu gần
đây nhƣ giải thuật XSL[2] cho phép giảm không gian khóa từ 2128 khả năng xuống còn
khoảng 2100 khả năng. Tuy nhiên, ngay cả nhƣ vậy, việc thử hết tất cả các khả năng đó
vẫn là không chấp nhận đƣợc đối với các hệ thống tính toán thông dụng.
Cách tiếp cận đƣợc đề xuất ở đây là không trực tiếp tấn công trên không gian khoá AES.
Thay vào đó, do khoá cho các hệ mã của tệp nén Zip đƣợc sinh ra từ mật khẩu ngƣời
dùng thông qua một hàm băm đƣợc công bố trong đặc tả tệp nén[8]. Không gian mật
khẩu mặc dù lớn nhƣng tính khả thi cho việc thám mã tệp nén dựa trên không gian mật
khẩu cao hơn nhiều so với thám mã dựa trên không gian khoá.
Ngoài ra, khi nén một tệp tin gốc, nếu chúng ta lựa chọn phƣơng pháp nén mặc định, thì
giải thuật đƣợc lựa chọn nén là Deflate. Mọi thông tin liên quan đến giải thuật nén và mã
hóa nào đƣợc lựa chọn, có thể lấy đƣợc nhờ thông tin trực tiếp lƣu trong header của tệp
nén ZIP. Đối tƣợng nghiên cứu cụ thể trong luận văn này là tệp tin nén zip đƣợc nén bằng
giải thuật DeFlate, và mã hóa bằng giải thuật AES -128 hoặc AES-256. Thông tin này là
quan trọng cho việc khôi phục chính xác mật khẩu đúng cho tệp nén đã đƣợc bảo vệ nhờ
quy trình giải mã và giải nén tệp tin.

1.2.2. Giới thiệu về bài toán thám mã MD5
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.
12


Chương1 – Giới thiệu chung
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.

1.3. GPGPU – Giải pháp cho bài toán thám mã
Đối với bài toán thám mã tệp nén Zip, trở ngại lớn nhất cho phƣơng pháp thám mã dựa
trên không gian mật khẩu là độ phức tạp tính toán của hàm băm là khá cao, cộng thêm
với kỹ thuật salting nhằm chống tấn công tính toán trƣớc của tệp nén Zip khiến cho việc
tấn công vét cạn trở nên rất kém hiệu quả trên các hệ thống tính toán thông dụng.
Đối với bài toán thám mã MD5, 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.

Các bài toán thám mã trên đây đều yêu cầu một khối lƣợng tính toán lớn mà các hệ thống
tính toán thông dụng không đáp ứng đƣợc, hoặc trong thời gian không thể chấp nhận.
Bằng việc đầu tƣ cho các hệ thống lớn hoặc các thiết bị chuyên dụng sẽ mang lại hiệu quả
cao nhất, tuy nhiên kinh phí lại là vấn đề lớn. Cần có một giải pháp hiệu quả để có thể áp
dụng rộng rãi trong lĩnh vực tính toán nói chung và thám mã nói riêng. Công nghệ sử
dụng card đồ họa cho mục đích tính toán ra đời tạo ra một hƣớng đi mới cho công nghệ
tính toán song song, đƣợc phát triển mạnh mẽ và ứng dụng trong rất nhiều các bài toán
cần độ tính toán lớn, trong đó có các bài toán thám mã.
Đ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ị 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, dễ hiểu và dễ lập trình.

13


Chương1 – Giới thiệu chung

1.4. Mục tiêu của luận văn
Luận văn có mục đích nghiên cứu nhƣ sau:
-

Nghiên cứu về phƣơng pháp thám mã cho đối tƣợng là tệp nén Zip đƣợc bảo vệ bởi
mật khẩu.
Nghiên cứu giải thuật mã hóa bằng MD5.
Nghiên cứu công nghệ lập trình song song trên CUDA để phục vụ các bài toán thám
mã.

Đối tƣợng nghiên cứu bao gồm:
-


Tệp tin nén ZIP đƣợc tạo ra bởi công cụ ZIP, cụ thể là phần mềm Winzip từ phiên
bản 9.0 trở đi.
Phƣơng pháp mã hóa MD5.
Ngôn ngữ lập trình CUDA.

Phạm vi nghiên cứu của luận văn giới hạn trên tập tin ZIP với phƣơng pháp mã hóa
Deflate và mã hóa MD5.

1.5. Cấu trúc của luận văn
Luận văn đƣợc chia ra làm 8 chƣơng:
Chương 1: Giới thiệu các vấn đề liên quan đến luận văn.
Chương 2: Sơ lƣợc về nén và mã hóa trong tệp tin Zip. Trình bày về cấu trúc của tệp nén
Zip phƣơng pháp nén và giải nén dữ liệu trong tệp Zip. Tiếp theo, trình bày giải thuật để
mã hóa và giải mã tệp nén.
Chương 3: Sơ lƣợc về mã hóa MD5. Chƣơng này trình bày về các khái niệm về MD5,
phƣơng pháp mã hóa MD5 và thám mã MD5.
Chương 4: Giới thiệu về công nghệ tính toán dựa trên GPU. Chƣơng này tập trung giới
thiệu các bộ xử lý đồ họa đa lõi của Nvidia và kiến trúc của GPU Tesla. Dựa trên đó,
trình bày về môi trƣờng phát triển CUDA cho các ứng dụng GPU. Chƣơng này cũng trình
bày những nét cơ bản về GPU-Cluster, mở rộng cho công nghệ GPU.
Chương 5: Giải mã tệp nén Zip sử dụng CUDA. Chƣơng này trình bày phƣơng pháp
khôi phục mật khẩu trên tệp nén Zip trên bộ xử lý đồ họa, dựa trên 2 phƣơng pháp tiếp
cận là vét cạn và phân tích cấu trúc mật khẩu.
Chương 6: Giải mã MD5 sử dụng CUDA. Chƣơng này trình bày phƣơng pháp thám mã
MD5 sử dụng lập trình song song trên các bộ xử lý đồ họa.

14



Chương1 – Giới thiệu chung
Chương 7: Thử nghiệm và đánh giá. Nêu các thử nghiệm thực tế và đánh giá kết quả của
các giải thuật trên.
Chương 8: Kết luận và hƣớng phát triển của luận văn.

15


CHƯƠNG 2 - TỔNG QUAN VỀ NÉN VÀ MÃ HÓA
TRONG TỆP TIN ZIP
Chƣơng này tập trung trình bày về nén và mã hóa trong tệp tin Zip. Trong đó có thông tin
mã hóa AES trong tệp nén Zip và hàm băm sinh khóa để kiểm tra một mật khẩu ứng cử
có đúng hay không. Tiếp theo trình bày về phƣơng pháp nén và phƣơng pháp mã hóa
trong tệp tin Zip. Những kiến thức này sẽ phục vụ cho việc thiết kế giải thuật thám mã
trên tệp nén Zip.

2.1. Thông tin mã hóa AES trong tệp nén ZIP
Về cơ bản, định dạng của tệp ZIP đƣợc giữ nguyên nhƣ trình bày ở phụ lục A, sự khác
biệt là các file đƣợc mã hóa bởi AES sử dụng một trƣờng “extral data” mới, một mã mới
cho phƣơng thức nén, và một giá trị trong trƣờng CRC phụ thuộc vào phiên bản mã hóa
(AE-128/256). Ở đây ta quan tâm đến việc đọc ra thông tin về phƣơng thức nén và nội
dung của trƣờng “extral data”.

2.1.1. Phương thức nén và cờ mã hóa
Cũng nhƣ mọi file bị mã hóa khác, bit 0 của trƣờng “general purpose bit flags” phải đƣợc
thiết lập lên 1 trong bản ghi local file header và central directory của mỗi file mã hóa
bằng AES.
Thêm nữa, biểu hiện của một file mã hóa bằng AES trong một tệp ZIP đƣợc chỉ ra bởi từ
mã mới của phƣơng thức nén = 99 trong các bản ghi local file header và central
directory, còn mã thực sự cho phƣơng thức nén sẽ đƣợc lƣu trong trƣờng extral field.


2.1.2. AES extra data field
Một file mã hóa bởi AES sẽ có một trƣờng “extra field” đi cùng với nó. Trƣờng này đƣợc
lƣu trong cả hai bản ghi local file header và central directory của file đó.
ID header của extra data cho mã hóa AES là 0x9901. Trƣờng extra field hiện tại có độ dài
11: 7 byte dữ liệu + 2 byte cho ID header và 2 byte cho kích thƣớc dữ liệu. Do đó, trƣờng
extra data chiếm tổng cộng 22 byte cho mỗi file trong file ZIP (11 byte trong central
header và 11 byte trong local header)

16


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip

Offset
0
2
4
6
8
9

Size(bytes)
2
2
2
2
1
2


Nội dung
Extra field header ID (0x9901)
Kích thƣớc dữ liệu (hiện tại = 7)
Số hiệu phiên bản của nhà sản xuất
ID nhà sản xuất - 2 ký tự
Giá trị nguyên chỉ ra độ mạnh của AES
Phƣơng thức nén thực sự đƣợc dùng

Bảng 2.1. Cấu trúc tường extra

Ý nghĩa:
-

-

Data size: giá trị hiện tại là 7, nhƣng bởi vì đặc tả này có thể sẽ đƣợc chỉnh sửa trong
tƣơng lai để lƣu thêm dữ liệu trong trƣờng extra.
ID nhà sản suất: trƣờng này luôn đƣợc thiết lập 2 ký tự ASCII “AE”
Phiên bản nhà sản xuất: phiên bản nhà sản xuất cho AE-1 là 0x0001. Phiên bản nhà
sản xuất cho AE-2 là 0x0002
Độ mạnh mã hóa: Các giá trị sau thể hiện chế độ (độ mạnh mã hóa) cho AE-1 và AE2 là
Value
Strength
0x01
128-bit encryption key
0x02
192-bit encryption key
0x03
256-bit encryption key
Đặc tả mã hóa [1] chỉ hỗ trợ các khóa mã hóa 128,192, và 256 bit. Tuy nhiên, phiên

bản hiện tại của WINZIP không hỗ trợ mã hóa các file sử dụng độ dài khóa 192 bit.
Phƣơng thức nén: là phƣơng thức nén thực sự đƣợc sử dụng, điều này là cần thiết bởi
vì nếu một tập tin đƣợc mã hóa AES thì các phƣơng thức nén lƣu ở local header và
central header đều là 99.

2.1.3. Định dạng dữ liệu mã hóa
Dữ liệu mã hóa AES đƣợc lƣu cùng với một số thông tin bổ sung nhƣ sau:
Size (bytes)
Variable
2
Variable
10

Content
Salt value
Password verification value
Encrypted file data
Authentication code

Lúc này, giá trị trong các trƣờng “compressed size” của các bản ghi local file header và
centra directory entry là tổng kích thƣớc của tất cả các thành phần trên. Đó là tổng kích
thƣớc của Salt, Pvv, dữ liệu mã hóa, và AC.

17


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip
-

Giá trị Salt


Salt là một chuỗi byte ngẫu nhiên hoặc giả ngẫu nhiên mà sẽ đƣợc kết hợp với mật khẩu
mã hóa để tạo ra các khóa mã hóa và xác thực. Giá trị salt đƣợc sinh ra bởi ứng dụng mã
hóa và đƣợc lƣu dƣới dạng không mã hóa cùng với dữ liệu file. Việc thêm các giá trị salt
tới các mật khẩu đem lại một số lợi ích về bảo mật và làm cho các tấn công từ điển dựa
trên các khóa đƣợc tính toán trƣớc trở nên khóa khăn hơn rất nhiều.
Thực tế về mật mã yêu cầu một giá trị salt khác nhau đƣợc dùng cho mỗi file đƣợc mã
hóa với cùng một mật khẩu. Nếu hai file đƣợc mã hóa với cùng mật khẩu và salt, chúng
có thể làm rò rỉ thông tin lẫn nhau. Ví dụ, nếu có thể xác định liệu hai file có đƣợc mã
hóa với cùng mật khẩu và salt hay không, một kẻ tấn công đã thực sự biết nội dung của
một trong hai file đó có thể xác định một phần hoặc toàn bộ nội dung của file còn lại.
Kích thƣớc của giá trị Salt phụ thuộc vào độ dài của khóa mã hóa, nhƣ sau:
Key size
128 bits
192 bits
256 bits
-

Salt size
8 bytes
12 bytes
16 bytes

Giá trị kiểm tra mật khẩu PVV

Giá trị hai byte này đƣợc sinh ra nhƣ là một phần đầu ra của quá trình sinh khóa mã hóa
(hoặc giải mã). Khi mã hóa, một giá trị kiểm tra đƣợc sinh ra từ mật khẩu mã hóa và
đƣợc lƣu cùng với file mã hóa. Trƣớc khi giải mã, một giá trị kiểm tra có thể đƣợc sinh ra
từ mật khẩu giải mã và đƣợc so sánh với giá trị đƣợc lƣu cùng với file, nhằm mục đích
kiểm tra nhanh để phát hiện hầu hết (nhƣng không phải toàn bộ) các mật khẩu không

đúng. Giá trị này đƣợc lƣu mà không mã hóa.
-

Dữ liệu mã hóa

Đây là toàn bộ dữ liệu gốc sau khi mã hóa, đƣợc Winzip thực hiện sau khi nén, phƣơng
thức mã hóa đƣợc sử dụng là giải thuật AES trong chế độ đếm “CTR”.
-

Mã xác thực thông điệp (authentication code)

Giá trị 10 byte này cung cấp một kiểm tra với chất lƣợng rất cao rằng nội dung của file
mã hóa không bị thay đổi trong lúc truyền hay lƣu trữ. Giá trị này đƣợc sinh ra trong quá

18


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip
trình mã hóa, nhờ thực hiện hàm băm Hmac-sha1 lên từng khối dữ liệu, và đƣợc lƣu dƣới
dạng không bị mã hóa.

2.2. Hàm băm sinh khóa và cách kiểm tra một mật khẩu ứng cử
Nhƣ mô tả ở hình 1.1, ở bƣớc mã hóa, khi ngƣời dùng nhập mật khẩu vào để bảo vệ tệp
nén Zip, hệ thống WINZIP sẽ sử dụng một giải thuật tên là PBKDF2 để sinh khóa mã
hóa, giải thuật này đƣợc đặc tả chi tiết trong RFC 2898[16]. Ban đầu nó sẽ sinh ra một
giá trị ngẫu nhiên salt, giá trị này có độ dài tƣơng ứng là 8, 12, hoặc 16 byte tùy theo lựa
chọn của ngƣời dùng khi mã hóa là AES-128 bit/ AES-192 bit hoặc AES-256 bit. Giá trị
salt và độ dài khóa dkLen đƣợc lƣu trong dữ liệu tệp nén zip dƣới dạng dữ liệu bản rõ (dữ
liệu này không đƣợc mã hóa). Khóa mã hóa đƣợc sinh một lần bởi hàm băm một chiều,
sử dụng ngay tại thời điểm mã hóa và sau đó hủy không lƣu. Ngoài salt và dkLen, nó còn

lƣu giá trị kiểm tra mật khẩu PVV và mã xác thực (10byte) – Authentication Code.
Giá trị salt đƣợc sử dụng để trộn với mật khẩu đúng của tệp tin nén, dùng để chống tấn
công tính toán trƣớc, giúp tăng tính bảo mật.
Salt và dkLen đƣợc lƣu lại trong tệp tin zip, giúp hệ thống WINZIP sinh lại khóa từ mật
khẩu ngƣời dùng nhập vào khi cần xem nội dung của tệp tin đã đƣợc bảo vệ. Muốn sinh
lại khóa từ mật khẩu, ta chỉ cần gọi lại giải thuật PBKDF2 để điều chế khóa, với đầu vào
là salt, dkLen và mật khẩu thử.
Giá trị PVV cho phép loại bỏ những mật khẩu thử mà chắc chắn không phải là mật khẩu
đúng của tệp nén zip, bằng cách này giúp cho hệ thống winzip không phải thực hiện quá
trình giải mã, giải nén tốn kém chi phí. Tuy nhiên điều này lại là điểm yếu đối với tấn
công lên không gian mật khẩu với hệ thống tính toán mạnh chẳng hạn nhƣ tính toán trên
các bộ xử lý đồ họa GPU.
Giá trị Authentication Code giúp phát hiện chính xác mật khẩu ngƣời dùng. Với mỗi mật
khẩu thử cho giá trị PVV trùng khớp với giá trị PVV lƣu trong tệp nén zip, khóa sinh ra
dùng thực hiện quá trình giải mã, giải nén và cho ra là giá trị Authentication Code. Nếu
giá trị này trùng với Authentication Code lƣu trong tệp nén Zip thì nó là mật khẩu đúng.
Ngoài ra, giá trị AC cũng giúp phát hiện dữ liệu tệp nén zip khi trao chuyển qua đƣờng
mạng có bị thay đổi nội dung hay không. Nếu bị thay đổi, giá trị AC này không còn trùng
với giá trị AC lƣu trong tệp zip.
Nhƣ vậy, ta sử dụng PBKDF2 để xác thực một mật khẩu thử có phải là mật khẩu ứng cử
hay không. Giải thuật đƣợc mô phỏng nhƣ sau

19


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip

Hình 2.1. Giải thuật kiểm tra một mật khẩu có phải là ứng cử

Các bƣớc chi tiết thực hiện giải thuật:

Nếu dkLen > (232 – 1)*hLen, đầu ra “độ dài khóa quá lớn” và dừng chƣơng trình
Đặt l là số khối hLen ở khóa đƣợc sinh ra, r là phần dƣ của khối
l = CEIL(dkLen / hLen),
r = dkLen – (l -1)*hLen
Ở đây, kí hiệu CEIL(x) là hàm làm tròn, là số nguyên lớn nhất còn nhỏ hơn hoặc bằng x.
20


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip
Với mỗi khối nhƣ vậy, gọi thực hiện hàm băm HMAC-SHA1 một nghìn lần, cho đầu ra
là các T_k, k chạy từ 1 đến l.
Ghép T_1 đến T_l, rồi lấy hai byte ở vị trí dkLen*2 và dkLen*2 + 1 làm giá trị TestPVV,
các byte từ vị trí 0 đến dkLen -1 làm khóa mã hóa.
Giá trị TestPVV đƣợc đem so sánh với giá trị PVV lƣu trong tệp nén zip, nếu trùng khớp
chứng tỏ mật khẩu thử có khả năng là mật khẩu đúng. Tập các mật khẩu nhƣ vậy đƣợc
gọi là tập mật khẩu ứng cử.

2.3. Phương thức nén và giải nén
WINZIP tích hợp nhiều phƣơng thức nén khác nhau, tuy nhiên phƣơng thức DEFLATE
là thông dụng nhất và đƣợc lựa chọn làm phƣơng thức nén mặc định khi nén tài liệu.
Deflate (đƣợc mô tả trong tài liệu kỹ thuật [12]) là một định dạng nén không mất mát dữ
liệu và là kết hợp của giải thuật LZ77 và mã Huffman.

2.3.1. Nén (deflate)
Trƣớc hết dữ liệu đƣợc nén sử dụng giải thuật LZ77, sau đó sẽ đƣợc mã hóa sử dụng mã
Huffman. Phần tiếp theo trình bày tóm lƣợc giải thuật LZ77 và mã Huffman và cách
chúng đƣợc sử dụng trong định dạng Deflate.
2.3.1.1. Giải thuật LZ77
Nguyên lý của các phƣơng pháp từ điển về nén dữ liệu là : nén nhiều xâu có thể đạt hiệu
năng hơn so với nén từng ký hiệu đơn (ví dụ mã hóa Huffman). Trong phƣơng pháp này,

các xâu đƣợc thêm vào một từ điển và các xuất hiện sau đó sẽ đƣợc tham chiếu qua từ
điển. Do đó để biểu diễn cho các xâu trùng lặp chỉ cần dùng một con trỏ, việc làm này sẽ
giảm bộ nhớ cần lƣu trữ cho dữ liệu đầu vào.
Giải thuật LZ77 là phƣơng pháp nén dữ liệu sử dụng một từ điển đƣợc xây dựng vào lúc
chạy, nhìn dữ liệu qua một cửa sổ dịch có kích thƣớc cố định, phần dữ liệu bên ngoài cửa
sổ không đƣợc tham chiếu hoặc đã mã hóa. Càng nhiều dữ liệu đƣợc mã hóa, cửa sổ càng
dịch đi nhiều cũng có nghĩa loại bỏ dữ liệu đã mã hóa cũ nhất từ khung nhìn và thêm dữ
liệu chƣa mã hóa vào đó. Cửa sổ dịch đƣợc chia thành hai phần search buffer chứa dữ
liệu đã đƣợc xử lý, và lookahead buffer chứa dữ liệu vẫn chƣa đƣợc mã hóa (search
buffer đƣợc xem là từ điển).

21


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip

Mã giả của giải thuật:

Con trỏ tham chiếu tới xâu lặp có dạng (postion, length) và từ mã đầu ra sẽ có dạng
(postion, length, ký hiệu tiếp theo không đối sánh).
Ví dụ: nén xâu S sau đây sử dụng LZ77 :
S = 001010210210212021021200... (input string)
Ls =9 (length of look-ahead buffer)
n =18 (window size)
Một số tính toán ban đầu cho chiều dài từ mã : Lc = logα(n − Ls)+ logα(Ls)+1
Trong ví dụ này ta có: (α =3 là số ký tự của bộ ký tự {0,1,2})
Lc = log3(9)+ log3(9)+1=5
Ban đầu search buffer đƣợc nạp các số 0 và lookahead buffer đƣợc nạp với 9 ký tự đầu
tiên của S. Giải thuật tìm kiếm đối sánh dài nhất trong search buffer. Bởi vì nó đƣợc lấp
đầy với các số 0, nên mọi xâu con có độ dài 2 đều có thể sử dụng đƣợc. Tuy thế ta sử

dụng xâu con bắt đầu từ vị trí cuối cùng trong search buffer là 8 (nếu đếm từ 0), bởi vì
một đặc tính của LZ77 là đối sánh có thể đƣợc mở rộng sang cả lookahead buffer!
Hình 2-2 thể hiện một ví dụ minh họa cho giải thuật nén.

22


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip

Hình 2.2. Ví dụ nén dữ liệu sử dụng giải thuật LZ77

Đối sánh đầu tiên đƣợc mã hóa thành từ mã C1=22 02 1. 22 là vị trí bắt đầu của đối sánh
trong search buffer biểu diễn dƣới hệ cơ số 3(810 =223) , 02 là chiều dài của đối sánh và 1
là ký tự tiếp theo không sánh. Sau đó cửa sổ đƣợc dịch đi length + 1 vị trí tức là 3 vị trí,
và sẽ tiếp tục tìm xâu đối sánh, ở đây đối sánh tiếp theo đƣợc mã hóa thành C2 = 21 11 2.
Cứ nhƣ thế cho đến hết stream đầu vào.
Giải mã : Một bộ giải mã cũng bắt đầu với một search buffer đƣợc điền đầy bởi 0 và đảo
ngƣợc lại quá trình mã hóa.
Nếu một đối sánh đƣợc mở rộng sang lookahead buffer, bộ giải mã đơn giản bắt đầu giải
mã và sau đó tìm phần còn lại của đối sánh đó trong phần thực sự đã giải mã của từ mã
(ví dụ nhƣ lúc giải mã từ mã C2)

Hình 2.3. Ví dụ giải nén dữ liệu sử dụng giải thuật LZ77

23


Chương 2 – Tổng quan về nén và mã hóa trong tệp tin Zip
2.3.1.2. Mã Huffman
Các mã Huffman đƣợc dùng cho mỗi bộ ký tự trong định dạng DEFLATE có hai thêm

luật bổ sung :
- Tất cả các mã của một độ dài bit cho trƣớc có các giá trị liên tiếp theo thứ tự từ điển,
theo cùng thứ tự nhƣ các ký tự xuất hiện
- Các mã ngắn hơn đi trƣớc các mã dài hơn theo thứ tự từ điển.
Ta gọi loại mã này là mã Huffman chính tắc
Ví dụ mã Huffman cho bộ alphabet sau thỏa mãn điều đó
Symbol

Code

A

10

B

0

C

110

D

111

Tức là, 0 đi trƣớc 10 , 10 đi trƣớc 11x, và 110 và 111 là liên tiếp theo thứ tự từ điển
Cho luật nhƣ trên, ta có thể xác định mã Huffman cho một bộ ký tự chỉ cần đƣa ra các độ
dài bit của các mã cho mỗi ký tự theo thứ tự của bộ ký tự; nhƣ thế là đủ để xác định các
mã đúng. Trong ví dụ này, mã Huffman hoàn toàn xác định bằng thứ tự liên tiếp các độ

dài bit (2,1,3,3).
Giải thuật sau sinh ra các mã nhƣ là các số nguyên, nhằm để đọc từ bit có trọng số cao
nhất đến bit có trọng số thấp nhất. Các chiều dài mã đƣợc khởi tạo trong tree[I].Len; các
mã đƣợc sinh ra trong tree[I].Code.
 Tính toán số lƣợng mã cho mỗi chiều dài mã. Gọi bl_count[N] là số mã của độ dài
N, N>=1
 Tìm giá trị bằng số của mã nhỏ nhất cho mỗi chiều dài mã :
code = 0;
bl_count[0]=0;
for (bits = 1; bits <= MAX_BITS; bits ++) {

24


×