Puncte:0

Nonces în chacha20poly1305 vs chacha20

drapel cn

În prezent lucrez la înlocuirea criptării chacha20 din aplicația mea cu chacha20poly1305, dar mă confrunt cu câteva întrebări la care par să nu găsesc răspunsuri clare, care provin în principal din Rust chacha20poly1305 ladă:

  • De ce chacha20poly1305 lada necesită un nonce pentru fiecare mesaj, dar chacha20 necesită doar un singur nonce la inițializarea cifrului? De ce nu pare să fie cazul altor biblioteci, cum ar fi cea a lui Python PyCryptodome?
  • Algoritmul ChaCha20Poly1305 necesită un nou nonce pentru fiecare mesaj?
  • Am înțeles că algoritmul ChaCha20 are un contor intern pe care îl combină cu cheia și nonce pentru a genera blocuri ale fluxului de chei (un bloc pe creștere a contorului). Nu este acesta cazul când este folosit în ChaCha20Poly1305?

În cele din urmă, dacă ChaCha20Poly1305 (sau în cazul meu XChaCha20Poly1305) are nevoie de un nou nonce pentru fiecare mesaj, un contor de 4 octeți per mesaj combinat cu un nonce aleatoriu de 20 de octeți pe sesiune ar fi potrivit pentru a fi folosit ca nonce per mesaj ? (cheia este derivată din parolă și este atât de probabil să se repete între sesiuni și, cumva, stocarea unui contor universal în toate sesiunile nu este fezabilă.)

Mulțumiri!

kelalaka avatar
drapel in
Fiecare cifru de flux trebuie să folosească perechea (nonce,cheie) o singură dată. Nu se poate responsabil pentru alegerile proaste sau pentru lecturile tale greșite despre asta.
kelalaka avatar
drapel in
Mă tem că această întrebare se referă mai mult la analiza de securitate a implementărilor Rust.`inițializarea cifrului?` este o alegere de bibliotecă. O bibliotecă bună trebuie să gestioneze totul fără probleme și să ofere putere utilizatorului prin opțiuni. De exemplu, se pot genera IV-uri aleatoare dacă nu sunt furnizate sau pot lua unul de la utilizator, etc.
Keegan Conlee avatar
drapel cn
@kelalaka Ce zici de asta atunci: ar fi corect să spunem că într-un cifr ChaCha20Poly1305, contorul intern al cifrului ChaCha20 este resetat pentru fiecare mesaj? Acest lucru ar explica necesitatea unui nonce unic per mesaj, spre deosebire de ChaCha20 simplu, care începe fluxul de cheie pentru fiecare mesaj nou oriunde s-a oprit ultimul mesaj.
kelalaka avatar
drapel in
De obicei, atunci când inițiază cifra, poate ai uitat să inițiezi în ChaCha20?
Keegan Conlee avatar
drapel cn
@kelalaka ce face? Înțelegerea mea, după ce am găsit în sfârșit mai multă documentație, este că, cel puțin pentru bibliotecile pe care le folosesc, atunci când initiezi un cifr ChaCha20, dai cheia și nonce. Obiectul cifrat va menține starea (contorul intern), incrementând contorul după cum este necesar. În timp ce atunci când inițiază un cifr ChaCha20Poly1305, îi dai doar cheia, deoarece nu deține altă stare decât aceea, repornind contorul intern (și fluxul de chei) pentru fiecare mesaj nou pe care vrei să-l criptezi și necesitând astfel un nou vector de inițializare (care este un nonce nou cu aceeași cheie).
SAI Peregrinus avatar
drapel si
API-uri de bibliotecă diferite.Atât ChaCha20, cât și ChaCha20-Poly1305 au nevoie de un nou nonce pentru fiecare mesaj pentru a oferi orice securitate. Unele biblioteci vor genera intern noi nonce pentru tine dintr-o singură intrare furnizată, altele nu. În general, lăzile care implementează trăsăturile `cipher` sunt de nivel mai scăzut decât cele care implementează trăsăturile `aead`.
SAI Peregrinus avatar
drapel si
De asemenea, cutia chacha20poly1305 vă permite să utilizați xChaCha20-Poly1305. Acest lucru permite un nonce aleatoriu, dacă utilizați cei 192 de biți ai spațiului nonce. În acest fel, nu trebuie să stocați nimic între mesaje. Contorul de mesaje este gestionat intern.
Keegan Conlee avatar
drapel cn
@SAIPeregrinus, totuși, nu pare să dețină un contor de mesaje, de unde această postare. Necesită să treceți un nonce la fiecare apel `encrypt()` și nu acceptă un nonce când inițializați un nou obiect `XChaCha20Poly1305`. Cu excepția cazului în care îmi lipsește în totalitate o mare parte din API-ul său.
Keegan Conlee avatar
drapel cn
M-am uitat la codul sursă pentru cutia `chacha20poly1305` și, literalmente, inițializează un cifr complet nou pentru fiecare apel encrypt(): https://docs.rs/chacha20poly1305/latest/src/chacha20poly1305/lib.rs .html#271 Pot doar să presupun că asta înseamnă că trebuie să țin evidența propriului meu contor de mesaje.
SAI Peregrinus avatar
drapel si
encrypt() este apelat o dată pe mesaj, cu un nou nonce de fiecare dată. Contorul din ChaCha nu este un contor de mesaje, este un contor intern care este incrementat pentru fiecare 512 biți ai mesajului.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.