Nếu bạn là người sử dụng mật mã: tất cả những thứ này đều lỗi thời. Không có lý do gì trong thời đại ngày nay để kết hợp MAC hoặc hàm băm với mã hóa. Sử dụng một tiêu chuẩn AEAD thuật toán, kết hợp bảo vệ tính bảo mật và tính xác thực theo cách đã được các nhà mật mã học xem xét kỹ lưỡng. Nó có thể sử dụng MAC-rồi mã hóa, mã hóa-rồi-MAC hoặc mã hóa-và-MAC dưới mui xe hoặc thứ gì đó không phù hợp với bất kỳ khung nào trong ba khung đó, nhưng bạn không cần quan tâm.
Nếu bạn là người thiết kế nguyên mẫu mã hóa: tất cả những cách này đều là những cách tiềm năng để cung cấp mã hóa được xác thực. Mã hóa xác thực của một tin nhắn đảm bảo hai thuộc tính: tính bí mật (chỉ những thực thể có khóa bí mật mới có thể khôi phục tin nhắn từ bản mã) và tính xác thực (chỉ những thực thể có khóa bí mật mới có thể tạo ra một bản mã hợp lệ).
MAC đảm bảo tính xác thực. Mã hóa đảm bảo tính bảo mật theo các giả định nhất định (ví dụ: mã hóa không có tính xác thực có thể dễ bị tấn công đệm tấn công oracle chống lại chế độ CBC phổ biến). Bạn có thể kết hợp một MAC nguyên thủy m
với một mã hóa nguyên thủy e
trên một tin nhắn tôi
theo nhiều cách khác nhau (||
là nối):
E(M) || M(E(m))
: mã hóa-rồi-MAC. Mã hóa tin nhắn và nối thêm MAC của mã hóa.
E(m || M(m))
: MAC-rồi-mã hóa. Nối MAC của tin nhắn vào tin nhắn và mã hóa kết quả.
E(M) || m(m)
: mã hóa-và-MAC. Mã hóa tin nhắn và nối thêm MAC của tin nhắn gốc.
Có thể làm cho mỗi người trong số họ đúng. Cũng có thể hiểu sai từng cái một. Để xem xét những ưu điểm và nhược điểm của từng phương pháp, hãy đọc Chúng ta nên MAC-rồi-mã hóa hay mã hóa-rồi-MAC?
Hash-then-encrypt cũng giống như MAC-then-encrypt, ngoại trừ việc nó sử dụng hàm băm thay vì MAC: E(M || H(h))
. Điều này có cơ hội tốt để đảm bảo tính bảo mật vì mọi thứ đều được mã hóa. Tính xác thực mong manh hơn: nó phụ thuộc vào việc kẻ thù không thể tạo mã hóa hàm băm. Tôi không biết về một công trình đang hoạt động sử dụng khung này, nhưng có thể một công trình tồn tại.
Câu hỏi bổ sung: tại sao không mã hóa-rồi-băm hoặc mã hóa-và-băm?
Những thứ đó không thể hoạt động được. Mã hóa-rồi-băm (E(m) || H(E(m))
) cho phép bất kỳ ai giả mạo các thông điệp tùy ý bằng cách tạo một bản mã và nối thêm hàm băm của nó. (Và kẻ thù thậm chí có thể biết nội dung tin nhắn; ví dụ: cắt bớt một bản mã thường tương ứng với việc cắt bớt một tin nhắn, vì vậy kẻ thù có thể tự do cắt bớt một tin nhắn hiện có.) Mã hóa và băm (E(m) || H(m)
) tiết lộ hàm băm của tin nhắn, vì vậy ít nhất bất kỳ ai cũng có thể đoán tin nhắn đó có thể là gì và xác minh dự đoán của họ.