Să începem cu un experiment de gândire rapidă.

Aveți o rețea de 3 computere, folosite de Alice, Bob și Charlie. Toți cei 3 participanți pot trimite mesaje, dar într-un mod în care toți ceilalți clienți care s-au conectat la rețea pot să-l citească. Aceasta este singura formă de comunicare posibilă între participanți.

Dacă Alice trimite un mesaj prin fire, Bob și Charlie îl primesc. Cu alte cuvinte, Alice nu îi poate trimite un mesaj direct lui Bob fără ca Charlie să-l primească și el.

Dar Alice vrea să îi trimită un mesaj confidențial lui Bob și nu vrea ca Charlie să îl poată citi.

Pare imposibil cu aceste reguli stricte, nu? Lucrul frumos că această problemă este rezolvată în 1976 de Whitfield Diffie și Martin Hellman.

Aceasta este o versiune simplificată a lumii reale, dar ne confruntăm cu aceeași problemă atunci când comunicăm prin cea mai mare rețea care a existat vreodată.

De obicei, nu sunteți conectat direct la internet, dar faceți parte dintr-o rețea locală mai mică, numită Ethernet.

Această rețea mai mică poate fi cu fir sau fără fir (Wi-Fi), dar conceptul de bază rămâne. Dacă trimiteți un semnal prin rețea, acest semnal poate fi citit de toți ceilalți clienți conectați la aceeași rețea.

Diffie Hellman Algoritmul genial din spatele comunicarii in retea securizate

Odată ce ați transmis un mesaj către serverul băncii dvs. cu informațiile despre cardul dvs. de credit, toți ceilalți clienți din rețeaua locală vor primi mesajul, inclusiv routerul. Apoi îl va redirecționa către serverul propriu-zis al băncii. Toți ceilalți clienți vor ignora mesajul.

Dar dacă există un client rău intenționat în rețea care nu va ignora mesajele dvs. confidențiale, ci le va citi în schimb? Cum este posibil să aveți în continuare bani în contul dvs. bancar?

Conţinut

Criptare

Este destul de clar în acest moment că trebuie să folosim un fel de criptare pentru a ne asigura că mesajul poate fi citit pentru Alice și Bob, dar gălăgie completă pentru Charlie.

Criptarea informațiilor se face printr-un algoritm de criptare, care preia o cheie (de exemplu un șir) și redă o valoare criptată, numită text cifrat. Textul cifrat este doar un șir complet aleatoriu.

Este important ca valoarea criptată (text cifrat) să poată fi decriptată numai cu cheia originală. Acesta se numește algoritm cu cheie simetrică, deoarece aveți nevoie de aceeași cheie pentru decriptarea mesajului cu care a fost criptat. Există, de asemenea, algoritmi cu cheie asimetrică, dar nu avem nevoie de ei chiar acum.

Pentru a înțelege mai ușor acest lucru, iată un algoritm de criptare inactiv implementat în JavaScript:

function encrypt(message, key) {
    return message.split("").map(character => {
        const characterAsciiCode = character.charCodeAt(0)
    	return String.fromCharCode(characterAsciiCode+key.length)
    }).join("");
}
Criptarea

În această funcție, am mapat fiecare caracter într-un alt caracter pe baza lungimii tastei date.

Fiecare caracter are o reprezentare întreagă, numită cod ASCII. Există un dicționar care conține toate caracterele cu codul său, numit tabelul ASCII. Deci, am incrementat acest număr întreg cu lungimea cheii:

1611228429 732 Diffie Hellman Algoritmul genial din spatele comunicarii in retea securizate
Cartografierea caracterelor

Decriptarea textului cifrat este destul de similară. Dar, în loc de adăugare, scădem lungimea cheii din fiecare caracter din textul cifrat, astfel încât să primim mesajul original.

function decrypt(cipher, key) {
    return cipher.split("").map(character => {
        const characterAsciiCode = character.charCodeAt(0)
    	return String.fromCharCode(characterAsciiCode-key.length)
    }).join("");
}
Decriptarea

În cele din urmă, aici este criptarea fictivă în acțiune:

const message = "Hi Bob, here is a confidential message!";
const key = "password";

const cipher = encrypt(message, key);
console.log("Encrypted message:", cipher);
// Encrypted message: Pq(Jwj4(pmzm(q{(i(kwvnqlmv|qit(um{{iom)

const decryptedMessage = decrypt(cipher, key);
console.log("Decrypted message:", decryptedMessage);
// Decrypted message: Hi Bob, here is a confidential message!
Folosind algoritmul nostru

Am aplicat un anumit grad de criptare mesajului, dar acest algoritm a fost util numai în scopuri demonstrative, pentru a obține o idee despre cum se comportă algoritmii de criptare cu cheie simetrică.

Există câteva probleme cu această implementare, în afară de tratarea slabă a cazurilor de colț și a tipurilor de parametri.

În primul rând, fiecare cheie de 8 caractere poate decripta mesajul care a fost criptat cu cheia „parolă”. Vrem ca un algoritm de criptare să poată decripta un mesaj numai dacă îi dăm aceeași cheie cu care a fost criptat mesajul. O încuietoare de ușă care poate fi deschisă de orice altă cheie nu este atât de utilă.

În al doilea rând, logica este prea simplă – fiecare caracter este mutat în aceeași cantitate în tabelul ASCII, ceea ce este prea previzibil. Avem nevoie de ceva mai complex pentru a face mai dificilă aflarea mesajului fără cheie.

În al treilea rând, nu există o lungime minimă a cheii. Algoritmii moderni funcționează cu taste de cel puțin 128 de biți (~ 16 caractere). Acest lucru mărește semnificativ numărul de chei posibile și, cu aceasta, securitatea criptării.

În cele din urmă, este nevoie de prea puțin timp pentru a cripta sau decripta mesajul. Aceasta este o problemă, deoarece nu durează prea mult timp pentru a încerca toate cheile posibile și a sparge mesajul criptat.

Acest lucru este mână în mână cu lungimea cheii: un algoritm este sigur dacă eu, ca atacator, doresc să găsesc cheia, atunci trebuie să încerc un număr mare de combinații de taste și durează relativ mult timp pentru a încerca o singură combinație.

Există o gamă largă de algoritmi de criptare simetrică care au abordat toate aceste afirmații, adesea utilizate împreună pentru a găsi un raport bun de viteză și siguranță pentru fiecare situație.

Cei mai populari algoritmi cu cheie simetrică sunt Twofish, Şarpe, AES (Rijndael), Blowfish, CAST5, RC4, TDES, și IDEE.

Dacă doriți să aflați mai multe despre criptografie, în general, verificați această discuție.

Schimb de chei

Se pare că am redus spațiul inițial al problemei. Cu criptarea, putem crea un mesaj care este semnificativ pentru părțile care sunt eligibile să citească informațiile, dar care nu poate fi citit pentru alții.

Când Alice dorește să scrie un mesaj confidențial, ea alege o cheie și își criptează mesajul cu ea și trimite textul cifrat prin fire. Atât Bob, cât și Charlie ar primi mesajul criptat, dar niciunul dintre ei nu l-ar putea interpreta fără cheia lui Alice.

Acum singura întrebare de răspuns este cum Alice și Bob pot găsi o cheie comună doar comunicând prin rețea și împiedicând Charlie să afle aceeași cheie.

Dacă Alice își trimite cheia direct prin fire, Charlie ar intercepta-o și ar putea descifra toate mesajele lui Alice. Deci, aceasta nu este o soluție. Aceasta se numește problema schimbului de chei în informatică.

Schimb de chei Diffie – Hellman

Acest algoritm cool oferă o modalitate de a genera o cheie partajată între două persoane, astfel încât cheia să nu poată fi văzută prin observarea comunicării.

Ca prim pas, vom spune că există un număr prim imens, cunoscut de toți participanții, este informație publică. Ii spunem „p” sau modul.

Există, de asemenea, un alt număr public numit „g” sau bază, care este mai mic de p.

Nu vă faceți griji cu privire la modul în care sunt generate aceste numere. Din simplitate, să spunem că Alice alege un număr prim foarte mare (p) și un număr care este considerabil mai mic decât p. Apoi le trimite prin fire fără nici o criptare, astfel încât toți participanții vor cunoaște aceste numere.

Exemplu: Pentru a înțelege acest lucru printr-un exemplu, vom folosi numere mici. Sa spunem p = 23 și g = 5.

Ca al doilea pas, atât Alice (A) și Bob (b) va alege un număr secret, pe care nu-l vor spune nimănui, doar că locuiește local în computerele lor.

Exemplu: Să spunem că Alice a ales 4 (a = 4), iar Bob a ales 3 (b = 3).

Ca un pas următor, vor face niște calcule pe numerele lor secrete, vor calcula:

  1. baza (g) în puterea numărului lor secret,
  2. și ia modulul numărului calculat la p.
  3. Apelați rezultatul A (pentru Alice) și B (pentru Bob).

Modulo este o afirmație matematică simplă și o folosim pentru a găsi restul după împărțirea unui număr la altul. Iată un exemplu: 23 mod 4 = 3, deoarece 23/4 este 5 și rămâne 3.

Poate că este mai ușor să vezi toate acestea în cod:

// base
const g = 5;
// modulus
const p = 23;

// Alice's randomly picked number
const a = 4;
// Alice's calculated value
const A = Math.pow(g, a)%p;

// Do the same for Bob
const b = 3;
const B = Math.pow(g, b)%p;

console.log("Alice's calculated value (A):", A);
// Alice's calculated value (A): 4
console.log("Bob's calculated value (B):", B);
// Bob's calculated value (B): 10

Acum, atât Alice, cât și Bob își vor trimite valorile calculate (A, B) prin rețea, astfel încât toți participanții să le cunoască.

Ca ultim pas, Alice și Bob vor lua reciproc valorile calculate și vor face următoarele:

  1. Alice va lua valoarea calculată a lui Bob (B) în puterea numărului său secret (A),
  2. și calculați modulul acestui număr la p și va apela rezultatul s (secret).
  3. Bob va face același lucru, dar cu valoarea calculată de Alice (A), și numărul său secret (b).

În acest moment, au generat cu succes un secret comun (s), chiar dacă este greu de văzut chiar acum. Vom explora acest lucru mai detaliat într-o secundă.

În cod:

// Alice calculate the common secret
const secretOfAlice = Math.pow(B, a)%p;
console.log("Alice's calculated secret:", secretOfAlice);
// Alice's calculated secret: 18

// Bob will calculate
const secretOfBob = Math.pow(A, b)%p;
console.log("Bob's calculated secret:", secretOfBob);
// Bob's calculated secret: 18
Calculul secretului comun

După cum puteți vedea, Alice și Bob au obținut numărul 18, pe care îl pot folosi ca cheie pentru a cripta mesajele. Pare magic în acest moment, dar sunt doar niște matematici.

Să vedem de ce au obținut același număr împărțind calculele în bucăți elementare:

1611228430 694 Diffie Hellman Algoritmul genial din spatele comunicarii in retea securizate
Procesul ca o ecuație

În ultimul pas, am folosit un identitate aritmetică modulo și proprietățile sale distributive pentru a simplifica instrucțiunile modulo imbricate.

Deci Alice și Bob au aceeași cheie, dar să vedem ce a văzut Charlie din toate acestea. Noi stim aia p și g sunt numere publice, disponibile pentru toată lumea.

Știm, de asemenea, că Alice și Bob și-au trimis valorile calculate (A, B) prin rețea, astfel încât să poată fi prins și de Charlie.

1611228430 836 Diffie Hellman Algoritmul genial din spatele comunicarii in retea securizate
Perspectiva lui Charlie

Charlie cunoaște aproape toți parametrii acestei ecuații, doar A și b rămâne ascuns. Să rămână cu exemplul, dacă știe asta A este 4 și p are 23, g la puterea lui A pot fi 4, 27, 50, 73, … și alte numere infinite care rezultă în 4 în spațiul modulo.

Știe, de asemenea, că numai subsetul acestor numere sunt opțiuni posibile, deoarece nu toate numerele sunt un exponent de 5 (g), dar acesta este încă un număr infinit de opțiuni de încercat.

Acest lucru nu pare prea sigur cu un număr mic. Dar la început am spus asta p este un număr foarte mare, adesea lung de 2000 sau 4000 de biți. Acest lucru face aproape imposibil de ghicit valoarea A sau b în lumea reală.

Cheia comună pe care o au ambii Alice și Bob numai poate fi generată prin cunoaștere A sau b, pe lângă informațiile care au călătorit prin rețea.

Dacă sunteți mai vizual, iată o diagramă grozavă care arată întregul proces amestecând găleți de vopsea în loc de numere.

Diffie Hellman Algoritmul genial din spatele comunicarii in retea securizate.svg
sursă: Wikipedia

Aici p și g constante partajate reprezentate de galbenul „Vopsea comună”. Numere secrete ale lui Alice și Bob (A, b) este „Culori secrete”, iar „Secret comun” este ceea ce am numit s.

Aceasta este o mare analogie, deoarece reprezintă ireversibilitatea operației modulo. Deoarece vopselele mixte nu pot fi amestecate cu componentele lor originale, rezultatul unei operații modulo nu poate fi inversat.

rezumat

Acum problema inițială poate fi rezolvată prin criptarea mesajelor folosind o cheie partajată, care a fost schimbată cu algoritmul Diffie-Hellman.

Cu aceasta Alice și Bob pot comunica în siguranță, iar Charlie nu le poate citi mesajele, chiar dacă face parte din aceeași rețea.

Vă mulțumim că ați citit până aici! Sper că ați obținut o anumită valoare din acest post și ați înțeles câteva părți ale acestui flux de comunicare interesant.

Dacă a fost greu să urmezi calculele acestei explicații, aici este un videoclip minunat pentru a vă ajuta să înțelegeți algoritmul fără matematică, de la un nivel superior.

Dacă ți-a plăcut această postare, poate vrei să mă urmărești Stare de nervozitate pentru a găsi câteva resurse mai interesante despre programare și dezvoltarea de software.