Tôi có một thiết bị cần giao tiếp với một máy chủ khác và trao đổi tin nhắn có độ dài cố định.
Tất cả lưu lượng truy cập phải được mã hóa và xác thực, đồng thời có khả năng chống lại các cuộc tấn công lặp lại. Thật không may, dựa vào TLS không phải là một tùy chọn, vì vậy tôi cần triển khai một số giao thức tùy chỉnh. Tôi có quyền kiểm soát cả hai thiết bị nên tôi có thể tạo và phân phối khóa dùng chung một cách an toàn $k$.
Tôi nghĩ sẽ sử dụng AEAD với khối mật mã để thực hiện công việc nặng nhọc, chẳng hạn như AES ở chế độ GCM. Vấn đề tôi gặp phải là ngăn chặn các cuộc tấn công phát lại và tôi đã nảy ra ý tưởng sau. Hãy gọi các thiết bị $A$ và $B$ và xem xét thông tin liên lạc từ $A$ đến $B$ chỉ có.
- $A$ tạo ra một chuỗi ngẫu nhiên $a$ và gửi nó đến $B$.
- $B$ tạo ra một chuỗi ngẫu nhiên $b$ và gửi nó đến $A$.
- Cả hai $A$ và $B$ tính toán $h=H(k \Vert a \Vert b)$ đối với một số hàm băm mật mã $H$, Và sử dụng $h$ làm vectơ khởi tạo đầu tiên cho lược đồ AEAD.
Bất cứ khi nào $A$ cần gửi tin nhắn $m$ đến $B$, nó mã hóa $m$ để có được bản mã tương ứng $c$, tính toán thẻ xác thực $t$, và gửi $c \Vert t$ đến $A$ (tin nhắn có độ dài cố định nên độ dài của $c \Vert t$ là hằng số). sau đó $A$ gia số $h$ và khởi tạo lại sơ đồ AEAD với IV mới $h$.
Quá trình giải mã cũng tương tự: $B$ nhận được $c \Vert t$, giải mã $c$ vào trong $m$, xác thực tin nhắn bằng cách sử dụng thẻ $t$, gia số $h$và khởi tạo lại lược đồ AEAD với giá trị mới là $h$.
Thông tin liên lạc từ $B$ đến $A$ hoàn toàn đối xứng, ngoại trừ các IV ban đầu là $H(k \Vert b \Vert a)$.
Có bất kỳ lỗ hổng rõ ràng với ý tưởng trên? Tôi có đang phát minh lại bánh xe không? Nếu vậy, giải pháp tiếp theo để giải quyết vấn đề này là gì?