Sau 1 tuần vất vả với việc đi công tác, mỹ công tử đẹp trai đã trở lại tiếp tục seri Mật mã - bí ẩn đầy quyến rũ.

           Các bạn có thể đọc phần 1, mật mã học cổ điển tại đây.


           Qua phần trước, chúng ta đã biết sơ qua về các khái niệm căn bản trong mật mã cũng như phương pháp mã hóa/giải mã của 2 hệ mật mã cổ điển cơ sở, đại diện cho mã hóa thay thế (Hệ Caesar) và mã hóa hoán vị (Hệ mã hoán vị). 

           Việc kết hợp nhiều hệ mã cũng đã được các nhà khoa học áp dụng để cho ra đời các loại mật mã an toàn hơn, phức tạp hơn. VD như việc dùng mã Caesar với nhiều khóa hoặc hoán vị theo ma trận khóa v.v...


           Dễ thấy, ở mã hóa cổ điển, đơn vị sử dụng để mã hóa là ký tự, dù mã hóa thay thế hay hoán vị cũng là việc thay thế (hoán vị) các ký tự cho nhau. Nhưng với các hệ mã hiện đại từ đây về sau, đơn vị mã hóa sẽ là bit (hoặc đổi sang dạng số) chứ không đơn giản là thực hiện với ký tự nữa.


           Nào, chúng ta giờ sẽ bắt đầu với DES - Data Encryption Standard. DES là hệ mã hóa đầu tiên đạt chuẩn mã hóa dữ liệu theo tiêu chuẩn của ủy ban quốc gia về tiêu chuẩn của Mỹ năm 1973 (và sau 43 năm, hệ DES thuần túy không còn đáp ứng được các yêu cầu bảo mật do sự phát triển của máy tính điện tử - trung bình 5 năm, tốc độ xử lý/phá mã của máy tính điện tử tăng lên gấp đôi).


Đọc thêm:


           Như đã nói ở trên, việc mã hóa của hệ DES không đơn giản là mã hóa ký tự mà trở thành mã hóa chuỗi bit. Một văn bản được viết dưới dạng bit, sau đó được chia ra làm các khối dài 64 bit. DES sẽ thực hiện mã hóa từng khối 64 bit một (giống với mã hoán vị, hoán vị từng khối n ký tự - Đây được gọi là mã hóa theo khối).

Mô tả thuật toán DES:

Nhìn hình vẽ, thuật toán DES được thực hiện như sau:

+ Chuỗi đầu vào 64 bit sẽ được đi qua một bảng hoán vị trở thành chuỗi P1. (Việc hoán vị này giống với mã hoán vị cổ điển)

+ Sau khi hoán vị xong, ta chia chuỗi P1 thành 2 phần là L và R. với L là 32 bit đầu của chuỗi P1, R là 32 bit sau của chuỗi P1.

+ Việc mã hóa tiếp tục được thực hiện bằng cách: dùng chuỗi 32 bit R, kết hợp với khóa K1 thông qua hàm f (mình sẽ mô tả quá trình tạo K1 và hàm f sau) ra chuỗi R'.

+ Dùng phép xor chuỗi 32 bit L với chuỗi 32 bit R' sinh ra chuỗi L'. (Phép xor là phép - not or: 0 xor 0 = 0, 0 xor 1 = 1, 1 xor 0 = 1, 1 xor 1 = 0).

+ Gán chuỗi L1 = R', R1 = L'. Tiếp tục lặp lại quá trình bên trên với khóa K2. 

+ Thực hiện việc lặp như vậy 16 lần, ta sẽ có R16, L16. Ghép chuỗi R16 và L16 thành P2.

+ Đưa P2 qua một hoán vị cuối (nghịch đảo của hoán vị đầu) ta sẽ được chuỗi đầu ra 64 bit.

+ Việc giải mã sẽ làm ngược lại toàn bộ quá trình trên.


           Xong, các bạn đọc lại 1-2 lần nữa đi. Hồi học cái này, sách in sai cái hoán vị đầu làm tôi mất 1 tuần ngồi mã hóa mà không ra kết quả trong sách =))).


           Kết thúc cái tổng quan, tiếp theo chúng ta sẽ đi vào cụ thể phép f và cách tạo dãy khóa k.

+ Tạo khóa:

Khóa K ban đầu là một chuỗi 64 bit, tuy nhiên, ta sẽ loại bỏ 8 bit gồm: bit 8, 16, 24, 32, 40, 48, 56, 64 để kiểm tra => sinh ra khóa K' 56 bit.

Tại mỗi bước vòng lặp trên, khóa K' 56 bit sẽ được sử dụng để sinh ra khóa con K_i 48 bit. Việc tạo khóa con thực hiện như sau:

  • Chia khóa K' thành 2 phần 28 bit, mỗi phần dịch chuyển n bit theo quy ước (việc dịch chuyển lại giống mã Caesar).
  • Đẩy 2 phần đã dịch chuyển vào hoán vị nén C - cố định để tạo ra khóa 48 bit đưa vào sử dụng cho vòng mã hóa.
  • Giữ nguyên 2 phần K' sau khi dịch chuyển, tiếp tục dịch chuyển và đưa qua hoán vị nén để sinh ra khóa K_2.
  • Việc tạo khóa lặp lại tương tự cho đến K_16.

+ Với khóa K_i 48 bit, ta sẽ đem xor với thành phần R_i mở rộng. Với mỗi R_i 32 bit, sẽ được đưa qua một hoán vị mở rộng, sẽ nhân đôi 16 bit của R_i tại một số vị trí nhất định để trở thành chuỗi 48 bit R_i'. Tiếp đó, ta sẽ xor K_i và R_i' => sinh ra R_ki dài 48 bit. Chia R_ki thành 8 phần, mỗi phần 6 bit. Đưa từng phần của R_ki qua 1 hoán vị nén (gọi là S-box, có 8 S-box ở đây mình ký hiệu là S_1, S_2...). Từng phần 6 bit R_ki sau khi đi qua hoán vị nén S-box sẽ cho ta các phần 4 bit. Ghép 8 phần lại với nhau, ta sẽ được R' 32 bit. Toàn bộ quá trình mình vừa mô tả chính là hàm f trong 16 vòng lặp bên trên.


Kết luận: 

+ Hàm dịch chuyển theo quy ước, hoán vị nén C để tạo khóa và hoán vị mở rộng R_i từ 32 bit thành 48 bit là cố định cho tất cả hệ mã DES do đó, các hoán vị này không gọi là khóa.

+ Thành phần khóa của hệ mã DES bao gồm: Khóa K - 64 bit (do hàm dịch và hoán vị nén C là cố định, nên từ K ta có thể dễ dàng tìm ra dãy khóa con K_i), hoán vị khởi đầu của P1 và các S-box.

+ Như mình đã trình bày ở trên, sau 43 năm, hệ mã DES đã không còn thực sự an toàn (hiện nay có công cụ có thể phá mã DES trong vòng 24 giờ) do đó cần các cải tiến nhất định cho nó. Điển hình nhất là 3-DES, mã này đơn giản là ở mỗi vòng lặp ta sử dụng 3 khóa khác nhau và xor qua hàm f 3 lần. Độ dài khóa lúc này tăng lên 3 lần là 168 bit khóa => An toàn hơn.


           Phần 3 của seri, mình sẽ trình bày hệ mật mã khóa công khai. Nhưng trước đó, mình sẽ phân tích vì sao lại cần đến hệ mật mã khóa công khai? Đồng thời chuẩn bị một số khái niệm toán học, tin học cơ bản để có thể hiểu được phần 3 của bài viết.