DES, 3DES, RC4 và Blowfish giải thích từ đầu
Một câu: bốn mật mã này là ngựa thồ của thập niên 1990 — DES và cách khắc phục ba lần 3DES, mật mã dòng RC4, và Blowfish — và tất cả hiện đã rút hoặc không khuyến nghị, chỉ còn sống nhờ tệp cũ, phần cứng cũ và giao thức cũ vẫn phải đọc được.
DES: tiêu chuẩn năm 1977 khởi đầu tất cả
Đây là gì. Chuẩn Mã hóa Dữ liệu (FIPS 46, 1977) là mật mã Feistel 16 vòng trên khối 64 bit với khóa 56 bit (lưu trong 8 byte vì một bit mỗi byte là bit kiểm tra chẵn lẻ). Được IBM thiết kế với góp ý của NSA, trở thành chuẩn Hoa Kỳ trong hai thập kỷ, và bị phá trên thực tế năm 1998 khi máy Deep Crack của EFF vét cạn một khóa trong 56 giờ với chi phí phần cứng 250.000 USD. NIST rút nó khỏi mã hóa năm 2005.
Vì sao bit chẵn lẻ làm rối độ dài khóa. Cứ mỗi bit thứ 8 của khóa DES được tính từ bảy bit kia, nên khóa 8 byte chỉ có 56 bit độc lập — đó là lý do bạn sẽ thấy cả "khóa 64 bit" và "khóa 56 bit" cho cùng một mật mã. 3DES kế thừa điều này: 24 byte thô = 168 bit thô = 112 bit hiệu dụng (tấn công gặp giữa loại bỏ phần còn lại).
Bạn vẫn gặp nó ở đâu. Khối PIN ngân hàng (ISO 9564), một số miền Kerberos v4, kho sao lưu cũ và thẻ thông minh. Nếu một hệ thống hôm nay đòi DES, hoặc nó đang tương tác với phần cứng thập niên 1990, hoặc nó đơn giản là không an toàn.
3DES: mã hóa, giải mã, mã hóa
Mẹo. Triple-DES chạy DES ba lần trên mỗi khối: EDE3 dùng ba khóa khác nhau (C = Ek3(Dk2(Ek1(P)))); bước giải mã ở giữa tồn tại để một triển khai 3DES có thể mô phỏng DES đơn bằng cách đặt k1=k2. EDE2 chỉ dùng hai khóa (k1=k3), cho 112 bit hiệu dụng. Cấu trúc này là một cách sửa nhanh để tăng gấp ba độ an toàn của một mật mã đã bị tấn công mà không phát minh mật mã mới.
Vì sao vẫn chết. Hai vấn đề: nó chậm (ba lượt DES đầy đủ mỗi khối, khoảng 1/20 tốc độ AES) và nó giữ khối 64 bit. Với 32 GiB dữ liệu dưới một khóa (giới hạn sinh nhật 232 khối), va chạm khối đủ khả năng để làm lộ cấu trúc bản rõ — tấn công Sweet32 (2016) đã chứng minh điều này với phiên TLS 3DES. NIST cấm mã hóa 3DES sau 2023 (SP 800-131A r2); PCI DSS yêu cầu loại bỏ nó trong hệ thống thanh toán.
RC4 / ARCFOUR: mật mã dòng của web thời kỳ đầu
Cách hoạt động. RC4 (Ron's Code 4, thiết kế 1987, lộ năm 1994) là mật mã dòng: khóa lập lịch một hoán vị 256 byte (KSA), rồi hoán vị đó phát ra dòng byte giả ngẫu nhiên (PRGA) được XOR với thông điệp. Không đệm, không kích thước khối, độ dài thông điệp bất kỳ, nhanh tầm thường trong phần mềm — đó là lý do nó thống trị SSL/TLS và WEP thập niên 1990. "ARCFOUR" là tên không có nhãn hiệu mà hầu hết dự án mã nguồn mở dùng.
Vì sao bị phá. Fluhrer-Mantin-Shamir (2001) chỉ ra các byte đầu của dòng khóa bị lệch — chết người trong WEP, nơi cách dựng khóa theo gói đưa những byte đó cho kẻ tấn công. Các tấn công lệch về sau (2013, AlFardan và cộng sự) đã khôi phục bản rõ từ phiên TLS được RC4 bảo vệ với hàng triệu kết nối. RFC 7465 (2015) cấm RC4 trong TLS hoàn toàn.
Vector cổ điển. Khóa "Key" (3 byte), thông điệp "Plaintext" cho bản mã bbf316e8d940af0ad3 — thử Mẫu RC4 và so sánh. Tự kiểm tra của trang cũng kiểm tra dòng khóa RFC 6229 cho khóa 40 bit 01 02 03 04 05: b2396305f03dc027ccc3524a0a1118a8.
Blowfish: chưa bị phá, nhưng bị giới hạn bởi khối nhỏ
Đây là gì. Mật mã Feistel của Bruce Schneier năm 1993: khối 64 bit, khóa 32 đến 448 bit (4..56 byte), 16 vòng, và một lịch trình khóa nổi tiếng chạy chính Blowfish 521 lần để dựng các khóa con — khiến việc thiết lập khóa chậm nhưng các lần thử vét cạn cũng tốn kém. Chưa có phân tích mật mã thực tế nào phá được Blowfish đủ vòng.
Vì sao vẫn có trên trang này. Vấn đề là khối 64 bit, không phải thuật toán: vượt khoảng 32 GiB dưới một khóa, va chạm sinh nhật làm lộ dữ liệu (cùng giới hạn với 3DES, kiểu tấn công Sweet32). Chính Schneier khuyến nghị người kế thừa là Twofish (một ứng viên chung kết AES) hoặc AES cho mọi thứ mới. Blowfish vẫn sống trong bcrypt — lịch trình khóa của hàm băm mật khẩu chính là Blowfish — điều này ổn, vì băm dùng đầu vào rất nhỏ, không phải hàng gigabyte.
Các vector cổ điển. Khóa toàn số 0 và bản rõ toàn số 0 mã hóa thành 4ef997456198dd78 (khối đầu của đầu ra Mẫu); khóa "abcdefghijklmnopqrstuvwxyz" trên "BLOWFISH" cho 324ed0fef413a203. Cả hai đều lấy từ tệp vector công bố của Schneier và được bộ tự kiểm tra xác nhận.
Những lỗi thường gặp
- Dùng các mật mã này cho dữ liệu mới. Mọi mật mã trên trang này đều không khuyến nghị ngoại trừ Blowfish (bị giới hạn kích thước khối). Lựa chọn hiện đại đúng là AES-GCM — xem AES mã hóa / giải mã.
- Khóa DES từ mật khẩu. Một mật khẩu 8 ký tự không phải 56 bit ngẫu nhiên; nó chỉ có vài bit entropy mỗi ký tự. Hệ thống cũ đã làm đúng như vậy và đó là lý do phổ biến nhất khiến các kho lưu trữ "mã hóa DES" bị tấn công từ điển trong vài phút.
- Tái sử dụng IV trong CBC. Khi đó khối đầu làm lộ tính bằng nhau của bản rõ giữa các thông điệp dưới cùng khóa. Nút IV ngẫu nhiên tồn tại vì lý do đó.
- Tái sử dụng dòng khóa RC4. RC4 XOR cùng một dòng khóa với cùng khóa: mã hóa hai thông điệp với một khóa là một one-time pad hai lần — XOR hai bản mã và cả hai bản rõ lộ ra. Lỗi chết người của WEP chính là cấu trúc tái sử dụng dòng khóa.
- Giả định "giải mã được nghĩa là đúng". ECB/CBC ở đây chỉ kiểm tra đệm khi giải mã — khóa sai thường cho ra rác mà vẫn có thể bỏ đệm được. Không chế độ cũ nào có kiểm tra toàn vẹn; nếu bạn cần, bạn cần AES-GCM, không phải những thứ này.
- Coi 3DES là "168 bit". Khóa thô là 168 bit nhưng độ mạnh hiệu dụng là 112 — tấn công gặp giữa biến mã hóa ba lần thành hai lần cộng một chút, đúng như với các cấu trúc tiền thân của 3DES.
Câu hỏi thường gặp
Vì sao vẫn giữ công cụ mật mã đã vỡ? Vì tương thích. Sao lưu đã mã hóa, tệp định dạng cũ đã xuất, dấu vết giao thức đã bắt, thử thách CTF và phần cứng không thể nâng cấp vẫn nói các mật mã này. Đọc dữ liệu cũ là hợp lệ; ghi dữ liệu mới bằng chúng thì không.
Khóa DES của tôi có bit chẵn lẻ lẻ / byte không phải ASCII. DES bỏ qua bit chẵn lẻ của mỗi byte khóa, nên khóa hiệu dụng luôn là 56 bit còn lại. Trang này chấp nhận bất kỳ 8 byte nào và không ép chẵn lẻ chẵn.
Vì sao văn bản giải mã đôi khi trông như rác? Sai khóa, sai chế độ, sai IV, hoặc dữ liệu không được mã hóa theo cách bạn giả định. Không có thẻ xác thực nên không có lỗi "sai khóa" sạch — kiểm tra đệm là gợi ý duy nhất, và nó có thể qua bằng may rủi (1/256 lần).
Blowfish có an toàn cho tệp của tôi không? Với tệp nhỏ, về mật mã là có (không có phá vỡ thực tế). Với mọi thứ cỡ gigabyte dưới một khóa, không — giới hạn sinh nhật của khối 64 bit phụ thuộc vào khối lượng dữ liệu, không phải độ mạnh khóa. Twofish hoặc AES tránh được vấn đề này.
Còn khóa Blowfish 72 byte tôi từng thấy ở đâu đó? Một số triển khai chấp nhận đến 72 byte, nhưng bản tham chiếu của Schneier dùng 56 và các byte vượt quá đó không tạo thêm khuếch tán trong lịch trình chuẩn. Trang này theo bản tham chiếu: 4..56 byte.