Mã hóa Salsa20
Mã hóa dòng tốc độ cao với biến thể nonce mở rộng
Bảo mật phía máy khách
Salsa20 là mật mã ARX không có bảng tra cứu, vốn có thời gian cố định, miễn dịch với tấn công cache-timing. Tái sử dụng nonce là thảm họa. Dùng XSalsa20 (nonce 192 bit) để tạo nonce ngẫu nhiên an toàn.
Giá trị bộ đếm khối ban đầu (thường là 0 để mã hóa, cùng giá trị để giải mã)
Giới thiệu Salsa20
Salsa20 là mật mã dòng ARX do Daniel J. Bernstein thiết kế (2005, eSTREAM). Hoạt động trên ma trận 4×4 từ 32 bit (trạng thái 512 bit) chỉ với phép cộng (mod 2³²), xoay bit và XOR — không S-box, không bảng tra cứu. Bộ đếm dòng 64 bit cho phép truy cập ngẫu nhiên đến bất kỳ vị trí nào trong luồng khóa.
Salsa20 được chọn vào eSTREAM Profile 1 (phần mềm, 2008). XSalsa20 (Bernstein 2011) dùng HSalsa20 để dẫn xuất khóa con 256-bit, cho phép tạo nonce ngẫu nhiên 192 bit mà không có rủi ro sinh nhật. Nền tảng của NaCl secretbox (XSalsa20-Poly1305).
So sánh thuật toán
| Thuật toán | Vòng | Độ dài Nonce | Tốc độ | Sử dụng tốt nhất |
|---|---|---|---|---|
| Salsa20/20 | 20 | 64 bits (8 bytes) | Tiêu chuẩn | Mã hóa phiên với nonce tuần tự; thông lượng cao; triển khai được chứng nhận eSTREAM |
| Salsa20/12 | 12 | 64 bits (8 bytes) | Nhanh | Hiệu suất cao với biên đủ; khuyến nghị Bernstein |
| Salsa20/8 | 8 | 64 bits (8 bytes) | Nhanh nhất | Chỉ benchmarking và nghiên cứu |
| XSalsa20 | 20 | 192 bits (24 bytes) | Tiêu chuẩn | Ứng dụng tạo nonce ngẫu nhiên; tương thích NaCl/libsodium secretbox |
Cách Salsa20 hoạt động
Salsa20 khởi tạo ma trận 4×4: 4 hằng số (“expand 32-byte k”), 8×32 bit từ khóa 256 bit, 2×32 bit bộ đếm, 2×32 bit nonce.
Phần tư vòng (a,b,c,d): b⊕=(a+d)⋘7; c⊕=(b+a)⋘9; d⊕=(c+b)⋘13; a⊕=(d+c)⋘18. Vòng đôi = vòng cột + vòng đường chéo. Salsa20/20 = 10 vòng đôi. Đầu ra = XOR trạng thái đã biến đổi với trạng thái ban đầu.
Bộ đếm 64 bit: 2⁷⁴ byte mỗi (khóa, nonce). Truy cập ngẫu nhiên bằng cách đặt bộ đếm. Xử lý song song các đoạn 64 byte độc lập.
Biến thể vòng
- Salsa20/20 (20 vòng): biên an toàn tối đa, eSTREAM, không có tấn công toàn vòng. Khuyến nghị cho tất cả ứng dụng quan trọng.
- Salsa20/12 (12 vòng): ~35% nhanh hơn /20, không có tấn công 12 vòng, khuyến nghị cân bằng hiệu suất của Bernstein.
- Salsa20/8 (8 vòng): nhanh nhất, các phân biệt tấn công đã biết (Aumasson 2008, 2²⁴⁹). Không khuyến nghị cho bảo mật. Chỉ benchmarking.
Tính năng chính
- Thiết kế ARX: không S-box, không bảng. Thời gian thực thi độc lập với dữ liệu. Miễn dịch tự nhiên với tấn công cache-timing.
- Luồng khóa lớn: 2⁷⁴ byte mỗi (khóa, nonce) qua bộ đếm 64 bit. Truy cập ngẫu nhiên không cần xử lý lại.
- Nonce 64 bit: cần quản lý tính duy nhất nghiêm ngặt. Sau 2³² tin nhắn cùng khóa, xác suất va chạm nonce không bỏ qua được. Dùng XSalsa20 (192 bit) cho khóa lâu dài.
- XSalsa20 (nonce 192 bit, 2011): HSalsa20 dẫn xuất khóa con cho phép tạo nonce ngẫu nhiên an toàn. Tiêu chuẩn secretbox NaCl.
- eSTREAM Profile 1 (phần mềm, 2008): đánh giá công khai 4 năm. Không có tấn công trên 12 hoặc 20 vòng.
Cân nhắc bảo mật
- Tái sử dụng nonce thảm họa: tiết lộ XOR bản rõ. Nonce duy nhất bắt buộc. XSalsa20 nonce 192 bit ngẫu nhiên loại bỏ rủi ro sinh nhật.
- Giới hạn sinh nhật nonce ngắn: 64 bit → ~2³² tin nhắn trước khi va chạm ~50%. Dùng XSalsa20 (192 bit).
- Tấn công vòng giảm: không có trên /20 hoặc /12. Salsa20/8: phân biệt đã biết. Chỉ /20 cho bảo mật quan trọng.
- Không xác thực: dùng XSalsa20-Poly1305 hoặc ChaCha20-Poly1305 để có AEAD.
Sử dụng thực tế
- NaCl secretbox (XSalsa20-Poly1305): nguyên thủy AEAD gốc của NaCl; nonce 192 bit + Poly1305; rộng rãi qua libsodium.
- eSTREAM Profile 1 (2008): Salsa20/12 được chọn trong cuộc thi ECRYPT 2004-2008.
- Ảnh hưởng lên ChaCha20: Bernstein thiết kế ChaCha20 (2008) như biến thể Salsa20 với khuếch tán cải tiến mỗi vòng.
- Hệ thống cũ: nhiều VPN, mã hóa tệp, ứng dụng nhắn tin libsodium dùng XSalsa20-Poly1305 trước RFC 7539/8439.