Podpis kroužek (v angličtině : Ring Signature ), také volal kruh podpis je šifrovací metoda, která umožňuje osoba, která má podepsat elektronicky anonymní zprávy nebo dokumentu jménem „kruhu“. Členy tohoto kruhu vybírá autor podpisu a nemusí být nutně informováni o jejich zapojení do vytváření elektronického podpisu . Jediným omezením je, že všichni musí mít veřejný kryptografický klíč.
Z podpisu kruhu vznikla derivace: prahový podpis kruhu , kde je podpis iniciován předdefinovaným počtem členů kruhu.
Jak naznačuje název článku, kde je poprvé popsán, Jak uniknout tajemství , primárním účelem tohoto podpisu je umožnit únik informací .
V tomto článku je uveden příklad člena ministerského kabinetu, který chce novinářovi poskytnout informace o předsedovi vlády. Zjevně nechce prozradit svou identitu, ale chce, aby novinář věděl, že únik pochází z kabinetu, a nikoli od žolíka. Podpis kruhu mu tak umožňuje podepisovat jako člen ministerského kabinetu, a nikoli jako jednotlivec, aniž by si toho byli vědomi jeho kolegové nebo kdokoli ho mohl vystopovat, na rozdíl od skupinového podpisu, který ukládá spolupráci členů zahrnutých do podpis a možnost osoby určené při inicializaci znát totožnost podepsaného.
Další použití navržené v tomto článku spočívá v tom, že umožňuje generovat podpis, který bude mít hodnotu pouze pro příjemce. Zdroj tedy odešle dokument podepsaný pomocí kruhového podpisu, který obsahuje jeho klíč a klíč příjemce. Ten, který věděl, že jej nepředložil, má tedy důkaz, že zpráva skutečně pochází ze zdroje. Pokud však dokument předloží třetí straně, nemůže si být jistá, že zpráva není falešná a vytvořená příjemcem.
Kruhový podpis je definován jako data čtyř algoritmů, z nichž některé jsou podobné digitálním podpisům : ( Init , Gen , Sign , Verify ). Fungují následovně:
Tyto algoritmy jdou ruku v ruce s přidruženými pojmy zabezpečení, kterými jsou korekce podpisu , která určuje, že pokud je podpis poctivě generován, bude vždy přijat. Non-falsifiability , což vyžaduje, aniž by soukromý klíč spojený s jedním z prvků množiny R , je možné navrhnout platný podpis a anonymitu , která říká, že je nemožné spojit podpis její signatáře.
V této části je uveden popis schématu navrženého Rivestem, Shamirem a Taumanem .
V tomto diagramu uživatel generuje podpis σ pro zprávu M, která má být podepsána, hazard v, jeho pár soukromých / veřejných klíčů a veřejné klíče ostatních členů kruhu R = ( pk i ) i ∈ [1; n] . Kromě toho toto schéma závisí na schématu šifrování ( Enc , Dec ).
Uživatelé tak mohou ověřit tento podpis pomocí σ, M , v a všech veřejných klíčů zapojených do procesu vytváření.
Podepisovatel vygeneruje hash σ zprávy M a poté zvolí nonce v 0 . Pro každý veřejný klíč pk i ∈ R jiný než jeho vlastní si signatář náhodně vybere hodnotu x i , šifru s veřejným klíčem pk i a provede exkluzivní disjunkci výsledku s hodnotou v před použitím symetrické permutace E σ na výsledek, který dá novou hodnotu „ v i “.
Který iterativně dává: v i : = E σ ( Enc pk i ( x i ) ⊕ v i-1 )
Manipulace se znovu zahájí s ostatními veřejnými klíči.
Na konci skončíme s hodnotou v = v n . Poté hledáme hodnotu y, která, vložená nebo exkluzivní s v nalezeným a permutovaným s E σ , umožňuje najít v 0 . Jinými slovy v 0 = E σ ( y ⊕ v ). Nakonec použijeme soukromý klíč k nalezení předchůdce y šifrováním, to znamená x = Dec sk ( y ).
Nakonec bude vrácený podpis Σ = (v, (x i ) i )
Příjemce provede nové výpočty v i = E σ (f (x i ) ⊕ v i + 1 ) pro všechny veřejné klíče podpisu a zkontroluje, zda na konci najde původní v.
Velikost podpisu je lineární v N, což odpovídá velikosti kruhu, protože je nutné určit nebezpečí x i použitá každým účastníkem.
Níže je ukázka konceptu implementovaného v Pythonu nebo Pythonu3 z původního článku, používajícího RSA jako asymetrický kryptosystém. Kruh obsahuje čtyři členy.
Kódováno import os, hashlib, random, functools, Crypto.PublicKey.RSA class ring: def __init__(self, k, l=2048): self.k, self.l, self.n, self.q = k, l, len(k), 1 << l - 1 def sign(self, m, z): self.permut(m) s, u = [None]*self.n, random.randint(0, self.q) c = v = self.E(u) for i in list(range(z+1, self.n)) + list(range(z)): s[i] = random.randint(0, self.q) v = self.E(v^self.g(s[i], self.k[i].e, self.k[i].n)) if (i+1) % self.n == 0: c = v s[z] = self.g(v^u, self.k[z].d, self.k[z].n) return [c, ] + s def verify(self, m, X): self.permut(m) y = [self.g(X[i+1], self.k[i].e, self.k[i].n) for i in range(len(X)-1)] return functools.reduce(lambda x, i:self.E(x^y[i]), range(self.n), X[0]) == X[0] def permut(self, m): self.p = int(hashlib.sha1(m.encode('utf8')).hexdigest(), 16) def E(self, x): return int(hashlib.sha1(('%s%s'% (x, self.p)).encode('utf8')).hexdigest(), 16) def g(self, x, e, n): q, r = divmod(x, n) return q*n + pow(r, e, n) if (q+1)*n <= (1<<self.l)-1 else x if __name__ == '__main__': size, msg1, msg2 = 4, 'hello', 'world!' r = ring([Crypto.PublicKey.RSA.generate(2048, os.urandom) for x in range(size)]) for i in range(size): s1, s2 = r.sign(msg1, i), r.sign(msg2, i) assert r.verify(msg1, s1) and r.verify(msg2, s2) and not r.verify(msg1, s2)Následně byla navržena další schémata, včetně schémat Dodis, Kiayias, Nicolosi a Shoup, která navrhuje schéma s podpisy konstantní velikosti v počtu uživatelů používajících akumulátory a ověřovací schéma Fiat . Chandran, Groth a Sahai navrhli další verzi standardního modelu , která má velikost, která se zvyšuje s druhou odmocninou počtu uživatelů ( O (√N) ).
Technologie Cryptonote používá kruhové podpisy. To je použito v krypto-měny jako Monero nebo Bytecoin DarkNote.
Princip kroužek podpisu byla také přináší ShadowCash, s kryptoměna inspirovaný Bitcoin .