Încerc să-mi înțeleg conceptul de SIV în contextul criptării. Înțeleg aspectul utilizării greșite a nonce etc. Și înțeleg că caracteristica cheie pentru SIV este că se asigură că, în timp ce criptarea aceluiași mesaj cu aceeași cheie va dezvălui că este identic, nu va dezvălui nimic altceva.
În special, utilizarea aceleiași chei pe mesaje diferite nu va avea o problemă catastrofală cu nonce reutilizare în alt sistem.
Dacă am înțeles bine, puteți construi un mod de operare SIV folosind:
def encrypt(msg, key):
siv = hash_shake256(bits=192, msg)
returnează xchacha20(cheie, siv, msg), siv
Cu alte cuvinte, mai întâi calculăm un hash cu cheie pe mesaj, apoi folosim acea valoare ca nonce pentru criptarea reală.
Ieșirea este textul cifrat, precum și cel generat siv
, ambele pot fi împărtășite în siguranță fără a dezvălui nimic unui adversar.
Securitatea provine din caracterul nereversibil al funcției hash cu cheie și din faptul că pentru fiecare msg
trecem ca intrare, suntem asigurați că nu vom avea un nonce duplicat.
- Înțeleg lucrurile corect?
- Este sigur să folosiți aceeași cheie atât pentru hash cu cheie, cât și pentru criptare?
- Presupun real
siv
utilizarea este puțin mai mult decât simpla hashing a intrării?