Pentru început, aceasta este în principal o întrebare de curiozitate care mă sâcâie de ceva vreme. Am căutat destul de mult pe Google pentru a vedea dacă cineva a făcut deja o expunere corectă a acestei idei stupide, dar nu am găsit nimic.
Un prieten și cu mine lucram împreună la un mic proiect pentru a învăța elementele de bază ale implementării practice a criptării. Detaliile nu sunt deosebit de importante, tot ce am vrut să facă a fost să partajăm șiruri criptate printr-o rețea IP.
Am întâmpinat o problemă interesantă când am descoperit cum să schimbăm un secret partajat odată ce a fost efectuată o strângere de mână RSA. Deoarece acest mic program nu a funcționat pe conceptul de client/server, aveam nevoie de o modalitate de a ne asigura că ambele capete vor selecta aceeași cheie. Inițial am investigat o implementare pre-ambalată a ECC+Diffie-Hellman (de la .NET), dar a existat un defect fatal - clasa a funcționat doar pe Windows, dar prietenul meu este pe un Mac.
Din câte știu, nu există alte implementări de schimb de chei împachetate în .NET, așa că am ajuns să vin cu o soluție simplă fără creier:
- Ambii colegi trimit o cheie proaspăt generată (în special, o matrice de octeți a cheii AES) celuilalt.
- Ambii colegi își introduc cheia și cheia partenerului lor într-un algoritm, care iterează secvențial peste valorile octeților (cred ca numere întregi de 8 biți convertite implicit?) în ambele matrice de chei.
- Dacă o cheie are o valoare mai mare decât cealaltă la un anumit index, acea cheie este returnată ca cheie selectată.
- Dacă această condiție nu este îndeplinită niciodată în timpul iterației, atunci cheile sunt identice și nu contează care este returnată. (IV au fost prezente, dar ignorate.)
Acest algoritm de hackjob cu zece linii a funcționat mult mai bine decât avea dreptul. Cu înțelegerea mea limitată a matematicii implicate, acest lucru are sens din punct de vedere computațional - există $256^{32}$ chei posibile și a $\frac{255}{256}$ șansa de a obține un rezultat pe comparație (extrem de ieftină), astfel încât practic vi se garantează un rezultat utilizabil instantaneu.
Cu toate acestea, sunt încă curios - cum arată acest algoritm din punct de vedere al securității? Dacă am învățat ceva din răsfoirea acestui SE, este că chiar și cele mai simple/mai inofensive lucruri pentru un neprofesionist ca mine pot reprezenta găuri de securitate flagrante.
(De asemenea, jur că asta nu va fi folosit niciodată pentru ceva important. Știu acum despre Castelul Bouncy, mulțumesc lui Dumnezeu.)