Ring signature ( anglicky ring signature ) - možnost implementace elektronického podpisu , u kterého je známo, že zprávu podepsal některý z členů seznamu potenciálních podepisujících, ale není to zveřejněno kým. Podepisující samostatně tvoří seznam libovolného počtu různých osob, včetně sebe. K uplatnění podpisu nepotřebuje podepisující svolení, asistenci či asistenci osob zařazených do seznamu – jsou použity pouze veřejné klíče všech členů seznamu a soukromý klíč pouze samotného podepisujícího.
Matematický algoritmus prstenového podpisu vyvinuli Ronald Rivest , Adi Shamir a Yael Tauman a představili jej v roce 2001 na mezinárodní konferenci Asiacrypt [1] . Podle autorů se v názvu snažili zdůraznit absenci centrální nebo koordinační struktury při vytváření takového podpisu: "...prsteny jsou geometrické obrazce s jednotným okrajem a bez středu."
Myšlenka skupinového podpisu pod peticemi nebo stížnostmi, který potvrzuje, že všichni signatáři výzvu podporují, ale neumožňuje identifikovat jejího autora nebo iniciátora, pochází z minulosti. Anglický výraz „ round-robin “ je tedy znám již od 17. století a označuje petici, která byla podepsána v kruhu bez respektování hierarchie, aby se vyhnul trestu pro signatáře jako první [2] - jakási vzájemná záruka . V roce 1898, po obléhání města Santiago de Cuba během španělsko-americké války, vysocí důstojníci 5. armádního sboru podepsali v kruhu dopis adresovaný armádnímu velitelství ve Washingtonu , v němž požadovali, aby byl sbor navrácen Spojeným státům . státy pro léčbu a odpočinek. Dopis se dostal do tisku a stal se široce známým a také způsobil ohlas ve vládě prezidenta McKinleyho [3] .
Vícenásobný podpis se stal elektronickou obdobou papírového podpisu v kruhu. V roce 1991 David Chaum a Eugene Van Heyst navrhli schéma skupinového podpisu [1] , kde podepisovatel je jedním z členů skupiny tvořené administrátorem . Ověřovatel může ověřit, že podepisující osoba je členem skupiny, ale nemůže zjistit kdo. V tomto případě má administrátor možnost identifikovat podepisujícího [4] .
Kruhové podpisy jsou v podstatě podobné skupinovým podpisům, ale na rozdíl od těch druhých neexistuje žádný způsob, jak identifikovat podepisujícího, neexistuje žádný administrátor ani koordinátor. Všichni členové seznamu, s výjimkou samotného podepisujícího, nemusí znát obsah zprávy nebo dokonce skutečnost, že jejich veřejný klíč byl někým použit k vytvoření kruhového podpisu [1] .
Předpokládá se, že existuje určitý seznam, který naznačuje jednoznačný vztah osoby k jejímu veřejnému (veřejnému) klíči (například server kryptografických klíčů ). Na důvodu výskytu veřejného klíče v tomto seznamu nezáleží. Osoba si například mohla vytvořit klíče RSA pouze pro internetové nákupy a nemusí si být vůbec vědoma toho, že její veřejné klíče někdo používá k vytvoření vyzváněcího podpisu na zprávě, kterou nikdy neviděl a nechtěl ji podepsat [1] . Obecný algoritmus kruhového podpisu umožňuje současné použití veřejných klíčů generovaných různými systémy (algoritmy), včetně těch s různou velikostí klíčů i podpisů [1] .
Při vytváření vyzváněcího podpisu pro zprávu m si podepisující podle vlastního uvážení vytvoří seznam veřejných klíčů ( P 1 , P 2 , …, P n ), do kterého uvede i své číslo i (jeho pořadové číslo v na seznamu nezáleží). To vše, spolu s tajným klíčem podepisujícího Si , je přivedeno jako parametry na vstup funkce překrytí podpisu ( m , Si , P1 , … , Pn ), přičemž na výstupu se získá výsledek σ . Každý veřejný klíč ze seznamu má sice svůj jedinečný soukromý klíč a je použit pouze jeden z nich (patřící podepisujícímu), ale z výsledného podpisu nelze poznat, který ze soukromých klíčů byl použit k jeho vytvoření. I při neomezeném počtu prstenových podpisů provedených stejným signatářem neexistuje způsob, jak jej identifikovat nebo alespoň s jistotou prokázat, že některé podpisy byly použity pomocí stejného soukromého klíče [1] .
Pravost prstenového podpisu lze ověřit pomocí σ , ma pouze veřejných klíčů P 1 , …, P n [5] .
Rivest, Shamir a Tauman ve svém článku popsali podpis prstenu jako způsob úniku tajných informací, aniž by ztratili svou důvěryhodnost. Například prstenový podpis „vysokého úředníka Bílého domu “ neprozradí jeho identitu, ale zaručí, že zprávu podepsal někdo z uvedeného seznamu úředníků, čímž se potvrdí úroveň kompetence. Seznam osob pro prstenový podpis lze přitom snadno sestavit převzetím veřejných klíčů z otevřených zdrojů [1] .
Další aplikace, kterou také popsali autoři nápadu, je pro vytváření nejednoznačných (kontroverzních) podpisů . V nejjednodušším případě je pro toto použití vyzváněcí podpis tvořen na základě klíčů odesílatele a příjemce zprávy. Pak je podpis pro příjemce významný, má jistotu, že odesílatel zprávu vytvořil. Pro člověka zvenčí však takový podpis ztrácí na důvěryhodnosti a jednoznačnosti – nebude jistota, kdo přesně zprávu vytvořil a podepsal, protože to může být sám příjemce. Takový podpis nelze například u soudu použít k identifikaci odesílatele [1] .
Později se objevily práce, ve kterých byly navrženy nové oblasti aplikace prstencových podpisů a alternativní algoritmy pro jejich tvorbu [6] [7] .
Na rozdíl od standardního prahového podpisu „t-out-of-n“ , kde t z n uživatelů musí spolupracovat na dešifrování zprávy, tato varianta kruhového podpisu vyžaduje , aby na procesu podepisování spolupracovalo t uživatelů. K tomu musí t účastníků ( i 1 , i 2 , …, i t ) vypočítat podpis σ pro zprávu m zadáním t soukromých a n veřejných klíčů na vstup ( m , S i 1 , S i 2 , … , Si t , P 1 , …, P n ) [8 ] .
Vlastnost konektivity umožňuje určit, zda byly nějaké dva vyzváněcí podpisy vytvořeny stejnou osobou (zda byl použit stejný soukromý klíč), ale bez určení kdo. Jednou z možných aplikací by mohl být offline systém elektronických peněz [9] .
Kromě přidruženého podpisu může být při opětovném použití odhalen veřejný klíč podepisujícího. Takový protokol umožňuje implementaci tajných elektronických hlasovacích systémů , které umožňují anonymní pouze jeden podpis, ale odhalí účastníka, který hlasoval dvakrát [10] .
Systém CryptoNote umožňuje vyzváněcí podpisy [11] . To bylo poprvé použito v červenci 2012 v kryptoměně Bytecoin [12] [13] (neplést s bitcoinem ).
Kryptoměna ShadowCash používá k anonymizaci odesílatele transakce sledovatelný kruhový podpis [14] . Počáteční implementace však byla chybná, což vedlo k částečné deanonymizaci ShadowCash od první implementace až do února 2016 [15] .
Většina navržených algoritmů má asymptotickou výslednou velikost , tj. velikost výsledného podpisu je přímo úměrná počtu použitých veřejných klíčů. Každý použitý veřejný klíč při ukládání nebo ověřování vyzváněcího podpisu vyžaduje pevné množství výpočtů, což je mnohem lepší než analogy dostupné v době vytvoření protokolu [1] . Technologie CryptoNote například implementuje vyzváněcí podpisy v platbách p2p , aby byla zajištěna anonymita odesílatele [10] .
V poslední době se objevily efektivnější algoritmy. Existují schémata se sublineární velikostí signatury [16] , stejně jako s konstantní velikostí [17] .
Podstata algoritmu prstencového podpisu navrženého Rivestem, Shamirem a Taumanem je následující [1] (viz diagram).
Vyzváněcí podpis pro některé zprávy bude vygenerován na základě seznamu veřejných klíčů (v diagramu označených jako ), mezi nimiž má klíč podepisujícího sériové číslo . Veřejné klíče umožňují šifrovat libovolné informace (informační blok , zašifrovaný klíčem , je v diagramu označen jako ). " Informační bloky " dále nejsou součástí ani výsledkem zpracování podepsané zprávy a nemají samostatný význam, jsou generovány náhodnými daty, které se stávají součástí podpisu.
Existuje kombinační funkce libovolného počtu argumentů , jejichž hodnotou a hodnotami všech argumentů, kromě jednoho, lze jednoznačně obnovit jeden chybějící argument. Příkladem takové funkce je sekvenční sčítání: pokud jsou známy celkový součet a všechny členy kromě jednoho, pak lze chybějící člen vypočítat (snížením celkového součtu o hodnotu všech známých členů).
Jako kombinační funkci navrhli autoři algoritmu následující posloupnost akcí: je přijata určitá počáteční hodnota (uvedena v diagramu , je generována náhodně), nad kterou a prvním argumentem je provedeno bitové exkluzivní „nebo“ ( označeno v diagramu symbolem ). Poté je na výsledek aplikována určitá reverzibilní transformace (označená v diagramu jako ), jedna ku jedné spojené s hashovacím součtem podepisované zprávy. Výsledek je bitově XORed s druhým argumentem, převod se použije znovu a tak dále. Jako argumenty se používají odpovídající informační bloky zašifrované veřejnými klíči .
Vybraná náhodná hodnota je jak počáteční, tak i cílová (konečná) hodnota kombinační funkce: výsledek všech transformací musí „objíždět kruh“ a musí se rovnat počáteční hodnotě. Informační bloky pro každý z klíčů, kromě bloku odpovídajícímu vlastnímu klíči podepisujícího, jsou uvedeny jako náhodné hodnoty. Podepisující osoba zašifruje informační bloky odpovídajícími veřejnými klíči. Signatář má nyní cílovou hodnotu kombinační funkce a všechny argumenty kromě jednoho, který odpovídá jeho vlastnímu klíči. Díky vlastnostem kombinační funkce může podepisující zjistit chybějící argument a pomocí vlastního soukromého klíče ( ) tento argument „dešifrovat“ ( ), čímž získá chybějící informační blok .
Součásti hotového prstenového podpisu [1] :
K ověření podpisu potřebujete [1] :
Jako příklad je uvedena implementace základního algoritmu pomocí RSA klíčů v Pythonu .
import os import hashlib import náhodný import Crypto.PublicKey.RSA class Ring : def __init__ ( self , k , L = 1024 ): self . k = k sebe . l = L sebe . n = len ( k ) self . q = 1 << ( L - 1 ) def znak ( self , m , z ): self . permut ( m ) s = [ žádné ] * vlastní . u = náhodný . _ randint ( 0 , self . q ) c = v = self . E ( u ) pro i v ( rozsah ( z + 1 , vlastní . n ) + rozsah ( z )): s [ i ] = náhodný . randint ( 0 , self . q ) e = self . g ( s [ i ], self . k [ i ] . e , self . k [ i ] . n ) v = self . E ( v ^ e ) if ( i + 1 ) % self . n == 0 : c = v s [ z ] = vlastní . g ( v ^ u , self . k [ z ] . d , self . k [ z ] . n ) return [ c ] + s def ověřit ( self , m , X ): self . permut ( m ) def _f ( i ): návrat self . g ( X [ i + 1 ], self . k [ i ] . e , self . k [ i ] . n ) y = mapa ( _f , rozsah ( len ( X ) - 1 )) def _g ( x , i ) : vrátit se . E ( x ^ y [ i ]) r = snížit ( _g , rozsah ( self . n ), X [ 0 ]) vrátit r == X [ 0 ] def permut ( self , m ): self . p = int ( hashlib . sha1 ( ' %s ' % m ) . hexdigest (), 16 ) def E ( self , x ): msg = ' %s%s ' % ( x , self . p ) return int ( hashlib . sha1 ( msg ) . hexdigest (), 16 ) def g ( self , x , e , n ): q , r = divmod ( x , n ) if ( ( q + 1 ) * n ) <= ( ( 1 << self . l ) - 1 ): rslt = q * n + pow ( r , e , n ) else : rslt = x return rsltPodepsání a ověření 2 zpráv pomocí kruhu 4 uživatelů:
size = 4 msg1 = 'ahoj' msg2 = 'svět!' def _rn ( _ ): return Crypto . Veřejný klíč . R.S.A. _ generovat ( 1024 , os . urandom ) klíč = mapa ( _rn , rozsah ( velikost )) r = Prsten ( klíč ) pro i v rozsahu ( velikost ): s1 = r . znaménko ( msg1 , i ) s2 = r . podepsat ( msg2 , i ) tvrdit r . ověřit ( msg1 , s1 ) a r . ověřit ( msg2 , s2 ) a ne r . ověřit ( msg1 , s2 )Slovníky a encyklopedie |
---|