Mã hóa / giải mã DES / 3DES / RC4 / Blowfish

Mã hóa hoặc giải mã với bốn mật mã cổ điển vẫn còn trong tệp cũ, bản sao lưu và giao thức — DES và 3DES ở chế độ ECB hoặc CBC, RC4 (ARCFOUR) như mật mã dòng, và Blowfish với khóa đến 56 byte. Đã xác minh với FIPS 46-3, các vector Blowfish công bố của Schneier và RFC 6229. Mọi thứ chạy cục bộ trong trình duyệt của bạn — không có gì được tải lên. Với công việc hiện đại, dùng AES-GCM.
Các mật mã này chỉ để tương thích, không dùng cho công việc mới. DES bị rút năm 2005, 3DES năm 2023, RC4 bị cấm trong TLS từ 2015 (RFC 7465), và khối 64 bit của Blowfish chạm giới hạn sinh nhật sau khoảng 32 GiB dữ liệu dưới một khóa. Dùng AES-GCM cho mọi thứ mới.
Chiều: Mật mã: Chế độ: Đầu ra:
DES = Chuẩn mã hóa dữ liệu năm 1977: khối 64 bit, khóa hiệu dụng 56 bit. Đã rút lại nhưng vẫn gặp trong sao lưu cũ, khối PIN (ngân hàng) và Kerberos v4. Khóa phải đúng 8 byte.
Hex chấp nhận khoảng trắng, dấu hai chấm và tiền tố 0x. DES bỏ qua bit kiểm tra chẵn lẻ của mỗi byte khóa.
Mật mã khối đệm bằng PKCS#7; RC4 không bao giờ đệm.
Độ dài khóa trang này chấp nhận
Mật mãKhóaKhốiTrạng thái
DESđúng 8 byte (56 bit hiệu dụng)64 bitđã rút lại năm 2005 (NIST SP 800-131A)
3DES-EDE3đúng 24 byte (112 bit hiệu dụng)64 bitkhông được phép sau 2023 (SP 800-131A r2)
3DES-EDE2đúng 16 byte (112 bit hiệu dụng)64 bitgiống EDE3, tùy chọn cũ yếu hơn
RC4 / ARCFOUR1..256 bytedòngbị cấm trong TLS từ 2015 (RFC 7465)
Blowfish4..56 byte64 bitchưa bị phá nhưng bị giới hạn bởi khối 64 bit; dùng Twofish/AES
Kích thước khóa hiệu dụng nhỏ hơn kích thước thô vì DES dùng một bit mỗi byte làm bit kiểm tra chẵn lẻ: khóa thô 64 bit chỉ mang 56 bit khóa, còn 3DES với ba khóa độc lập mang 112 bit (tấn công gặp giữa).
Tương tác OpenSSL — OpenSSL 3 đã chuyển các mật mã này sang provider legacy; thêm -provider legacy nếu của bạn từ chối. Tương đương dòng lệnh của trang này:
openssl enc -des-ecb -K 133457799BBCDFF1 -in msg.bin -out msg.enc
openssl enc -des3 -K <48 hex> -iv <16 hex> -in msg.bin -out msg.enc (3DES-CBC)
openssl enc -rc4 -K 4b6579 -in msg.bin -out msg.enc  /  -bf-cbc cho Blowfish-CBC.
Giải mã với -d. -K nhận khóa hex thô, -k nhận mật khẩu (nên tránh — KDF khác với bất kỳ thứ gì trên trang này).
Tự kiểm tra
Chạy lại engine trang trên các vector công bố và vector tạo độc lập: ví dụ DES đã làm của FIPS 46-3, bản mã 3DES EDE2/EDE3 do OpenSSL tạo, vector Blowfish của Schneier, vector RC4 từ RFC 6229 và ví dụ cổ điển "Key/Plaintext", khứ hồi ở mọi chế độ, và kiểm tra âm (sai kích thước khóa, bản mã không bội số khối phải bị từ chối). Không gì được gửi đi đâu cả.
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.