1. Giới thiệu về Mã hóa DES
Mã hóa DES (Data Encryption Standard) là một thuật toán mã hóa khối (block cipher) được phát triển vào đầu những năm 1970 bởi IBM và sau đó được Cục An ninh Quốc gia Hoa Kỳ (NSA) thông qua. Nó trở thành tiêu chuẩn mã hóa dữ liệu của Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ (NIST) vào năm 1977.
DES sử dụng khóa đối xứng có độ dài 56 bit để mã hóa dữ liệu thành các khối 64 bit. Tuy nhiên, do sự tiến bộ của công nghệ tính toán, thuật toán này dần trở nên không an toàn trước các cuộc tấn công brute-force, và AES (Advanced Encryption Standard) đã thay thế nó vào năm 2001.
2. Nguyên lý hoạt động của DES

DES là một thuật toán mã hóa khối hoạt động dựa trên 16 vòng lặp biến đổi dữ liệu theo nguyên tắc Feistel. Quá trình mã hóa và giải mã bao gồm các bước sau:
a) Phân chia dữ liệu thành các khối
Dữ liệu được chia thành các khối 64 bit. Nếu dữ liệu không đủ 64 bit, nó sẽ được bổ sung bằng phương pháp padding.
b) Hoán vị ban đầu (Initial Permutation – IP)
Dữ liệu đầu vào 64 bit được hoán vị theo một bảng IP cố định, làm thay đổi vị trí các bit trong khối dữ liệu.
c) Chia dữ liệu thành hai nửa
Sau khi hoán vị, khối dữ liệu 64 bit được chia thành hai phần:
- L (Left) – 32 bit
- R (Right) – 32 bit
d) 16 vòng lặp mã hóa
Mỗi vòng lặp DES sử dụng một khóa con (subkey) 48 bit được tạo từ khóa chính 56 bit. Các bước thực hiện trong mỗi vòng lặp:
- Mở rộng nửa phải (Expansion): Mở rộng 32 bit của phần R thành 48 bit bằng cách sử dụng một bảng mở rộng.
- Trộn với khóa (XOR với subkey): Giá trị mở rộng được XOR với một khóa con 48 bit tương ứng của vòng lặp.
- Hàm S-box: Chia kết quả thành 8 nhóm 6 bit, sau đó sử dụng bảng S-box để chuyển đổi mỗi nhóm 6 bit thành 4 bit.
- Hoán vị P: Hoán vị lại dữ liệu sau khi đi qua S-box theo bảng P.
- Kết hợp với nửa trái: XOR kết quả với phần L của khối trước đó.
- Hoán đổi vị trí: Lấy R mới làm L của vòng tiếp theo, và kết quả XOR làm R mới.
e) Hoán vị cuối cùng (Final Permutation – FP)
Sau khi hoàn thành 16 vòng lặp, hai nửa được ghép lại và thực hiện một hoán vị cuối cùng theo bảng FP để tạo ra khối dữ liệu mã hóa cuối cùng.
3. Giải mã DES
Quá trình giải mã DES thực hiện giống như quá trình mã hóa nhưng theo thứ tự ngược lại. Điều này có được nhờ vào nguyên tắc Feistel, cho phép cùng một thuật toán được sử dụng để mã hóa và giải mã chỉ bằng cách đảo ngược thứ tự các khóa con.
4. Độ an toàn của DES
Mặc dù DES từng là tiêu chuẩn mã hóa mạnh mẽ, nhưng hiện nay nó đã không còn an toàn trước các cuộc tấn công brute-force do độ dài khóa ngắn (56 bit). Một số phương pháp tấn công DES bao gồm:
- Tấn công brute-force: Thử tất cả các khóa có thể để tìm ra khóa đúng.
- Tấn công trung gian (Meet-in-the-Middle Attack): Một phương pháp hiệu quả đối với mã hóa DES ba lần (3DES).
- Tấn công tuyến tính và vi sai: Tìm ra mối quan hệ giữa dữ liệu đầu vào và đầu ra để suy luận khóa.
Vì lý do này, DES được thay thế bằng AES với độ dài khóa 128, 192 hoặc 256 bit để tăng cường bảo mật.
5. Ví dụ về mã hóa DES
Hãy thực hiện một ví dụ mã hóa và giải mã bằng DES bằng cách sử dụng một công cụ lập trình như Python.
a) Cài đặt thư viện
from Crypto.Cipher import DES
import binascii
def pad(text):
while len(text) % 8 != 0:
text += ' '
return text
# Khóa 8 byte (64 bit)
key = b'8bytekey'
def encrypt(plaintext):
des = DES.new(key, DES.MODE_ECB)
padded_text = pad(plaintext)
ciphertext = des.encrypt(padded_text.encode())
return binascii.hexlify(ciphertext)
def decrypt(ciphertext):
des = DES.new(key, DES.MODE_ECB)
decrypted_text = des.decrypt(binascii.unhexlify(ciphertext)).decode().strip()
return decrypted_text
# Văn bản cần mã hóa
plaintext = "HelloDES"
ciphertext = encrypt(plaintext)
decrypted_text = decrypt(ciphertext)
print("Văn bản gốc:", plaintext)
print("Mã hóa:", ciphertext)
print("Giải mã:", decrypted_text)
b) Giải thích
- Thêm padding: Vì DES yêu cầu dữ liệu phải là bội số của 8 byte, chúng ta thêm ký tự khoảng trắng vào cuối nếu cần.
- Mã hóa: Sử dụng chế độ ECB (Electronic Codebook) của DES để mã hóa.
- Giải mã: Chuyển đổi dữ liệu đã mã hóa trở lại văn bản gốc.
6. Bài tập thực hành
Bài tập 1: Mã hóa thủ công một khối dữ liệu với một khóa 56 bit bằng bảng hoán vị và S-box.
Bài tập 2: Viết chương trình Python thực hiện mã hóa và giải mã DES với chế độ CBC.
Bài tập 3: Thực hiện thử nghiệm brute-force trên DES với một không gian khóa nhỏ.
7. Kết luận
Mặc dù DES là một thuật toán mã hóa quan trọng trong lịch sử mật mã học, nhưng hiện nay nó đã không còn đủ mạnh để bảo vệ dữ liệu trước các cuộc tấn công hiện đại. Tuy nhiên, việc học DES vẫn rất quan trọng để hiểu cách thức hoạt động của mã hóa khối và các nguyên tắc cơ bản của mật mã học.