Puncte:1

Responsabilitatea schimbului de chei

drapel us

Am implementat un schimb de chei asimetrice pentru a crea o cheie simetrică.

Întrebarea mea este mai mult una filozofică/legală în ceea ce privește responsabilitatea schimbului de chei și ce se întâmplă atunci când să spunem că este folosită o cheie cunoscută în mod obișnuit.

Aș dori să setez aceste variabile de bază:

  • Clientul are cheia publică a serverului codificată în memorie
  • Serverul are cheia privată codificată în memorie
  • Există un hardcoded nonce_size
  • Există un hardcoded public_key_size
  • Există un hardcoded mac_size

Pașii comunicării pentru schimb sunt următorii:

  1. După o conexiune TCP reușită, clientul generează o nouă cheie publică client_pubkey, își criptează propria cheie publică client_pubkey folosind un nou nonce temp_nonce_1 și hardcoded server_pubkey, și trimite un mesaj în care primii octeți sunt nonce, iar restul sunt codificați client_pubkey (inclusiv mac-ul său). Aceasta are o dimensiune cunoscută de nonce_size + public_key_size + mac_size.
  2. Serverul primește un mesaj, verificându-i dimensiunea exactă nonce_size + public_key_size + mac_size. Dacă este, presupune că este un schimb cheie. Decriptează cheia publică. Serverul generează apoi un nou cheie_simetrică, și trimite înapoi un mesaj care conține un nou nonce tmp_nonce2, și cheia simetrică + mac criptate folosind recepția client_pubkey.
  3. Clientul primește acest mesaj, știe exact ce dimensiune ar trebui să aibă, altfel respinge. Clientul are acum o cheie simetrică de utilizat.
  4. Serverul și clientul comunică prin tastele simetrice.

Deci, iată încercarea mea de a înțelege de ce este sigur:

  1. În cazul în care octeții de gunoi aleatori sunt trimiși către server, serverul generează o cheie, criptează cheia folosind gunoi, creând mai mult gunoi și apoi o trimite. Deci, în realitate, am trimis mai mult gunoi și apoi pur și simplu nu primim niciodată un mesaj valid și, în cele din urmă, expirăm, închidem conexiunea. Singurul rău aici este timpul pierdut de CPU pentru câteva secunde.
  2. Clientul trimite în mod specific o cheie publică de doar zero (sau un alt set de biți evident, ca toate cele 1) și un nonce valid (sau zero). În acest caz, serverul tratează zero-urile ca o cheie publică și trimite o cheie simetrică criptată prin cheia publică zero. Cu toate acestea, acest lucru ar trebui să fie în continuare sigur, deoarece a avea cheia publică cu zerouri presupune că cunoașteți cheia privată din care provine cheia publică zero, ceea ce ar dura miliarde de ani pentru a face inginerie inversă, deci este încă sigur.
  3. Presupunând că clientul și serverul pot reporni acest proces la infinit (și nu există o limită de x-try pe server), presupunând cumva printr-un noroc incalculabil și prin trimiterea de octeți aleatoriu, are loc un schimb de chei și un mesaj valid cu orice date a fost serverul așteptarea este trimisă și analizată de server, ne aruncăm brațele în aer, deoarece este aproape imposibil și practic. rahatul se întâmplă.
    • În acest caz, nu putem spune că cineva este răspunzător, nu? Serverul nu poate face nimic dacă știe că este un pachet rău intenționat.
    • Chiar dacă am avea o limită de x-retry de 2 încercări, teoretic ar putea apărea chiar și la prima conexiune de la o adresă IP și, din nou, nu putem face nimic în acest sens.

Deci, practic, totul este securizat, deoarece se așteaptă ca baza primului mesaj să fie criptată de o cheie publică de care numai serverul ar trebui să cunoască cheia_privată corespunzătoare, nu? Și că în cazul în care ceva, cumva, reușește vreodată să treacă, rezultatul este aruncat la nedefinit?

Îmi pare rău dacă acest lucru este într-adevăr concis, încerc doar să verific atât înțelegerea mea a teoriei și să mă asigur că nu există nicio greșeală în implementarea unui astfel de protocol.

Maarten Bodewes avatar
drapel in
Nu înțeleg, de ce să criptez ceva cu un nonce și apoi să trimit nonce-ul împreună cu textul cifrat? Ce rost are asta?
fgrieu avatar
drapel ng
De asemenea, se presupune că criptarea utilizată păstrează dimensiunea. Dar orice criptare care păstrează dimensiunea este deterministă, deci nu reușește în cadrul unui experiment de indistingere CPA. Deși aceasta nu este o problemă aici, elimină generalitatea construcției.
DeathDream avatar
drapel us
@MaartenBodewes Din câte am înțeles, scopul nonce este de a face astfel încât mesajele ulterioare cu aceeași cheie să nu poată descoperi un „bloc/componentă” comun în mesajul criptat și să-l folosească într-un atac de descifrare.Dar în cazul unui schimb de chei în care cheia publică codificată greu este folosită pentru a genera o nouă cheie publică, iar serverul decriptează mesajul o dată (folosind cheia sa privată) și criptează din nou o cheie aleatorie, nonce poate fi inutil în acest caz. caz presupun? Cred că trebuie să ne bazăm pe clientul care nu se auto-compromite?
DeathDream avatar
drapel us
@fgrieu În lumea reală, trebuie să aplicăm o formă de constrângere de dimensiune, deși nu-i așa? De exemplu, dacă criptăm mesaje în terenul UDP și suntem într-adevăr constrânși să trimitem pachete cu o dimensiune de mesaj de 512 de octeți, astfel încât să putem garanta că pot fi livrate (care din câte am înțeles este singura limită de dimensiune maximă pe care o putem garanta dacă nu sunt în teren ipv6), atunci avem doar o dimensiune maximă de 512 octeți pentru a lucra. Indiferent dacă criptarea păstrează dimensiunea sau nu, diferența maximă de dimensiune ar trebui garantată să se încadreze în 512 - octeți de dimensiune a mesajului.
SAI Peregrinus avatar
drapel si
Acesta este un protocol *foarte ciudat*. Ce se întâmplă dacă un mesaj legitim are aceeași lungime ca `nonce_size + public_key_size + mac_size`? Cum criptezi lucrurile cu chei asimetrice, asta nu este normal. În mod normal, se folosește un KEM sau un fel de schimb de chei asemănător Diffie-Hellman (cel mai adesea ECDHE). De ce mesajul 1 este „criptat” deloc, când toate informațiile care intră în cheia de criptare sunt publice? Ați văzut [Noise protocol framework](https://noiseprotocol.org) și, dacă da, de ce nu îl folosiți pentru a proiecta un protocol care să fie sănătos?
SAI Peregrinus avatar
drapel si
De ce nu folosești TLS? 99% din timp, pentru criptarea transportului la un server TLS este ceea ce doriți.

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.