1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

95 36 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 95
Dung lượng 2,37 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

Trang 2

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

Trang 3

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

Trang 4

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

Trang 5

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

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

Trang 7

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

Trang 8

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

Trang 9

TỪ 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 10

SIMT Single-Instruction,

Multiple-Thread

Đơn dòng lệnh, đa tiến trình

Trang 11

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

Trang 12

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

Trang 13

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

Trang 14

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

Trang 15

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

Đố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 16

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

Trang 17

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)

Trang 18

Offset 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 20

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

Trang 21

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

Trang 22

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

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 23

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

Trang 24

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

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 26

code = (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 27

Bướ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 28

Cặ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 29

Như đã đề 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 30

Bả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 31

Cá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 34

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ã

Trang 35

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*/

/*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 36

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 đồ

Trang 37

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, 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 38

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

Trang 39

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 :

Trang 40

Trước tiên ta định nghĩa các hàm sau, đều nhận đầu vào là 3 từ 32-bit và sinh ra một từ 32-bit

F(X,Y,Z) = XY v not(X) Z

G(X,Y,Z) = XZ v Y not(Z)

H(X,Y,Z) = X xor Y xor Z

I(X,Y,Z) = Y xor (X v not(Z))

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

Sau khi có các hàm và bảng T, thực hiện tính toán như sau :

Ngày đăng: 28/02/2021, 00:07

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[2] N. T. Courtois and J. Pieprzyk. Cryptanalysis of block ciphers with overdefined systems of equations, 2002. Preprint is available at http://eprint.iacr.org/2002/044/ Link
[7] NVIDIA. http://www.nvidia.com/object/cuda_home_new.html [8] PKWARE. Zip file format specification, 2007 Link
[11] Tài liệu kĩ thuật, Trung tâm tính toán hiệu năng cao - Trường Đại Học Bách Khoa Hà Nội http://hpcc.hut.edu.vn Link
[13] AES project http://www.gladman.me.uk/cryptography_technology/fileencrypt/ Link
[15] Aes encrytion info http://www.winzip.com/aes_info.htm Link
[16] RFC 2898 - Password-Based Cryptography Specification Version 2.0 [17] CUDA Reference Manual phiên bản 3. Có sẵn tại địa chỉ:http://developer.download.nvidia.com/compute/cuda/3_0/toolkit/docs/CudaReferenceManual.pdf Link
[1] F. I. P. S. P. 197. Advanced encryption standard (aes), 2001 Khác
[3] E. F. Foundation. Cracking DES: Secrets of Encryption Research, Wiretap Politics and Chip Design. O‟Reilly &amp; Associates, Inc, 1998 Khác
[4] D. Kahn. The Codebreakers - The Story of Secret Writing. 1967 Khác
[5] A. Klein. Attacks on the rc4 stream cipher. Des. Codes Cryptography, 48(3):269–286, 2008 Khác
[6] A. Narayanan and V. Shmatikov. Fast dictionary attacks on passwords using time space tradeoff. In CCS05: Proceedings of the 12th ACM conference on Computer and communications security, pages 364–372, New York, NY, USA, 2005. ACM Khác
[10] R. L Rivest, The MD5 Message Digest Algorithm, Request for Comments (RFC)1321, Internet Activities Board, Internet PrivacZ Task Force, April 1992.3RIPEMD-1281 Khác
[12] RFC1951 - DEFLATE Compressed Data Format Specification Khác

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w