Am un dispozitiv care trebuie să comunice cu o altă gazdă și să schimbe mesaje cu lungime fixă.
Tot traficul ar trebui să fie criptat și autentificat și ar trebui să fie rezistent la atacurile de reluare. Din păcate, să te bazezi pe TLS nu este o opțiune, așa că trebuie să implementez un protocol personalizat. Am controlul asupra ambelor dispozitive, astfel încât să pot genera și distribui în siguranță o cheie partajată $k$.
M-am gândit să folosesc AEAD cu block cypher pentru a face sarcini grele, de exemplu AES în modul GCM. Problema cu care mă confrunt este aceea de a preveni atacurile de reluare și mi-a venit următoarea idee. Să sunăm dispozitivele $A$ și $B$ și luați în considerare comunicarea de la $A$ la $B$ numai.
- $A$ generează un șir aleator $a$ si il trimite catre $B$.
- $B$ generează un șir aleator $b$ si il trimite catre $A$.
- Ambii $A$ și $B$ calcula $h=H(k \Vert a \Vert b)$ pentru unele funcții hash criptografice $H$, si foloseste $h$ ca prim vector de inițializare pentru schema AEAD.
Oricând $A$ trebuie să trimită un mesaj $m$ la $B$, criptează $m$ pentru a obține textul cifrat corespunzător $c$, calculează eticheta de autentificare $t$, și trimite $c \Vert t$ la $A$ (mesajele au o lungime fixă, deci lungimea de $c \Vert t$ este constantă). Atunci $A$ incremente $h$ și reinițializează schema AEAD cu noul IV $h$.
Procesul de decriptare este similar: $B$ primeste $c \Vert t$, decriptează $c$ în $m$, autentifică mesajul folosind eticheta $t$, crește $h$, și reinițializează schema AEAD cu noua valoare a $h$.
Comunicare de la $B$ la $A$ este complet simetric, cu excepția faptului că IV-urile inițiale sunt $H(k \Vert b \Vert a)$.
Există vreun defect evident în ideea de mai sus? Reinventez eu roata? Dacă da, care ar fi soluția de bază pentru a rezolva această problemă?