Această schemă îndeplinește cerințele mele? Trunchierea ultimilor 48 de biți prezintă un risc de securitate?
Schema este ruptă de un adversar pasiv care primește o singură pereche $(t,r)$. Observați că ultimii 48 de biți ai cheii pot fi recuperați ca $K[:48] = t \oplus r$. Prin urmare, atacatorul poate trimite acum arbitrar $(t^*, r^*)$ valori pe care receptorul le va accepta. Reamintind că verificatorul face următoarele
$r' = t' \oplus K$ (păstrați doar ultimii 48 de biți); verifica $r = r'$
Vedem că nu este necesară cunoașterea restului cheii.
În plus, valorile de 48 de biți oferă o protecție scăzută împotriva coliziunilor, dar asta poate fi bine pentru aplicația dvs....
Reluare: un atac mai simplu este reluarea perechii $(r, t)$. Descrierea nu spune cum verifică receptorul pentru acest lucru.
Soluție potențială: Din descrierea inițială, se pare că receptorul este destul de limitat din punct de vedere computațional și pot calcula doar xors sunt cei mai mulți și nu AES-CTR, de exemplu. Ceea ce ar fi ciudat cu următoarele
Deci, există un fel de pre-autentificare care a avut loc deja, dar nu are importanță aici
Oricum, o posibilă soluție este utilizarea a două funcții pseudo-aleatoare dacă receptorul poate face mai mult decât xors. (Mă îndoiesc că este sigur...). Inițial, extindeți $K$ în $K_1, K_2, K_3$ de lungime adecvată.
Expeditorul face următoarele
- $r =$ AES-CTR$(K_1, contor)$ (păstrați ultimii 48 de biți)
- trimite $contor, r, \tau = HMAC(K_2, contor,r)$
Receptorul face următoarele
- La primire $r, \tau$, verifica $\tau$
- Contorul de cecuri a crescut
- Rederive $r$.
Cateva observatii:
- Difuzarea aici nici măcar nu este necesară dacă expeditorul și receptorul sunt cineva care împărtășește un ceas.
- Alternativa are câteva probleme când vine vorba de robustețe în cazul unei reporniri, așa cum a subliniat într-un comentariu al lui Paul.