Ištisinis šifravimas, paaiškinta tikrai
Ką teikėjai sako, kai mini E2EE, ir ko jie nesako. Didaktinis mechanizmo ir jo ribų paaiškinimas be reklaminio apvalkalo.
Ką šifravimas reiškia iš tikrųjų
Užšifruoti pranešimą reiškia paversti jį tuo, kas atrodo kaip triukšmas bet kam, kas neturi tam tikros informacijos, vadinamos raktu. Operacija atliekama siuntėjo įrenginyje, o su teisingu raktu ji atšaukiama gavėjo įrenginyje. Per vidurį pranešimas keliauja kaip baitų seka be akivaizdžios prasmės. Tai paprasta idėja. Likusi straipsnio dalis skirta niuansams, kurie, priklausomai nuo atvejo, paverčia tai tikra garantija arba rinkodaros etikete.
Būdvardis nuo galo iki galo (angl. end-to-end, trumpinys E2EE) prideda patikslinimą. Šifravimas atliekamas ne tam, kad tarpinis serveris galėtų jį perskaityti ir pristatyti. Jis atliekamas taip, kad tik du galai – siunčiantis įrenginys ir gaunantis įrenginys – turėtų raktą. Bet koks serveris, per kurį praeina žinutė, mato triukšmą, o ne turinį. Tai techninis skirtumas lyginant su šifravimu tranzitu (angl. in-transit), kai turinys keliauja užšifruotas nuo vieno serverio prie kito, bet kiekvienas serveris, per kurį jis praeina, jį iššifruoja, kad persiųstų toliau, laikinai atkurdamas atvirą tekstą.
Bendros paslapties paradoksas
Yra akivaizdi problema. Kad du žmonės galėtų tarpusavyje šifruoti ir iššifruoti pranešimus, abiems reikia to paties rakto. Tačiau kaip jie susitaria dėl šio rakto, jei viskas, ką jie siunčia vienas kitam, pagal apibrėžimą eina per kanalą, kuriame kažkas gali klausytis? Susitarti dėl rakto tame pačiame kanale, kuriame jie vėliau jį naudos, atrodo neįmanoma: jei užpuolikas jį išgirs susitarimo metu, jis galės iššifruoti viską, kas bus vėliau. Dešimtmečius klasikinė kriptografija tai sprendė sunkiuoju būdu: raktai buvo perduodami asmeniškai prieš pradedant naudoti fizinių susitikimų metu. Ambasadoriai nešiojosi lagaminėlius su raktais, įsiūtais į palto pamušalą.
Šiuolaikiniame el. pašte šis sprendimas nėra mastelis. Jei turėtume fiziškai eiti į namus kiekvienam asmeniui, su kuriuo ketiname bendrauti užšifruotai, nespėtume su niekuo pasikalbėti. Klausimas, kurį kriptografijos bendruomenė iškėlė prieš penkiasdešimt metų, buvo toks: ar įmanoma, kad du žmonės, kurie nepažįsta vienas kito ir kurie dalijasi tik viešu kanalu, tame pačiame viešame kanale susitartų dėl paslapties, kurios niekas, klausantis kanalo, negalėtų žinoti?
Diffie-Hellman elegancija
1976 m. du matematikai, vardu Whitfield Diffie ir Martin Hellman, įrodė kažką, kas atrodė neįmanoma: kad du žmonės, kalbėdami tik per viešą kanalą — kanalą, kuriame bet kas gali girdėti viską, ką jie sako — gali susitarti dėl slapto slaptažodžio be jokio klausytojo galimybės jį atrasti. Tai skamba kaip magija. Tai nėra magija: tai matematika. Diffie-Hellman apsikeitimas raktais, kaip jis žinomas nuo tada, yra praktiškai viso užšifruoto interneto ryšio pagrindas, o pusė amžiaus intensyvaus naudojimo ir pasaulinio akademinio tikrinimo patvirtina jo tvirtumą. Kas nori pamatyti vizualinę intuiciją ar matematiką, gali skaityti toliau. Kas nori pasitikėti, kad tai veikia, taip pat gali tęsti neprarasdamas straipsnio gijos.
Tiems, kurie nori tai įsivaizduoti paveikslėlyje, yra žinoma analogija su spalvomis. Įsivaizduokite, kad Alisa ir Brunas viešai susitaria dėl pagrindinės spalvos — sakykime, geltonos — matant Evai, kuri jų klausosi. Kiekvienas privačiai pasirenka antrą slaptą spalvą ir sumaišo savo paslaptį su geltona. Alisa gauna tam tikrą oranžinę spalvą; Brunas gauna tam tikrą žalią spalvą. Jie apsikeičia rezultatais matant Evai. Dabar kiekvienas sumaišo gautą spalvą su savo paslaptimi, ir abu gauna tą pačią galutinę spalvą, nes maišymo eiliškumas nėra svarbus. Eva matė geltoną spalvą ir du tarpinius mišinius, bet ne paslaptis; be kurios nors iš paslapčių ji negali gauti galutinės spalvos. Tikroji matematika spalvas pakeičia kėlimu laipsniu modulinėse grupėse arba elipsinėse kreivėse, tačiau idėja yra ta pati: bendra paslaptis sukuriama viešai be niekieno galimybės kanale jos rekonstruoti.
Nuo Diffie-Hellman iki Signal protokolo
Ištisinis šifravimas, kurį šiandien naudoja profesionalios pranešimų programėlės, beveik be išimčių remiasi elegantiška ir sutvirtinta Diffie-Hellman apsikeitimo versija. Signal protokolas, kurį 2013–2016 m. sukūrė Trevor Perrin ir Moxie Marlinspike, yra etalonas. Jis sujungia dvi pagrindines idėjas. Pirmoji — apsikeitimas raktais elipsinėse kreivėse (X25519), kuris sukuria pradinę bendrą paslaptį tarp dviejų įrenginių. Antroji — vadinamasis Double Ratchet — dvigubas krumpliastiebis — kuris automatiškai atnaujina raktus su kiekvienu pranešimu, todėl įrenginio kompromitavimas šiandien neleidžia iššifruoti praeities pranešimų, nei būsimų pranešimų, kai krumpliastiebis pasisuko.
Zig kalba X25519 apsikeitimas, sukuriantis bendrą paslaptį tarp dviejų įrenginių, telpa į šešias eilutes, naudojant standartinę biblioteką:
const std = @import("std");
const X25519 = std.crypto.dh.X25519;
// Alicia y Bruno generan cada uno un par (privada, pública).
const par_alicia = X25519.KeyPair.generate(io);
const par_bruno = X25519.KeyPair.generate(io);
// Cada parte recibe la clave pública de la otra y deriva el mismo secreto.
const secreto_alicia = X25519.scalarmult(par_alicia.secret_key, par_bruno.public_key) catch unreachable;
const secreto_bruno = X25519.scalarmult(par_bruno.secret_key, par_alicia.public_key) catch unreachable;
// secreto_alicia == secreto_bruno (32 bytes)
O kas tiksliai yra std.crypto.dh.X25519 viduje? Jokios paslėptos magijos. Tai dvi trumpos funkcijos, kurias visas galima perskaityti pačioje „Zig“ standartinėje bibliotekoje. Pirmoji išveda viešąjį raktą iš privataus — mainų «gᵃ»:
pub fn recoverPublicKey(secret_key: [secret_length]u8) IdentityElementError![public_length]u8 {
const q = try Curve.basePoint.clampedMul(secret_key);
return q.toBytes();
}
Straipsnio kalba: privatus raktas «padauginamas» — elipsine, ne elementaria aritmetine prasme — iš „Curve25519“ kreivės bazinio taško, o rezultatas serializuojamas į trisdešimt du baitus. clampedMul operacija yra sustiprinta tokios skaliarinės daugybos versija: ji apima apsaugos priemones, kurias kriptografijos bendruomenė pridėjo per daugelį metų, kad atsispirtų žinomoms atakų šeimoms. Dvi funkcijos kūno eilutės.
Antroji funkcija sujungia jūsų privatų raktą su viešuoju raktu, kurį jums siunčia kita šalis. Tai yra mainų «(gᵇ)ᵃ», kuris sukuria trisdešimt dviejų baitų bendrą paslaptį, kurios nė vienas iš jūsų niekada neperdavė:
pub fn scalarmult(secret_key: [secret_length]u8, public_key: [public_length]u8) IdentityElementError![shared_length]u8 {
const q = try Curve.fromBytes(public_key).clampedMul(secret_key);
return q.toBytes();
}
Dar dvi eilutės. Gautas viešasis raktas interpretuojamas kaip taškas kreivėje ir «padauginamas» iš savo asmeninio privataus rakto. Dėl kreivės operacijos komutatyvumo — analogiško eksponentų daugybos komutatyvumui, kurį matėme skaitiniame pavyzdyje — abi šalys gauna tą patį serializuotą tašką: būtent bendrą paslaptį, apie kurią kalbama straipsnyje.
Ką saugo ištisinis šifravimas
Tai, ką E2EE gerai saugo, darant prielaidą, kad įgyvendinimas teisingas, yra pranešimo turinys tranzito metu. Tarpinis serveris, kuris gauna ir persiunčia užšifruotus duomenis, matys nesuprantamų baitų seką. Užpuolikas, turintis prieigą prie kabelio, maršrutizatoriaus ar wifi prieigos taško, matys tą patį. Paslaugų teikėjas, saugantis srauto kopijas, negalės jų perskaityti vėliau. Vyriausybė, nurodžiusi paslaugos operatoriui pateikti turinį, gaus tuos pačius nesuprantamus baitus, kuriuos serveris turėjo iš pradžių.
Tai praktine prasme yra labai daug. Tai skirtumas tarp laiško rašymo nepermatomame voke ir jo rašymo atviruke. Abu pasiekia tikslą. Tik vienas išsaugo turinį nuo paštininko.
Ko nesaugo ištisinis šifravimas
Verta tai žinoti taip pat gerai. E2EE nesaugo metaduomenų: serveris vis tiek žino, kad vartotojas A siunčia duomenis vartotojui B, kurią valandą, kokiu dažnumu ir iš kur, nors ir nežino, ką jis sako. Šie metaduomenys, kaip jau teigėme straipsnyje Šifruoti nereiškia būti privačiam, dažnai yra iškalbingesni už turinį. Žinojimas, kad kažkas penktadienį 22:00 valandą trisdešimt minučių skambino į skyrybų advokatų kontorą, pasakoja istoriją, kurios skambučio turinys niekada nepapasakojo. Tai ta pati situacija, kaip matyti asmenį kelis kartus užeinantį ir išeinantį iš onkologijos klinikos: nereikia girdėti nieko, apie ką kalbama viduje, kad įsivaizduotum, kas vyksta. Vienas atskiras metaduomuo gali nieko nereiškia; keli tarpusavyje susieti nupiešia kažką per daug panašaus į tiesą. E2EE nesaugo galinių taškų: jei gavėjo įrenginys yra kompromituotas kenkėjiškos programos, pranešimas tam gavėjui iššifruojamas įprastai ir kenkėjiška programa jį perskaito. E2EE nesaugo nuo paties pašnekovo tapatybės: jei Alisa tiki kalbanti su Brunu, bet užpuolikas įsiterpė pradžioje (man in the middle) ir protokolas neapima nepriklausomo patikrinimo, abi šalys baigia kalbėti su įsibrovėliu galvodamos, kad kalbasi tarpusavyje.
Yra ketvirtas dalykas, kurį verta suformuluoti be dviprasmiškumo. E2EE netrukdo teikėjui, teigiančiam, kad jį siūlo, papildomai saugoti neužšifruoto pranešimo kopiją savo sistemose. Teiginys „mano pranešimai yra užšifruoti ištisiniu būdu“ ir teiginys „teikėjas nesaugo mano turinio“ nėra tie patys. Programėlė gali vykdyti pirmąjį, pažeisdama antrąjį; tai matėme spaudos antraštėse ne kartą nuo 2018 m. Vartotojas, nebent kliento kodas būtų patikrinamas, neturi techninio būdo atskirti vieną atvejį nuo kito be ekspertinio tyrimo. Žinomiausias atvejis plačiajai visuomenei: WhatsApp užšifruoja pranešimus ištisiniu būdu tranzito metu, tačiau jei vartotojas aktyvuoja atsarginę kopiją iCloud arba Google Drive be papildomo šifravimo, ši kopija saugoma nuskaitoma trečiosios šalies infrastruktūroje, o šifravimas pažeidžiamas paties vartotojo gale.
Klausimas, kurio operatorius nenori girdėti
Programėlė, teigianti, kad šifruoja ištisiniu būdu, techniškai gali daryti vieną iš trijų dalykų, susijusių su raktais:
- Raktai yra tik įrenginiuose. Jie generuojami ir yra išskirtinai vartotojų įrenginiuose; operatorius jų nežino ir nesaugo. Tai optimalus atvejis.
- Operatorius gali pasiekti, jei nori. Operatorius turi vartotojų raktus (arba gali juos sugeneruoti savo nuožiūra) ir saugo juos savo duomenų bazėse. Jei jis nori arba yra priverstas, gali perskaityti turinį. Taip yra daugumos „debesų“ paslaugų atveju.
- Operatorius negali pasiekti pagal projektą, bet kontroliuoja prieigą. Operatorius neturi raktų, bet kontroliuoja programėlę, kuri juos generuoja. Jei jis priverčiamas, gali išsiųsti kenkėjišką atnaujinimą, kuris užfiksuotų raktus arba turinį prieš šifravimą. Taip yra daugelio komercinių E2EE paslaugų atveju.
Operatyvinis klausimas profesionalui yra tai, kur yra saugomi raktai, kas juos kontroliuoja ir kas nutiktų, jei rytoj operatorius gautų teismo nurodymą iššifruoti mano pokalbius, – o ne tai, ar teikėjas tvirtina šifruojantis nuo galo iki galo. Šie trys atsakymai į tą patį klausimą yra visiškai skirtingi, nors visos trys programėlės savo reklamose prisistato su ta pačia etikete.
Vokas ir antrasis raktas
Nepermatomas vokas išsprendžia laiškininko problemą: niekas, perėmęs jį pakeliui, negali perskaityti, kas jame yra. Jis neišsprendžia kitos problemos: kas dar saugo rakto kopiją ir kokiu diskretišku pavadinimu – paskyros atkūrimas, atsarginė kopija, įrenginių sinchronizavimas – ta kopija yra išsaugoma. Trys aukščiau aprašytos architektūros naudoja tą patį voką ir savo reklamose žada tą patį; tai, ką jie daro su antruoju raktu, yra būtent tai, ko etiketė nesako.
Uždarytas vokas, kurio rakto kopija laikoma kitame stalčiuje, praktiškai yra atviras vokas.
Ištisinis šifravimas, jei jis atliktas teisingai, yra viena iš subtiliausių konstrukcijų, kurias šiuolaikinė kriptografija suteikė kasdienei praktikai. Originali idėja — kad du asmenys gali susitarti dėl paslapties viešame kanale — priklauso Whitfield Diffie ir Martin Hellman, 1976 m.; po pusės amžiaus mes vis dar gyvename jos pasekmėmis. Tačiau, kaip ir bet kurio techninio pažado atveju, jo vertė priklauso nuo realaus įgyvendinimo, o ne nuo etiketės. Sąžiningo profesionalo klausimas yra ne „ar tai užšifruota?“, o „kas turi raktus?“. Atsakymai turi skirtingas pasekmes. Verta jas žinoti.
Šaltiniai ir papildomas skaitymas
- Diffie, W.; Hellman, M. — New Directions in Cryptography, IEEE Transactions on Information Theory, 1976 m. lapkritis. Pagrindinis viešojo rakto kriptografijos straipsnis.
- Perrin, T.; Marlinspike, M. — The Double Ratchet Algorithm, vieša „Open Whisper Systems“ specifikacija, 2016 m. peržiūra. „Signal“ protokolo ir jo pramoninių darinių pagrindas.
- RFC 7748 — Elliptic Curves for Security (IETF, 2016 m. sausis). X25519 ir X448 kreivių, naudojamų šiuolaikiniuose raktų mainuose, normatyvinė specifikacija.
- Ferguson, N.; Schneier, B.; Kohno, T. — Cryptography Engineering: Design Principles and Practical Applications („Wiley“, 2010). Skyriai apie raktų mainus ir autentifikuoto šifravimo protokolus.
- Reglamentas (ES) 2024/1183 dėl Europos skaitmeninės tapatybės sistemos (eIDAS 2) — sukuria pagrindus, kur nepriklausomas pašnekovo patvirtinimas įgauna institucinį palaikymą, ir kur skirtumas tarp nominalaus ir tikro šifravimo turi skirtingas teisines pasekmes.