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 ištisinis — angliškai end-to-end, sutrumpintai E2EE — suteikia tikslumo. Šifravimas neatliekamas tam, kad tarpinis serveris galėtų jį perskaityti ir pristatyti. Jis atliekamas tam, kad tik du galai — siuntėjo įrenginys ir gavėjo įrenginys — turėtų raktą. Bet kuris serveris, per kurį pranešimas praeina, mato triukšmą, o ne pranešimą. Tai techninis skirtumas nuo šifravimo tranzitu, kai turinys keliauja užšifruotas iš vieno serverio į kitą, tačiau kiekvienas serveris, per kurį jis praeina, jį iššifruoja, kad galėtų persiųsti, 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.
Todėl operatyvinis klausimas yra ne tai, ar kažkas užšifruota, o kas kontroliuoja įrenginį ir programinę įrangą, kuri valdo raktus. „Solo2“ raktai saugomi tik jūsų Saugykloje (jūsų slaptažodžiu užšifruota „IndexedDB“), o programinė įranga yra patikrinamas atvirasis kodas.
Profesionaliam skaitytojui
Ištisinis šifravimas yra skaitmeninio suvereniteto įrankis. Tačiau kaip ir kiekvienas įrankis, jo efektyvumas priklauso nuo rankos, kuri jį laiko, ir pagrindo, ant kurio jis remiasi.
- Kur generuojami kriptografiniai raktai ir kur jie fiziškai yra? Jei operatorius gali prie jų prieiti (net laikinai, net po atkūrimo priedanga), E2EE yra tik nominalus.
- Ar yra nepriklausomas pašnekovo patvirtinimas (saugumo numeriai, QR kodai, palyginimas už kanalo ribų), užkertantis kelią „man-in-the-middle“ atakai užmezgant pokalbį?
- Ar kliento kodas yra audituojamas — atviras, paskelbtas, atkuriamas — ar reikia pasikliauti paslaugų teikėjo žodžiu apie tai, ką klientas iš tikrųjų daro?
- Kuriuos metaduomenis paslauga generuoja ir saugo, ir kiek laiko? Net jei turinys nepermatomas, metaduomenys gali atkurti didelę dalį neskelbtinos informacijos.
Šie keturi klausimai neprašo sudėtingos techninės informacijos; jie prašo informacijos, į kurią bet kuris sąžiningas operatorius gali atsakyti savo viešojoje dokumentacijoje. Atsakymo kokybė ir tikslumas pasako apie produktą tiek pat, kiek ir pats atsakymas.
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.