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ỹ t
Trang 1NGHIÊ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
Trang 2Tô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
Trang 3Tô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
Trang 4LỜ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
Trang 53.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 - KHÔI PHỤC MẬT KHẨU CHO TỆP NÉN ZIP TRÊN BỘ XỬ LÝ ĐỒ HỌA 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
Trang 67.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
Trang 7Hì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
Trang 8Bả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
Trang 9TỪ VIẾT TẮT NGHĨA TIẾNG ANH CHÚ GIẢI
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
PBKDF2 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
SP Scalar Processor Xử lý vô hướng
Trang 10SIMT Single-Instruction,
Multiple-Thread
Đơn dòng lệnh, đa tiến trình
Trang 11CHƯƠ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
Trang 12nhá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
Trang 13Trong 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
Trang 14Hiệ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
Trang 151.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
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
Trang 16Chươ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
Trang 17CHƯƠ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)
Trang 18Offset Size(bytes) Nội dung
0 2 Extra field header ID (0x9901)
2 2 Kích thước dữ liệu (hiện tại = 7)
4 2 Số hiệu phiên bản của nhà sản xuất
- 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 1 và
AE-2 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) Content
Variable Salt value
2 Password verification value
Variable Encrypted file data
10 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
Trang 19- 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 Salt size
128 bits 8 bytes
192 bits 12 bytes
256 bits 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á
Trang 20trì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
Trang 21Hì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
Trang 22Vớ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
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)
Trang 23Mã 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
Trang 24Hì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
Trang 25- 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 đó
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
Trang 26code = (code + bl_count[bits-1]) << 1;
next_code[bits] = code;
}
Gán các giá trị số tới tất cả các mã, sử dụng các giá trị liên tiếp cho tất cả các mã
có cùng độ dài với các giá trị cơ sở được xác định tại bước 2 Các mã không bao giờ được dùng không được gán giá trị
Trang 27Bước 3 sinh ra các giá trị mã như sau :
Một tập dữ liệu nén bao gồm một chuỗi các block, tương ứng với các block liên tiếp của
dữ liệu đầu vào Các kích thước block là bất kỳ, ngoại trừ các block không được nén bị giới hạn đến 65535 byte
Mỗi block được nén bằng cách sử dụng kết hợp giải thuật LZ77 và mã Huffman Các cây Huffman cho mỗi block là độc lập với các cây Huffman cho các block trước hoặc liền sau block đó; giải thuật LZ77 có thể dùng một tham chiếu tới một xâu lặp xuất hiện trong một block trước, giới hạn cho tới trước 32K byte (search buffer = 32KB)
Mỗi block bao gồm 2 phần : một cặp cây mã Huffman mô tả sự biểu diễn của phần dữ liệu nén, và một phần dữ liệu nén (Bản thân các cây mã Huffman được nén sử dụng mã hóa Huffman) Dữ liệu nén bao gồm một dãy các phần tử thuộc 2 loại : các literal byte (của các xâu mà không được phát hiện là bị lặp bên trong 32K byte đầu vào trước), và các con trỏ trỏ tới các xâu lặp, ở đây môt con trỏ được biểu diễn như là một cặp
<length,backward distance> Sự biểu diễn được dùng trong định dạng deflate giới hạn các distance tới 32K byte và các length tới 258 byte, nhưng không giới hạn kích thước của một block, ngoại trừ các block không bị nén
Mỗi kiểu giá trị (literals, distances, và lengths) trong dữ liệu nén được biểu diễn sử dụng
mã Huffman, sử dụng một cây mã cho các literal và length và một cây mã tách biệt cho các distance Các cây mã cho mỗi block xuất hiện trong một dạng nén chặt chỉ trước dữ liệu nén cho block đó
Trang 28Cặp cây mã Huffman
biểu diễn dữ liệu nén
Dữ liệu nén của block
(length,distance), literalbyte
Chi tiết về định dạng block
Mỗi block của dữ liệu nén bắt đầu với 3 bit header chứa dữ liệu sau :
first bit BFINAL
next 2 bits BTYPE
BFINAL đƣợc set nếu và chỉ nếu đây là block cuối cùng của tập dữ liệu
BTYPE chỉ ra cách dữ liệu đƣợc nén, nhƣ sau :
Các block không bị nén (BTYPE = 00)
Bất kỳ bit nào từ đầu vào tới giới hạn byte tiếp theo bị phớt lờ Phần còn lại của block bao gồm các thông tin sau
NLEN là bù một của LEN
Sau đó là LEN byte dữ liệu không nén nhƣ minh họa ở trên
Các block bị nén
Trang 29Như đã đề cập ở trên, các block dữ liệu mã hóa theo định dạng “deflate” bao gồm chuỗi các phần tử được biểu diễn từ ba bộ ký tự phân biệt : hoặc các byte literal thuộc bộ ký tự
có các giá trị byte (0 255), hoặc các cặp < length, distance>, ở đây length thuộc bộ (3 285) và distance được viết từ (1 32768) Trong thực tế, các bộ ký tự của literal và length được trộn thành một bộ ký tự (0 285), trong đó các giá trị 0 255 biểu diễn các literal byte, giá trị 256 chỉ ra end-of-block và các giá trị (257 285) biểu diễn các mã cho độ dài như sau :
Bảng 2.2 Bảng mã cho bộ ký tự length
(Các bit mở rộng ở đây được hiểu là số nguyên với bit có trọng số cao trước Ví dụ các bit 1110 biểu diễn giá trị 14)
Trang 30Bảng 2.3 Bảng mã cho bộ ký tự distance
Bảng 2.2 cho thấy cách biểu diễn cho các giá trị của distance, từ mã 5 bit cho các giá trị
từ 0-29 và đƣợc thêm các bit mở rộng để biểu diễn đủ cho các giá trị 1 32768
- Nén với mã Huffman cố định (BTYPE=01)
Các mã Huffman dùng cho hai bộ alphabet là cố định, và không đƣợc biểu diễn tách rời trong dữ liệu Các độ dài mã Huffman cho bộ alphabet literal/length là :
Bảng 2.4 Mã Huffman cố định cho bộ Literal/length
3 bit header Data_compressed End-of- block
Trang 31Các độ dài mã này là đủ để sinh ra các mã thực sự như mô tả ở mục b; các mã Huffman cho bộ alphabet literal/length được minh họa trong bảng 2.3 Các giá trị literal/length 286-287 không bao giờ xuất hiện trong dữ liệu nén, nhưng có tham gia vào trong việc xây dựng mã Huffman
Các mã distance từ 0-31 được biểu diễn bởi các mã gồm 5-bit (cố định), với các bit bổ sung có thể như biểu diễn ở bảng 2.2 Chú ý rằng các mã 30-31 không bao giờ xuất hiện trong dữ liệu nén
- Nén với mã Huffman động (BTYPE=10)
Các mã Huffman cho hai bộ alphabet xuất hiện trong block theo ngay sau các bit header
và trước dữ liệu nén thực sự, theo thứ tự, trước tiên là mã Huffman của bộ literal/length
và sau đó mã của bộ distance Mỗi bộ mã được xác định bằng một chuỗi các chiều dài
mã, như đã thảo luận ở trên (mục b) chỉ cần biết chiều dài mã là có thể xác định được mã Huffman tương ứng Thậm chí để nén tốt hơn, các chiều dài mã này cũng được nén sử dụng một bộ mã Huffman và, bộ alphabet cho các chiều dài mã là như sau :
0-15 : Biểu diễn các chiều dài mã từ 0-15
16: Copy chiều dài mã trước đó từ 3-6 lần , 2 bit liền sau sẽ quyết định số lần
(0=3, , 3=6) 17: Lặp một ”chiều dài mã” = 0 từ 3 – 10 lần
( 3 bit tiếp theo quyết định số lần)
18 : Lặp một chiều dài mã 0 từ 11 – 138 lần
( 7 bit tiếp theo quyết định số lần)
Một chiều dài mã = 0 chỉ ra rằng ký hiệu tương ứng trong bộ alphabet literal/length hoặc distance sẽ không xuất hiện trong block đang xét, và không tham gia vào giải thuật xây dựng mã Huffman đã đưa ra từ trước
Cuối cùng ta có thể xác định được định dạng cho block kiểu này:
5 Bits : HLIT, số từ mã hiện có của bộ Literal/Length - 257 ( 257 – 286)
5 Bits : HDIST, số từ mã hiện có của bộ Distance - 1 ( 1- 32)
4 Bits : HCLEN, số từ mã hiện có của bộ Code Length - 4 (4-19)
Trang 32(HCLEN + 4) x 3 bits : các chiều dài từ mã Huffman cho bộ chữ cái Code Length
đã cho ở trên, theo thứ tự sau: 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 Các chiều dài mã này được xem như là các số nguyên 3 bit (0-7); theo trên, một chiều dài
mã = 0 có nghĩa là ký hiệu tương ứng (chiều dài mã literal/length hoặc distance) không được dùng
HLIT + 257 các chiều dài mã cho bộ literal/length, được mã hóa sử dụng mã Huffman của bộ Code Length
HDIST + 1 các chiều dài mã cho bộ alphabet distance, được mã hóa theo mã Huffman của bộ Code Length
Tiếp tiếp theo là dữ liệu nén thực sự của block, được mã hóa sử dụng các mã Huffman của các bộ alphabet literal/length và distance
Ký hiệu 256 của literal/length (hết dữ liệu) , được mã hóa sử dụng mã Huffman cho literal/length
2.3.2 Giải nén (inflate)
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 nén với mã Huffman động)
Đọc biểu diễn các cây mã Huffman;
Giải mã distance từ input data;
Dịch về sau distance byte trong outputvà copy length byte từ vị trí
Trang 33đó 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
Trang 34AES 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ã
Trang 35hó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*/
/*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*/
Trang 36CHƯƠ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 đồ
Trang 37phầ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, C và D 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 M i chỉ ra một khối tin nhập vào 32-bit, và K i 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
Trang 38Hì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
Trang 39Giả 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 :
Trang 40Trướ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
Sau khi có các hàm và bảng T, thực hiện tính toán như sau :