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

Báo cáo cuối kỳ Cơ sở an toàn và bảo mật thông tin (KMA)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.46 MB, 64 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

HỌC VIỆN KỸ THUẬT MẬT MÃ

<b>KHOA CÔNG NGHỆ THÔNG TIN </b>

<b>BÁO CÁO CƠ SỞ AN TỒN VÀ BẢO MẬT THƠNG TIN ĐỀ TÀI: </b>

<b>VIẾT CHƯƠNG TRÌNH MÃ HỐ VÀ GIẢI MÃ DES </b>

<i><b>Cán bộ hướng dẫn: </b></i>

<b>TS. Nguyễn Đào Trường </b>

<i><b>Sinh viên thực hiện: </b></i>

<b>Mai Trung Kiên Cao Văn Văn Đào Ngọc Khánh </b>

<b>CT050329 CT050353 CT050327 </b>

<i><b>Nhóm 7</b></i>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN </b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>MỤC LỤC </b>

<b>DANH MỤC HÌNH ẢNH ... i </b>

<b>LỜI NĨI ĐẦU ... 1 </b>

<b>CHƯƠNG 1: TỔNG QUAN VỀ AN TOÀN VÀ BẢO MẬT THÔNG TIN ... 2 </b>

<b>1.1. Giới thiệu về an tồn và bảo mật thơng tin ... 2 </b>

<b>1.2. Tổng quan về mã hoá và giải mã ... 3 </b>

<i><b>1.2.1. Mã hoá ... 3 </b></i>

<i><b>1.2.2. Giải mã ... 3 </b></i>

<b>1.3. Tổng quan về thuật toán DES ... 3 </b>

<i><b>1.3.1. Giới thiệu về chuẩn mã dữ liệu DES (Data Encryption Standard) .. 3 </b></i>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<i><b>2.3.15. Hàm getOutputFromSBox(int choice, int row, int col) ... 42 </b></i>

<i><b>2.3.16. Hàm make32bit(int index, int num) ... 42 </b></i>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<i><b>2.4.1. Hàm doPadding(String input_text) ... 47 </b></i>

<i><b>2.4.2. Hàm doECB(String plain_text) ... 48 </b></i>

<i><b>2.4.3. Hàm des_encrypt(String plain_text, String key) ... 49 </b></i>

<i><b>2.4.4. Hàm writeDataInAFile(String text, String fileName) ... 50 </b></i>

<i><b>2.4.5. Hàm readDataFromAFile(String fileName) ... 51 </b></i>

<b>2.5. Triển khai quá trình giải mã ... 51 </b>

<i><b>2.5.1. Hàm doPadding(String input_text) ... 51 </b></i>

<i><b>2.5.2. Hàm doECB(String plain_text) ... 52 </b></i>

<i><b>2.5.3. Hàm des_decrypt(String cipher_text, String key, String filePath) ... 53 </b></i>

<i><b>2.5.4. Hàm writeDataInAFile(String text, String fileName) ... 54 </b></i>

<b>PHỤ LỤC ... 55 </b>

<b>KẾT LUẬN ... 56 </b>

<b>TÀI LIỆU THAM KHẢO ... 57 </b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>DANH MỤC HÌNH ẢNH</b>

Hình 1.1 Giải thuật mã hố DES ... 5

Hình 1.2 Sơ đồ hốn vị khởi tạo, ký hiệu IP ... 6

Hình 1.3 Tính tốn hàm mã hố f(R,K) ... 7

Hình 1.4 Bảng tra E ... 8

Hình 1.5 Các hàm S (Selection function) ... 8

Hình 1.6 Minh hoạ việc sử dụng hàm S1 ... 9

Hình 1.7 Hốn vị P trong thuật tốn tính hàm mã hố f(R,K) ... 9

Hình 1.8 Thuật tốn tính khố vịng ... 11

Hình 1.9 Bảng hốn vị lựa chọn PC-1 ... 12

Hình 1.10 Bảng quy định số bit dịch trái khi tính khố vịng ... 13

Hình 1.11 Minh hoạ phép dịch trái khi tính khố vịng ... 13

Hình 1.12 Bảng hốn vị lựa chọn PC-2 ... 14

Hình 1.13 Bảng hốn vị khởi tạo đảo IP-1 ... 14

Hình 1.14 Quá trình giải mã dữ liệu DES ... 15

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

Hình 2.43 Hàm getOutputFromSBox(int choice, int row, int col)... 42

Hình 2.44 Hàm make32bit(int index, int num) ... 43

Hình 2.45 Hàm Reverse(int[] num) ... 44

Hình 2.46 Hàm getXOR_32Bit(int side1[], int[] side2) ... 45

Hình 2.47 Hàm getXOR_32Bit(int side1[], int[] side2) ... 45

Hình 2.48 Hàm getConcatenated() ... 46

Hình 2.49 Hàm getFinalPermuted(int[] perm_in) ... 47

Hình 2.50 Hàm doPadding(String input_text) q trình mã hóa ... 48

Hình 2.51 Hàm doECB(String plain_text) quá trình mã hóa... 49

Hình 2.52 Hàm des_encrypt(String plain_text, String key) ... 50

Hình 2.53 Hàm writeDataInAFile(String text, String fileName) ... 50

Hình 2.54 Hàm readDataFromAFile(String fileName) ... 51

Hình 2.55 Hàm doPadding(String input_text) quá trình giải mã ... 52

Hình 2.56 Hàm doECB(String plain_text) giá trình giải mã ... 53

Hình 2.57 Hàm des_decrypt(String cipher_text, String key, String filePath) ... 54

Hình 2.58 Hàm writeDataInAFile(String text, String fileName) ... 54

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>LỜI NÓI ĐẦU </b>

Trong thời đại kỹ thuật số ngày nay, thông tin đã trở thành một trong những tài nguyên quý giá nhất của mọi tổ chức và cá nhân. Tuy nhiên, với sự phát triển của cơng nghệ, các mối đe dọa về an tồn và bảo mật thông tin cũng ngày càng tinh vi và phức tạp hơn. Với mục đích bảo vệ dữ liệu quan trọng khỏi các nguy cơ như truy cập trái phép, sửa đổi không được ủy quyền, hoặc lộ thông tin, việc hiểu và thực hiện các biện pháp an tồn và bảo mật thơng tin là cực kỳ cần thiết.

Tất cả nội dung của báo cáo đều được tóm tắt qua hai chương chính sau đây:

<i><b>Chương 1: Tổng quan về an toàn và bảo mật thơng tin – Cung cấp một cái </b></i>

nhìn tổng quan về lĩnh vực an tồn và bảo mật thơng tin, bao gồm ý nghĩa và tầm quan trọng của việc bảo vệ thông tin, cũng như giới thiệu về các phương pháp và công nghệ phổ biến được sử dụng để đảm bảo an tồn và bảo mật thơng tin. Chúng ta sẽ tìm hiểu về các nguyên tắc cơ bản của an tồn thơng tin, cùng với các biện pháp bảo mật thông tin cần thiết để bảo vệ dữ liệu quan trọng của tổ chức.

<i><b>Chương 2: Viết chương trình mã hố và giải mã DES – Báo cáo sẽ đi sâu </b></i>

vào việc thảo luận về mã hóa và giải mã dữ liệu, hai cơng cụ quan trọng trong việc đảm bảo tính bảo mật của thơng tin. Chương này sẽ mã hố một file dữ liệu rồi truyền sang máy bên kia, tại máy nhận sẽ tiến hành giải mã

Hy vọng rằng thông qua báo cáo này, độc giả sẽ có được cái nhìn tổng quan và sâu sắc hơn về tầm quan trọng của an tồn và bảo mật thơng tin trong thế giới kỹ thuật số ngày nay, cũng như hiểu biết về các biện pháp cụ thể có thể áp dụng để bảo vệ thơng tin của mình.

<small> </small>

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>CHƯƠNG 1: TỔNG QUAN VỀ AN TỒN VÀ BẢO MẬT THƠNG TIN </b>

<b>1.1. Giới thiệu về an tồn và bảo mật thơng tin </b>

An tồn thơng tin là q trình bảo vệ thông tin khỏi các nguy cơ như truy cập trái phép, sử dụng không đúng cách, sửa đổi trái phép, lộ thông tin hay mất mát thông tin.

Bảo mật thông tin là việc áp dụng các biện pháp bảo vệ thông tin khỏi những nguy cơ như truy cập trái phép, sử dụng không đúng cách, sửa đổi trái phép, lộ thông tin hay mất mát thông tin bằng cách sử dụng các biện pháp kỹ thuật, quản lý và tổ chức.

Ý nghĩa và tầm quan trọng của an tồn và bảo mật thơng tin trong mơi trường kỹ thuật số ngày nay:

✓ Bảo vệ dữ liệu quan trọng: An tồn và bảo mật thơng tin là cách chính để bảo vệ dữ liệu quan trọng của tổ chức, bao gồm thông tin về khách hàng, thơng tin tài chính, và dữ liệu nhạy cảm khác.

✓ Bảo vệ danh tiếng và uy tín: Sự mất mát hoặc lộ thơng tin có thể gây ra thiệt hại nghiêm trọng cho danh tiếng và uy tín của tổ chức, ảnh hưởng đến mối quan hệ với khách hàng, đối tác và cộng đồng.

✓ Tuân thủ quy định và luật pháp: Trong một số lĩnh vực như y tế, tài chính hoặc dịch vụ tài chính, tn thủ các quy định về bảo mật thơng tin là bắt buộc pháp lý. Việc không tuân thủ có thể gây ra hậu quả pháp lý nghiêm trọng cho tổ chức.

✓ Phòng ngừa rủi ro: An tồn và bảo mật thơng tin giúp tổ chức nhận biết, đánh giá và quản lý các rủi ro liên quan đến dữ liệu của họ, từ đó giảm thiểu nguy cơ phát sinh các sự cố bảo mật và mất mát thông tin.

✓ Tăng cường niềm tin từ khách hàng: Khi tổ chức có các biện pháp bảo mật thông tin hiệu quả, điều này tạo ra niềm tin và sự tự tin từ phía khách hàng, giúp tăng cường mối quan hệ và tạo điều kiện cho sự phát triển bền vững của tổ chức.

✓ Hỗ trợ trong phát triển kinh doanh: An toàn và bảo mật thơng tin có thể được xem là một lợi thế cạnh tranh, khi tổ chức có thể sử dụng nó để thu hút khách hàng mới, tăng cường tương tác với khách hàng hiện tại và mở rộng hoạt động kinh doanh quốc tế.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>1.2. Tổng quan về mã hoá và giải mã </b>

<i><b>1.2.1. Mã hố </b></i>

Mã hóa là q trình chuyển đổi thông tin từ dạng ban đầu (plaintext) thành một dạng khác gọi là mã hóa (ciphertext) thơng qua sử dụng một thuật tốn mã hóa và một khóa. Mục đích chính của mã hóa là bảo vệ thơng tin khỏi sự truy cập trái phép bằng cách làm cho dữ liệu không thể đọc được hoặc hiểu được nếu không có khóa giải mã.

Trong mã hóa đối xứng, cùng một khóa được sử dụng cho cả q trình mã hóa và giải mã, trong khi trong mã hóa khóa cơng khai, có hai khóa được sử dụng, một là khóa cơng khai để mã hóa và một là khóa bí mật để giải mã.

<i><b>1.2.2. Giải mã </b></i>

Giải mã là q trình ngược lại của mã hóa, nơi dữ liệu đã được mã hóa được chuyển đổi từ dạng mã hóa trở lại dạng ban đầu (plaintext) thơng qua sử dụng một thuật tốn giải mã và khóa tương ứng. Mục đích của giải mã là khơi phục dữ liệu gốc từ dữ liệu đã được mã hóa để có thể đọc hoặc hiểu nó.

Khóa giải mã cần phải khớp với khóa đã sử dụng trong q trình mã hóa để tái tạo lại thơng tin gốc. Trong mã hóa đối xứng, cùng một khóa được sử dụng cho cả q trình mã hóa và giải mã. Trong mã hóa khóa cơng khai, khóa cơng khai được sử dụng để mã hóa và khóa bí mật được sử dụng để giải mã.

<b>1.3. Tổng quan về thuật toán DES </b>

<i><b>1.3.1. Giới thiệu về chuẩn mã dữ liệu DES (Data Encryption Standard) </b></i>

<i>1.3.1.1. Giới thiệu chung về DES </i>

Vào ngày 13/5/1973, Ủy ban Quốc gia về Tiêu chuẩn của Mỹ đã đưa ra yêu cầu về hệ mật mã áp dụng trên toàn quốc, đánh dấu một bước quan trọng trong lịch sử của an ninh mạng và bảo mật thông tin. Điều này đã mở ra cánh cửa cho việc phát triển chuẩn mã hóa dữ liệu, với DES (Data Encryption Standard) là một trong những kết quả quan trọng nhất của quyết định này.

Ban đầu, DES được phát triển bởi IBM dựa trên hệ mã Lucifer, một hệ mã được tạo ra bởi Horst Feistel và đồng nghiệp tại IBM. Sau đó, vào năm 1975, DES đã được công bố và xác nhận là chuẩn mã hóa dữ liệu cho các ứng dụng trên tồn quốc.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Với kích thước khóa 56 – bit và một loạt các phép hoán vị và thay thế phức tạp, DES đã trở thành một phần của nền móng của an ninh mạng và bảo mật thông tin. Dù đã trải qua thời gian và bị thay thế bởi các chuẩn mã hóa mạnh mẽ hơn về sau do kích thước khóa ngắn, DES vẫn đóng vai trị quan trọng trong lịch sử của mã hóa và có ảnh hưởng sâu rộng đến các phát triển trong lĩnh vực này.

Với sự công nhận của DES là chuẩn mã hóa dữ liệu quốc gia, người ta đã thấy sự nhận thức và sự chú ý tăng lên đối với việc bảo vệ thông tin quan trọng và cá nhân. Điều này đã thúc đẩy sự phát triển của các phương pháp mã hóa và giải mã tiên tiến hơn, đặt nền tảng cho việc bảo vệ thông tin trong môi trường kỹ thuật số ngày nay.

<i>1.3.1.2. Đặc điểm của thuật toán DES </i>

Thuật toán DES (Data Encryption Standard) là một thuật tốn mã hóa khối, được thiết kế để bảo vệ dữ liệu bằng cách chuyển đổi các khối dữ liệu có kích thước 64 bit thành các khối mã hóa tương ứng, cũng có kích thước 64 bit. Dưới đây là một số đặc điểm quan trọng của DES:

✓ Kích thước khối: DES mã hóa dữ liệu theo cách khối, với mỗi khối dữ liệu có kích thước 64 bit.

✓ Kích thước khóa: Mặc dù DES sử dụng khóa có tổng cộng 64 bit, chỉ có 56 bit thực sự được sử dụng cho việc mã hóa và giải mã. 8 bit còn lại được sử dụng cho các mục đích kiểm tra.

✓ Bản mã đầu ra: Kết quả của q trình mã hóa DES là một khối dữ liệu mã hóa có kích thước 64 bit.

✓ Số vịng: DES thực hiện q trình mã hóa thơng qua 16 vịng lặp, mỗi vịng lặp sử dụng một hàm hoán vị và thay thế phức tạp.

✓ Mã hóa và giải mã: DES sử dụng cùng một khóa cho cả q trình mã hóa và giải mã. Điều này đơn giản hóa q trình triển khai và sử dụng DES. ✓ Thiết kế phần cứng: DES được thiết kế để chạy trên phần cứng, điều này

đảm bảo hiệu suất cao và tốc độ xử lý nhanh chóng trong việc mã hóa và giải mã dữ liệu.

Với các đặc điểm này, DES đã trở thành một trong những chuẩn mã hóa quan trọng và phổ biến nhất trong lịch sử của an ninh mạng và bảo mật thơng tin, mặc dù nó đã bị thay thế bởi các thuật tốn mã hóa mạnh mẽ hơn do kích thước khóa ngắn.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i>1.3.1.3. Mơ tả thuật tốn </i>

<i>1.3.1.3.1. Lưu đồ thuật toán mã hoá </i>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Thuật toán DES được sử dụng để mã hóa và giải mã các block (khối) dữ liệu 64 bit dựa trên một key (khóa mã) 64 bit. Các block được đánh số thứ tự bit từ trái sang phải và bắt đầu từ 1, bit đầu tiên bên trái là bit số 1 và bit cuối cùng bên phải là bit số 64. Q trình giải mã và mã hóa sử dụng cùng một key nhưng thứ tự phân phối các giá trị các bit key của quá trình giải mã ngược với q trình mã hóa.

Một block dữ liệu sẽ được hoán vị khởi tạo (Initial Permutation) IP trước khi thực hiện tính tốn mã hóa với key. Cuối cùng, kết quả tính tốn với key sẽ được hốn vị lần nữa để tạo ra, đây là hoán vị đảo của hoán vị khởi tạo gọi là (Inverse Initial Permutation) IP-1. Việc tính tốn dựa trên key được định nghĩa đơn giản trong một hàm f, gọi là hàm mã hóa, và một hàm KS, gọi là hàm phân phối key (key schedule). Hàm KS là hàm tạo ra các khóa vịng (round key) cho các lần lặp mã hóa. Có tất cả 16 khóa vịng từ K1 đến K16

<i>1.3.1.3.2. Hốn vị khởi tạo -IP </i>

Hốn vị là thay đổi ví trí các bit trong một chuỗi giá trị nhưng không làm thay đổi giá trị của các bit này. Đây là bước đầu tiên trong quy trình mã hóa dữ liệu. 64 bit dữ liệu đầu vào, gọi là plaintext, sẽ được hốn vị theo bảng mơ tả sau đây.

Hình 1.2 Sơ đồ hoán vị khởi tạo, ký hiệu IP

Chuỗi bit đầu vào được đánh số từ 1 đến 64 (tính từ trái qua phải). Sau đó, các bit này được thay đổi vị trí như sơ đồ IP, bit số 58 được đặt vào vị trí đầu tiên, bit số 50 được đặt vào vị trí thứ 2. Cứ như vậy, bit thứ 7 được đặt vào vị trí cuối cùng.

Sau hoán vị, chuỗi bit mới được phân ra làm hai đoạn, mỗi đoạn 32 bit để bắt đầu vào quy trình tính tốn mã hóa với key. Đoạn bên trái ký hiệu là L, đoạn bên phải ký hiệu là R. Đoạn L gồm các bit từ bit số 1 đến bit số 32, đoạn R gồm các bit từ bit số 33 đến bit số 64. Đoạn L của lần tính tốn sau sẽ chính là đoạn R của lần tính tốn

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

trước. Đoạn R của lần tính tốn sau sẽ được tính từ đoạn R trước đó qua hàm mã hóa f(R, K) rồi XOR với đoạn L của lần tính trước đó.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

bit. Bit đầu tiên trong chuỗi giá trị 48 bit là bit số 32 của R, bit thứ 2 là bit số 1 của R, bit thứ 3 là bit số 2 của R và bit cuối cùng là bit số 1 của R.

Hình 1.4 Bảng tra E

Sau khi tra bảng E, giá trị 48 bit được XOR với 48 bit của khóa vịng (cách tạo ra khóa vịng 48 bit sẽ được trình bày sau). Kết quả phép XOR được chia làm 8 block được đánh số từ 1 đến 8 theo thứ tự từ trái qua phải, mỗi block 6 bit. Mỗi block sẽ được biến đổi thông qua các hàm lựa chọn riêng biệt. Tương ứng với 8 block sẽ có 8 hàm chuyển đổi (selection function) riêng biệt là S1, S2, S3, S4, S5, S6, S7 và S8.

Hình 1.5 Các hàm S (Selection function)

Việc chuyển đổi giá trị của các hàm S1, S2,… S8 được thực hiện bằng cách tách block 6 bit thành hai phần. Phần thứ nhất là tổ hợp của bit đầu tiên và bit cuối cùng của block để tạo thành 2 bit chọn hàng của bảng S, bảng S có 4 hàng được đánh số từ 0 đến 3 theo thứ tự từ trên xuống. Phần thứ 2 là 4 bit còn lại dùng để chọn cột của bảng S, bảng S có 16 cột được đánh số từ 0 đến 15 theo thứ tự từ trái qua phải.

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Như vậy, với mỗi block 8 bit ta chọn được 1 giá trị trong bảng S. Giá trị này nằm trong khoảng từ 0 đến 15 sẽ được quy đổi thành chuỗi nhị phân 4 bit tương ứng. Các chuỗi nhị phân có được sau khi chuyển đổi từ S1 đến S8 sẽ được ghép lại theo thứ tự từ trái qua phải để tạo thành một giá trị 32 bit.

Ví dụ về việc thực hiện chuyển đổi hàm S, giả sử, giá trị block 6 bit đầu tiên là 011011. Ta tách chuỗi này ra làm hai tổ hợp giá trị là 01 (bit đầu tiên và bit cuối cùng) và 1101 (4 bit ở giữa). Hai tổ hợp này được dùng để chọn hàng và cột tương ứng như hình minh họa sau:

Hình 1.6 Minh hoạ việc sử dụng hàm S1

Tổ hợp 01 sẽ chọn hàng 1, tổ hợp 1101 sẽ chọn cột 13 và kết quả trả về là 5 có giá trị nhị phân 4 bit là 0101.

Qua bước chuyển đổi với các hàm lựa chọn S, kết quả thu được là một giá trị 32 bit. Giá trị này được đưa qua một hàm hoán vị P để tạo ra giá trị hàm f.

Hình 1.7 Hốn vị P trong thuật tốn tính hàm mã hố f(R,K)

Giá trị 32 bit thu được từ các chuyển đổi với hàm lựa chọn S sẽ được đánh số từ 1 đến 32 theo thứ tự từ trái qua phải.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Theo bảng hoán vị P, bit đầu tiên sau hoán vị sẽ là bit số 16, bit thứ 2 sẽ là bit số 7 và bit cuối cùng sẽ là bit số 25. Hàm tính tốn mã hóa f(R, K) được định nghĩa như sau:

𝑓(𝑅, 𝐾) = 𝑃(𝑆

<sub>1</sub>

(𝐵

<sub>1</sub>

)𝑆

<sub>2</sub>

(𝐵

<sub>2</sub>

) … 𝑆

<sub>8</sub>

(𝐵

<sub>8</sub>

)) 𝐵

<sub>1</sub>

𝐵

<sub>2</sub>

… 𝐵

<sub>8</sub>

= 𝐾⨁𝐸(𝑅)

Trong đó:

✓ 𝑃(): là phép hoán vị P

✓ 𝑆<sub>𝑛</sub>: là phép chuyển đổi block n (n chạy từ 1 đến 8) với hàm lựa chọn S ✓ 𝐵<sub>𝑛</sub>: là block 6 bit thứ n (n chạy từ 1 đến 8). Block này lấy từ phép tốn

XOR giữa khóa vịng K và giá trị hàm E(R)

✓ 𝐸(𝑅): là hàm chuyển đổi giá trị R 32 bit thành giá trị 48 bit

<i>1.3.1.3.4. Tính khố vịng – KS </i>

Một key có 64 bit nhưng chỉ có 56 bit được sử dụng để thực hiện tính tốn giá trị khóa vịng. Key được chia làm 8 byte. Các bit ở vị trí 8, 16, 32, 40, 48, 56 và 64 là các bit parity được sử dụng để kiểm tra độ chính xác của key theo từng byte vì khi key được phân phối trên đường truyền đến bộ mã hóa giải mã thì có thể xảy ra lỗi. Parity được sử dụng là parity lẻ (odd parity).

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Hình 1.8 Thuật tốn tính khố vịng

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

Key gốc sẽ được thực hiện hoán vị lựa chọn PC-1. Key được đánh số từ 1 đến 64 theo thứ tự từ trái qua phải.

Hình 1.9 Bảng hốn vị lựa chọn PC-1

Bảng hốn vị lựa chọn PC-1 có hai phần. Phần đầu dùng để xác định giá trị C0 và phần sau dùng để xác định giá trị D0. Theo bảng trên thì C0 là chuỗi bit có thứ tự là 57, 49, 41, ..., 36 lấy từ key gốc, D0 là chuỗi bit có thứ tự là 63, 55, 47, ..., 4 lấy từ key gốc.

Sau khi xác định được giá trị ban đầu để tính key là C0 và D0 thì các khóa vịng Kn (với n từ 1 đến 16) sẽ được tính theo nguyên tắc giá trị của khóa vịng thứ n sẽ được tính từ giá trị khóa vịng thứ n-1.

𝐾

<sub>𝑛</sub>

= 𝑃𝐶

<sub>−2</sub>

(𝐶

<sub>𝑛</sub>

𝐷

<sub>𝑛</sub>

)

Trong đó Cn và Dn được tạo từ Cn-1 và Dn-1 bằng cách dịch trái các giá trị này với số bit được quy định trong bảng sau đây:

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Hình 1.10 Bảng quy định số bit dịch trái khi tính khố vịng

Ví dụ, theo bảng trên, C3 và D3 có được từ C2 và D2 bằng cách dịch trái 2 bit. Hay C16 và D16 có được từ C15 và D15 bằng cách dịch trái 1 bit. Dịch trái ở đây được hiểu là quay trái như minh họa sau đây:

Hình 1.11 Minh hoạ phép dịch trái khi tính khố vịng

Sau khi tính được Cn và Dn thì chuỗi CnDn sẽ được đánh số từ 1 đến 56 theo thứ tự từ trái sang phải và được hoán vị lựa chọn lần 2 theo bảng hoán vị PC-2.

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Hình 1.12 Bảng hốn vị lựa chọn PC-2

Như vậy bit đầu tiên của khóa vịng Kn là bit số 14 của chuỗi CnDn, bit thứ 2 là bit số 17 của chuỗi CnDn và bit cuối cùng là bit số 32 của chuỗi CnDn.

<i>1.3.1.3.5. Hoán vị khởi tạo đảo IP-1 </i>

Đây là bước cuối cùng để tạo ra giá trị mã hóa. Giá trị của lần lặp mã hóa cuối cùng sẽ được hốn vị khởi tạo đảo IP-1 và tạo ra giá trị mã hóa plaintext.

Hình 1.13 Bảng hoán vị khởi tạo đảo IP-1

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Hình 1.14 Quá trình giải mã dữ liệu DES

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b>CHƯƠNG 2: VIẾT CHƯƠNG TRÌNH MÃ HOÁ VÀ GIẢI MÃ DES BẰNG JAVA </b>

<b>2.1. Các dữ liệu chung </b>

Dưới đây là tất cả các bảng dữ liệu tĩnh và hằng số được sử dụng trong thuật tốn DES. Kèm theo đó là các hàm này được sử dụng để truy xuất các bảng này theo định dạng bắt buộc để sử dụng trong các q trình mã hóa và giải mã.

<i><b>2.1.1. Bảng InitialPermutation </b></i>

Mảng 2D này biểu diễn bảng hoán vị ban đầu được sử dụng trong thuật toán DES. Bảng này được sử dụng để hoán vị các bit của khối văn bản gốc trước khi bắt đầu các vòng lặp của thuật tốn.

Hình 2.1 Bảng InitialPermutation

<i><b>2.1.2. Bảng FinalPermutation </b></i>

Mảng 2D này biểu diễn bảng hoán vị cuối cùng được sử dụng trong thuật toán DES. Bảng này được sử dụng để hoán vị các bit của khối văn bản sau khi hồn thành tất cả các vịng lặp của thuật tốn.

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

Hình 2.2 Bảng FinalPermutation

<i><b>2.1.3. Bảng PC_1 </b></i>

Mảng 2D này biểu diễn bảng loại bỏ bit chẵn được sử dụng trong q trình tạo khóa. Bảng này được sử dụng để giảm kích thước khóa từ 64 bit xuống 56 bit.

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

Hình 2.5 Bảng PC_2

<i><b>2.1.6. Bảng ExpansionTable </b></i>

Mảng 2D này biểu diễn bảng mở rộng được sử dụng trong hàm DES. Bảng này được sử dụng để mở rộng khối dữ liệu 32 bit thành 48 bit.

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

Hình 2.6 Bảng ExpansionTable

<i><b>2.1.7. Bảng S01 đến S08 </b></i>

Các mảng 2D này biểu diễn 8 hộp thay thế (S-boxes) được sử dụng trong hàm DES. Các S-boxes này được sử dụng để thực hiện thao tác thay thế trong hàm DES, cung cấp tính phi tuyến tính cho thuật tốn.

Hình 2.7 Bảng S01

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

Hình 2.8 Bảng S02

Hình 2.9 Bảng S03

Hình 2.10 Bảng S04

Hình 2.11 Bảng S05

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

Hình 2.15 Bảng Permutation

<b>2.2. Chương trình tạo khóa vòng </b>

Dưới đây là các biến và các hàm được sử dụng để tạo khóa vịng với mục đích phục vụ việc mã hóa và giải mã dùng cho mỗi vịng dựa trên khóa được cung cấp ban đầu.

<i><b>2.2.1. Các biến chung </b></i>

<i><b>- leftKey: Một mảng chứa nửa trái của khóa 56 bit. Nó được sử dụng trong q </b></i>

trình tạo khóa vịng.

<i><b>- rightKey: Một mảng chứa nửa phải của khóa 56 bit. Nó cũng được sử dụng </b></i>

trong q trình tạo khóa vịng.

<i><b>- allRoundKey: Một mảng 2D chứa tất cả các khóa vịng được tạo ra trong q </b></i>

trình tạo khóa. Mỗi khóa vịng là một mảng 48 bit và được sử dụng trong một vịng cụ thể của q trình mã hóa hoặc giải mã.

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

Hình 2.16 Các biến chung chương trình tạo khóa vịng

<i><b>2.2.2. Hàm KeyGenerator (String keyWord) </b></i>

Hàm tạo này nhận một chuỗi khóa làm đầu vào và khởi tạo q trình tạo khóa. Nó chuyển đổi chuỗi khóa thành một khối nhị phân và sau đó thực hiện hốn vị cần thiết để tạo ra khóa 56 bit từ khóa ban đầu 64 bit.

Hình 2.17 Hàm KeyGenerator (String keyWord)

<i><b>2.2.3. Hàm getRoundKeyForEncryption (int roundNumber) </b></i>

Hàm này tạo ra khóa vịng cho một vịng cụ thể trong q trình mã hóa. Nó thực hiện các phép dịch trái cần thiết trên khóa 56 bit và sau đó thực hiện hốn vị để tạo ra khóa vịng 48 bit.

Hình 2.18 Hàm getRoundKeyForEncryption (int roundNumber)

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<i><b>2.2.4. Hàm getRoundKeyForDecryption (int roundNumber) </b></i>

Hàm này tạo ra khóa vịng cho một vịng cụ thể trong q trình giải mã. Nó cũng thực hiện các phép dịch trái và hoán vị, nhưng theo thứ tự ngược lại so với quá trình mã hóa.

Hình 2.19 Hàm getRoundKeyForDecryption (int roundNumber)

<i><b>2.2.5. Hàm getRoundKey (int round) </b></i>

Hàm này tạo ra khóa vịng cho một vịng cụ thể. Nó được sử dụng bởi cả hai hàm getRoundKeyForEncryption (int roundNumber) và getRoundKeyForDecryption (int roundNumber).

Hình 2.20 Hàm getRoundKey (int round)

<i><b>2.2.6. Hàm getEncryptedKeyword (String keyWord) </b></i>

Hàm này chuyển đổi chuỗi khóa thành một khối nhị phân. Nó được sử dụng trong hàm tạo KeyGenerator(String keyWord) để chuyển đổi chuỗi khóa đầu vào thành dạng nhị phân.

</div>

×