Dacă ceva din protocolul Signal pare surprinzător, atunci motivul pentru care există este probabil legat de compromisul cheie. Principalul lucru de reținut este faptul că „cheile de identitate” sunt secrete pe termen lung.
Să presupunem că Alice are cheia pe termen lung $a^*$ iar Bob are cheie pe termen lung $b^*$, cu cheile publice corespunzătoare $g^{a^*}$ și $g^{b^*}$.
Ei pot face acordul normal al cheii DH cu aceste chei pe termen lung și sunt de acord cu secretul $g^{a^*b^*}$ și procedați la schimbul de mesaje criptate.
Dar ne pasă compromisul cheilor pe termen lung.
Dacă cheia pe termen lung a lui Alice $a^*$ este compromisă mai târziu, apoi atacatorul poate calcula $g^{a^*b^*}$ și încalcă confidențialitatea mesajelor criptate (în toate a legăturilor lui Alice!).
Dacă sunteți familiarizat cu Signal, atunci probabil știți cum se recuperează Signal de la compromisul cheie în situații normale.
Folosim un „clichet continuu asimetric”.
Alice trimite un nou/proaspăt $g^{a_i}$ cu fiecare mesaj, iar Bob trimite unul nou $g^{b_j}$ cu fiecare mesaj.
În orice moment, pot folosi cele mai recente $g^{a_i}$ și $g^{b_j}$ pentru a deriva cheia partajată curentă $g^{a_i b_j}$.
Punctul important aici este că $a_i$ și $b_j$ cheile sunt temporar.
Alice poate arunca $a_i$ după ce Bob recunoaște că a trecut la utilizare $g^{ a_{i+1}}$.
Dacă un atacator o compromite pe Alice la timp $t$, acest atacator învață doar $a_t$.
După puțin timp, Alice și Bob nu vor mai folosi $a_t$ și începeți să utilizați $a_{t+1}$, iar atacatorul nu va mai putea să-și citească mesajele.
Deci, dacă clichetul asimetric continuu este modalitatea de a ne recupera de la compromisul cheie și suntem îngrijorați de termen lung cheile (identității) fiind compromise, atunci soluția naturală este să faceți un clichet asimetric imediat ce conexiunea este stabilită (folosind cheile de identitate).
Așa îmi place să mă gândesc la X3DH.
Gândiți-vă la cheile de identitate pe termen lung ca $a_0$ și $b_0$.
Părțile pot conveni asupra unei chei $g^{a_0 b_0}$.
De asemenea, trimit imediat următoarele mesaje în clichetul lor asimetric: Alice trimite $g^{a_1}$ iar Bob trimite $g^{b_1}$.
Apoi vor exista acorduri cheie cu clichet care dau $g^{a_1 b_0}$ și $g^{a_0 b_1}$.
X3DH încorporează toate aceste 3 acorduri cheie împreună.
Important, $a_1$ și $b_1$ sunt Pe termen scurt secrete -- unice pentru această sesiune și aruncate după ce clichetul trece de ele.
Dacă o cheie pe termen lung ca $a_0$ se scurge, chiar și primele mesaje din conexiune sunt protejate deoarece părțile au avansat preventiv clichetul cu un pas, încorporând valori proaspete. $a_1, b_1$.
Aceasta este esența X3DH.
Specificația Signal arată puțin diferit față de ceea ce am descris, deoarece unul dintre obiective este acela de a permite părților să stabilească o conexiune asincron.
Așa că am lăsa-o pe Alice (de exemplu) să precalculeze și să posteze $g^{a_1}$ în avans, ca „pre-cheie semnată”.
Când Bob vrea să stabilească o conexiune cu Alice pentru prima dată, el ia $g^{a_1}$ iar apoi îi trimite pe al lui $g^{b_1}$ pentru ea.
Din punctul meu de vedere despre X3DH, $g^{a_1}$ și $g^{b_1}$ au roluri simetrice, dar în Signal rolurile lor nu sunt chiar aceleași -- unul dintre ele a fost precalculat („cheia preliminară semnată” a lui Alice), iar celălalt este calculat în momentul conexiunii („cheia efemeră” a lui Bob).
În specificația semnalului, veți vedea că terminologia diferită rupe ceea ce altfel este o simetrie în protocol.