Představte si internet s totálním end-to-end šifrováním. Internet, kde nikdo nezná skutečný obsah dat, a přesto s nimi může pracovat. Tuto bláznivou vizi by mohla uskutečnit homomorfní kryptografie.

Představte si internet s totálním end-to-end šifrováním. Internet, kde nikdo nezná skutečný obsah dat, a přesto s nimi může pracovat. Tuto bláznivou vizi by mohla uskutečnit homomorfní kryptografie.

5
Fotogalerie

Homomorfní kryptografie: Málokdo ji rozumí, ale může vyřešit naši touhu po absolutním soukromí na internetu

  • Představte si internet s totálním end-to-end šifrováním
  • Internet, kde nikdo nezná obsah dat, a přesto s nimi může pracovat
  • Tuto bláznivou vizi by mohla uskutečnit homomorfní kryptografie

Představte si tu situaci. Sedíte ve škole nebo třeba v openspacu vašeho pracoviště a potřebujete Anežce na protější straně místnosti skrze kolegy poslat zprávu na složeném kusu papírku. A byť máte své kolegy rádi, určitě nechcete, aby se každý dozvěděl, co máte na srdci (pro potřeby článku si prosím na chvíli odmyslete, že existuje cosi jako e-mail, SMS, IM).

Zprávu pro Anežku proto před cizími zraky schováte tím nejprostším způsobem: Caesarovou šifrou. Posunete jednotlivá písmena zprávy o předem stanovený počet pozic, který znáte jen vy a Anežka. Když by to byl prostý posun o jedno místo vpřed, tajná depeše, kterou kolegové bez znalosti klíče nerozluští, bude vypadat třeba takto:

Bipk Bofalp, epoft nj qsptjn lwbtojdf

Jelikož Anežka ví, že jsou jednotlivé znaky posunuté o jednu pozici vpřed, skrytý text snadno rozluští a přečte si:

Ahoj Anezko, dones mi prosim kvasnice

Šifrovacím klíčem a funkcí je v tomto případě onen posun o jedno políčko, a protože se zpráva šifruje i dešifruje stejným klíčem, říkáme tomu symetrická kryptografie.

Když budete chtít změnit šifrovací klíč, prostě Anežce odešlete zprávu:

Bofalp, ufe cvefnf qpvajwbu qptvo p ewf qpajdf

Tedy:

Anezko, ted budeme pouzivat posun o dve pozice

(Mimochodem, tuto infantilní šifru si můžete vyzkoušet třeba na stránce dcode.fr)

Ve vašem openspacu ale sedí také zlý Robert, který byl dobrý v matematice, brzy jednoduchou šifru rozlouskne a s ní i občasné zprávičky s novým šifrovacím klíčem.

Současné kryptografii vládnou dva klíče

V praxi proto dnes v mnoha případech používáme asymetrickou kryptografii se dvěma klíči. Jeden slouží pro šifrování zpráv a druhý k dešifrování. Zprávu pro Anežku tedy zašifrujeme pomocí jejího šifrovacího/veřejného klíče, který může být klidně vyvěšený na nástěnce v korporátní kuchyňce, aby si s Anežkou mohl psát i kdokoliv jiný včetně zlého Roberta, nicméně zprávu dešifruje pouze ten, kdo má Anežčin dešifrovací/privátní klíč – ideálně tedy výhradně Anežka. Stejný pár klíčů mají i ostatní a navzájem si vymění pouze své veřejné klíče.

e7ca9987-8e4e-475e-8466-7694d18fca8a
Asymetrická kryptografie se dvěma klíči

Principy asymetrického šifrování jsou dnes základem mnoha zabezpečení nejen na internetu, ale i v dalších oblastech, kde si mezi sebou počítačové programy vyměňují podobné veřejné klíče, aby spolu mohly prohodit nějaký ten bajt šifrované konverzace. Platí to i o všudypřítomném HTTPS, které ve svém nitru používá oba přístupy.

Většinou se nebavíme s Anežkou

Ať už obě strany použijí symetrickou, nebo asymetrickou kryptografii, nezmizí jeden kruciální problém, který jsme sice ještě před pár lety příliš nevnímali, ale jak se postupně stále více a více přesouváme do kyberprostoru, stal se doslova mantrou digitální existence.

Stručně řečeno, dokud budeme komunikovat jen s Anežkou, je vše v pořádku, Anežce totiž plně věříme, a tak s ní můžeme řešit i tak intimní záležitost, jakou je nesporně i doma upečený kváskový chléb.

Na internetech už ale dávno nekomunikujeme jen se všemožnými Anežkami, ale dnes hlavně se servery sociálních sítí, bankami a dalšími institucemi a službami. A všichni tito hráči naše data všemožně zpracovávají, učí se nad nimi jejich umělé inteligence a tak dále.

Banka, která spravuje náš účet, aniž by znala jeho obsah

Kdejaká intimní informace tedy sice cestuje skrze internet šifrovaně – třeba datum vašeho narození –, jenže v cíli ji webová služba pro své účely opět dešifruje a uvidí ji. Co kdyby ji neviděla, a přesto by s ní mohla pracovat?

Anebo si představte bankovní účet, na který vám chodí výplata. Aby bankovní software na serveru mohl připočítat čerstvou výplatu za prosinec, musí znát jak zůstatek, tak novou částku a obě hodnoty sečíst.

Co kdyby ty hodnoty ale vůbec neznal, a přesto by mohl provést tuto základní operaci? Je to vůbec možné? Je! A není to žádná novinka. Matematici a informatici identickou technologii rozvíjejí už desítky let a říkáme ji homomorfní šifrování (homomorphic encryption).  

Homomorfismus a Caesarova šifra

Matematickým základem tohoto šifrovacího algoritmu je tzv. homomorfismus, tedy „zobrazení z jedné algebraické struktury do jiné stejného typu, které zachovává veškerou důležitou strukturu,“ jak se píše na české Wikipedii.

Vraťme se k úvodu a k Caesarově šifře. Představte si, že bychom pomocí ní chtěli skrýt výpočet 1+2=3. Pokud by byl klíčem posun o jednu pozici, druhé straně bychom poslali hodnoty 2 a 3, ta by je dešifrovala na 1 a 2, sečetla by je na hodnotu 3, zašifrovala na 4 a odeslala zpět. Vše by fungovalo, ale druhá strana by se dozvěděla, s jakými hodnotami vlastně provádí výpočet, což přece z důvodu ochrany soukromých dat nechceme.

Matematické operace s homomorfně šifrovanými daty lze připodobnit k boxu, do něhož nevidíme, ale přesto přeskládáme jeho obsah:

Kdybychom implementovali Caesarovou šifru pomocí homomorfní end-to-end kryptografie a aritmetiky, druhé straně opět pošleme zašifrované hodnoty 2 a 3, ta by už neznala dešifrovací klíč, a přesto by dokázala obě zašifrované hodnoty sečíst a výsledek odeslat zpět, kde bychom jej teprve dešifrovali na našem koncovém zařízení.

Pointa spočívá právě v onom homomorfismu, kdy sice pracujeme se zašifrovanými hodnotami a provádíme s nimi aritmetické operace, ty ale přetrvávají i po dešifrování.

Homomorfismus a jablka a hrušky

Ještě jednodušeji, představte si sčítání jablek. 1 jablíčko + 2 jablíčka = 3 jablíčka. Naše jablíčka jsou nezašifrovaná data. Pomocí homomorfní kryptografie data zašifrujeme a uděláme z nich hrušky. Hrušky sice nejsou jablka, můžeme na ně ale přenést stejnou aritmetiku a sečíst je: 1 hruška + 2 hrušky = 3 hrušky. Když nyní dešifrujeme 3 hrušky pomocí našeho dešifrovacího klíče, získáme 3 jablíčka.

Druhá strana sčítala hrušky a neměla nejmenší páru o tom, že ve skutečnosti sčítala jablíčka. No, a teď si představte, že takto nebudeme sčítat jablíčka a hrušky, ale jakékoliv zašifrované bajty.

Z homomorfního šifrování se pomalu stává praktická technologie

Skutečná realizace je poněkud složitější a stojí za ní matematika mnohem, opravdu mnohem vyšší než bezmála dvoumetrový autor tohoto článku, takže zájemce o pochopení tajů pod pokličkou přesměruji na Matematicko-fyzikální fakultu Univerzity Karlovy, nicméně podstatné je to, že to po desetiletích teoretického zkoumání pomalu začíná fungovat i v praxi.

96c402d3-b7d6-4921-92d3-ba0cab21558b
Rozvoj homomorfního šifrování podle jeho velkého zastánce IBM

To znamená, že pomalu přibývají další a další operace, které můžete aplikovat na svět hrušek, aby to odpovídalo i světu jablek a zároveň k tomu nepotřebujete superpočítač. A proto se o homomorfní kryptografii začínají zajímat i velké ryby, objevují se nové a nové knihovny, které veškerou vyšší matematiku skryjí, no a nad nimi rostou i první pokusy o komercializaci nové úrovně šifrování i pro koncovou podnikovou sféru. A to i s vědomím, že se jedná o kryptografickou techniku, kterou při korektní implementaci nerozlousknou ani kvantové počítače budoucnosti.

IBM a homomorfní účty brazilské banky

Jednou z vlaštovek je třeba IBM, které se loni pochlubilo experimentem, kdy nad účetními daty klientů jisté partnerské banky z Brazílie postavilo neuronovou síť, která prošla celou databázi a začala predikovat nejrůznější situace. Třeba bonitu klientů.

Kouzlo spočívalo v tom, že se neuronová síť neučila nad skutečnými daty, ale učila se nad daty zašifrovanými pomocí homomorfní kryptografie, takže nedošlo ani k žádnému porušení soukromí, GDPR aj. A teď si představte, že by stejnou techniku end-to-end šifrování používala banka pro všechny své procesy.

9b76c975-f44d-4026-ab25-d02d9cd9807d
Hypotetický Luboš se stydí koupit prémiový Pornhub. Ale nemusel by

Hypotetický pan Luboš, dlouholetý klient banky, by se tedy vůbec nemusel obávat toho, že se jakýsi analytický program v historii jeho transakcí dočte, že si předplatil třeba prémiový Pornhub. Vše bude dále fungovat, software banky bude moci s účtem provádět všechny obvyklé operace, ale nebude znát exaktní hodnotu toho, s čím vlastně pracuje.

Kdyby byl pomocí homomorfní kryptografie skryt jak nákup předplatného, tak i samotné streamování videa, o tomto malém tajemství pana Luboše se nedozví ani jeden z účastníků celého procesu počínaje bankou a konče Pornhubem. A přesto to bude celé fungovat a Luboš i ve výpisu banky objeví, za co utrácí. Ale jen Luboš. Pro všechny ostatní včetně serverů banky to bude jen binární šum. Nicméně šum, se kterým může provádět obvyklé aritmetické operace.

Další příklad: Ruská aplikace, která dělá veselá intimní selfíčka

Podobným způsobem chce jako přidanou hodnotu nabízet homomorfní kryptografii (Homomorphic Encryption Services) už zmíněné IBM a přináší celou plejádu dalších možných scénářů (PDF) právě pro případy, kdy k citlivým datům musí přistupovat i nějaká třetí osoba, provádět nad nimi matematické operace, které budou fungovat, a přesto se nikdy nedozví, co je jejich skutečným obsahem.

K čemu je to vlastně dobré podle IBM:

Představte si například hypotetickou mobilní aplikaci, která na výkonném superpočítači upravuje intimní selfíčka. Aplikace se jmenuje Большая Задница, což zní dostatečně podezřele, vy ale přesto chcete vyzkoušet, co dovede.

Naštěstí se píše rok 2035 a váš telefon s Androidem 37 nebo iOS 65.4 z důvodu ochrany osobních údajů předává aplikacím třetích stran snímky z fotoaparátu výhradně v homomorfně šifrované podobě.

Na čeljabinský server proto nedorazí vaše nebohá tělesná schránka v čitelném jpegu, který by rozesmál jak Borise Ivanoviče, tak Jekatěrinu Vladislavovnu, ale v zašifrovaném binárním šumu. Ten sice díky silnému klíči ani jeden z nich nikdy nerozluští, mohou s ním ale provádět stejné aritmetické operace, jako by to byly skutečné obrazové pixely.

Vzdálený server zašifrovanou fotku transformuje, odešle zpět, výsledek pomocí soukromého klíče rozluští váš telefon a… A na displeji se konečně zobrazí vaše nebohé hanbaté selfie s dopočítaným legračním knírem.

Jedna z možných cest bezpečnosti zítřka

Vaše důstojnost zůstala nedotčena, vaše skutečná fotografie v rouše Evině či Adama se nikam nedostala, a přesto to celé mohlo fungovat. Dnes to ještě není možné, homomorfní algoritmy jsou i nadále experimentální, aritmeticky omezené a nepříliš výkonné, IBM, Microsoft a mnozí další jim ale věří.

Ostatně, není to tak dávno, co jsme i do HTTPS schovávali jen přihlašovací a podobné citlivé údaje, přičemž zbytek World Wide Webu běžel v otevřené podobě, protože by se jinak s trochou nadsázky zavařily všechny servery i slabé klientské počítače. Jenže uběhlo pár let a vše se změnilo. Pro dnešní výkonný hardware to už není žádný problém a z HTTPS se stala univerzální samozřejmost.

Pojďme si naprogramovat homomorfní banku

Na úplný závěr se pojďme ve vší stručnosti podívat na drobnou ukázku v Pythonu, ve které si zahrajeme na futuristickou homomorfně šifrovanou banku. Použijeme k tomu knihovnu SEAL-Python z GitHubu, která je pythonní implementací základní knihovny Microsoft SEALSimple Encrypted Arithmetic Library.

Knihovna umožňuje asymetrické šifrování pomocí páru klíčů a nad šifrovanými daty umí provádět několik základních matematických operací, které se promítnou i do nešifrovaných dat. My si vyzkoušíme připočítání nové částky na šifrovaný účet fiktivní banky.

Nejprve koukněte na kód, pod kterým najdete detailní popis včetně snímků obrazovky, co se v něm vlastně děje:

from seal import *

print("================================================================")
print("   SEAL-Python (Microsoft Simple Encrypted Arithmetic Library)  ")
print("  Příklad matematických operací s homomorfně zašifrovanými daty ")
print("      Fiktivní bankovní účet, který neví, jaký je zůstatek,     ")
print("            a přesto připočítá novou platbu 2000 Kč,            ")
print("                 kterou ale vlastně také nezná                  ")
print("================================================================")
print("")

# Konfigurace homomorfního algoritmu BFV
parametry = EncryptionParameters(scheme_type.BFV)
parametry.set_poly_modulus_degree(4096)
parametry.set_coeff_modulus(CoeffModulus.BFVDefault(4096))
parametry.set_plain_modulus(256)
kontext = SEALContext.Create(parametry)

# Na základě úvodní konfigurace vytvořím veřejný/šifrovací klíč
# a soukromý/dešifrovací klíč 
generator_klicu = KeyGenerator(kontext)
verejny_klic = generator_klicu.public_key()
soukromy_klic = generator_klicu.secret_key()

# Na základě úvodní konfigurace vytvořím šifrovač, dešifrovač a počítač
# Počítač bude s šifrovanými daty provádět podporované aritmetické operace
sifrovac = Encryptor(kontext, verejny_klic)
desifrovac = Decryptor(kontext, soukromy_klic)
pocitac = Evaluator(kontext)

# Výchozí stav účtu v čitelné podobě
stav_uctu = 5

# Vypsání výchozího nešifrovaného stavu na obrazovku
print("VÝCHOZÍ STAV:")
print(f"\tPan Čížek má na účtu {stav_uctu} tisíc korun")

# Teď výchozí stav účtu zašifrujeme pomocí veřejného klíče
# a zašifrovanou hodnotu uložíme do nové proměnné
print("")
print("OD TÉTO CHVÍLE JE STAV ÚČTU HOMOMORFNĚ ŠIFROVANÝ:")
stav_uctu = Plaintext(str(stav_uctu))
zasifrovany_stav_uctu = Ciphertext()
sifrovac.encrypt(stav_uctu, zasifrovany_stav_uctu)

# Teď zkusíme k zašifrované hodnotě připočítat nějakou další hodnotu
# Na účet například míří 2 tisíce korun, a tak je opět zašifrujeme a pomocí
# homomorfního počítače a jeho metody add_inplace přičteme k zůstatku.
# Ještě jednou, v tuto chvíli už vlastně nemusíme vůbec vědět,
# co přesně sčítáme. Artimeticky to ale funguje.
print("\tNa účet pana Čížka míří 2 000 korun!")
print("\tZašifruji 2 000 korun a připočítám k zašifrovanému stavu účtu\n\tBanka v tuto chvíli už neví, co vlastně sčítá")
prichozi_platba = 2
prichozi_platba = Plaintext(str(prichozi_platba))
zasifrovana_prichozi_platba = Ciphertext()
sifrovac.encrypt(prichozi_platba, zasifrovana_prichozi_platba)
pocitac.add_inplace(zasifrovany_stav_uctu, zasifrovana_prichozi_platba)

# Na závěr zkusíme dešifrovat hodnotu zasifrovany_stav_uctu zpět do čitelné podoby
# a vypíšeme ji na displej. Kdybychom byli opravdová banka, dojde k tomu až na straně klienta.
# Třeba v mobilní aplikaci, webovém prohlížeči aj. Sečetli jsme hrušky a promítne se to i do součtu jablek,
# takže po dešifrování se na displeji zobrazí, že máme na účtu opravdu 7 tisíc korun.
print("")
print("OD TÉTO CHVÍLE JE STAV ÚČTU DEŠIFROVANÝ:")
desifrovany_stav_uctu = Plaintext()
desifrovac.decrypt(zasifrovany_stav_uctu, desifrovany_stav_uctu)
print(f"\tPan Čížek má na účtu {desifrovany_stav_uctu.to_string()} tisíc korun")

Nejprve stanovíme výchozí stav účtu v nešifrované podobě na hodnotu 5 (5 tisíc korun – pro jednoduchost pracujeme s nízkými čísly). Hodnotu pak pomocí veřejného klíče zašifrujeme, a právě tuto hodnotu může držet banka. Banka ví, že něco drží, ale nezná přesný obsah, jako by se jednalo o běžné end-to-end šifrování.

V dalším kroku budeme simulovat příchozí platbu 2 000 korun (pracujeme s celými tisíci, takže se jedná o hodnotu 2). Hodnotu 2 opět zašifrujeme a řekneme naší bance, ať ji připočítá. Pomocí metody pro homomorfní součet add_inplace knihovny SEAL se to skutečně provede.

7c6cc49a-a97d-4aef-95e4-7cbae06386ef
Celý průběh našeho programu v Pythonu, který sečetl dvě homoformně zašifrované hodnoty a dešifrovaný výsledek tomu skutečně odpovídá.

Sečetli jsme tedy hrušky a zároveň i jablka. Toto běžné metody end-to-end šifrování neumějí. Banka jen ví, že součet proběhl v pořádku, ale nemá páru, co se vlastně sečetlo a jaký je výsledek. Aritmetika ale funguje.

Na úplný závěr zkusíme stav účtu dešifrovat, abychom ověřili, že je nyní roven hodnotě 7 (5+2). K dešifrování by u skutečné banky a díky end-to-end šifrování došlo až na koncovém zařízení, tedy třeba v naší mobilní aplikaci.

Jak ukazují snímky terminálu, opravdu to fungovalo! Jestli by mohla homomorfní kryptografie fungovat i v univerzální podobě na internetu a při jakékoliv výměně digitálních dat, ukáže až čas a další vývoj. Nakonec totiž může zajímavá technologie zapadnout jako mnohé před ní. Pokud však ve společnosti neustále roste hlad po soukromí a anonymitě na internetu při zachování jeho současné funkce, toto je jedna z možných cest.

Určitě si přečtěte

Články odjinud