Signature de cercle
La signature de cercle (en anglais : Ring signature), aussi appelĂ© signature dâanneau, est un procĂ©dĂ© cryptographique permettant Ă une personne de signer Ă©lectroniquement de façon anonyme un message ou un document au nom dâun « cercle ». Les membres de ce cercle sont choisis par lâauteur de la signature et ne sont pas nĂ©cessairement informĂ©s de leur implication dans la crĂ©ation de la signature Ă©lectronique. La seule contrainte est quâils doivent tous avoir une clef cryptographique publique.
La signature de cercle a donnĂ© lieu Ă un dĂ©rivĂ©: la signature de cercle Ă seuil, oĂč la signature est initiĂ©e par un nombre prĂ©dĂ©fini de membres du cercle.
Principe
Comme l'indique le titre de l'article oĂč elle est dĂ©crite pour la premiĂšre fois, How to Leak a Secret[1], le but premier de cette signature est de permettre la fuite d'information.
Dans cet article est donné l'exemple d'un membre d'un cabinet ministériel voulant donner à un journaliste des informations sur le premier ministre. Il ne désire évidemment pas divulguer son identité, mais souhaite que le journaliste sache que la fuite vient du cabinet et non pas d'un plaisantin. La signature de cercle lui permet ainsi de signer en tant que membre du cabinet ministériel, et non en tant qu'individu, sans que ses collÚgues soient au courant, ni que quiconque puisse remonter à lui, contrairement à la signature de groupe qui impose une coopération des membres inclus dans la signature et la possibilité pour une personne déterminée à l'initialisation de connaßtre l'identité du signataire.
Une autre utilisation proposĂ©e dans cet article est celle permettant de gĂ©nĂ©rer une signature qui n'aura de valeur que pour le destinataire. Ainsi la source envoie un document signĂ© Ă l'aide d'une signature de cercle comprenant sa clef et celle du destinataire. Ce dernier, sachant qu'il ne l'a pas produit, a donc la preuve que le message provient bien de la source. Mais s'il montre le document Ă un tiers, ce dernier ne peut pas ĂȘtre sĂ»r que le message n'est pas un faux, crĂ©Ă© par le destinataire.
DĂ©finition
Une signature dâanneau[2] est dĂ©finie comme Ă©tant la donnĂ©e de quatre algorithmes, certains similaires Ă ceux dâune signature numĂ©rique: (Init, GĂ©n, Signer, VĂ©rifier). Ceux-ci fonctionnent de la maniĂšre suivante :
- L'initialisation Init prend en entrĂ©e un paramĂštre de sĂ©curitĂ© et renvoie une chaĂźne de rĂ©fĂ©rence commune Ï.
- La génération de clefs Gén, qui est lancée par l'utilisateur, prend en entrée la chaßne de référence commune, et renvoie un couple de clefs : une clef de vérification vk, et une clef de signature sk.
- La signature Signer prend en entrĂ©e la clef de signature sk, la chaĂźne de rĂ©fĂ©rence commune, le message Ă signer, un ensemble R de clefs de vĂ©rification telle que celle associĂ©e Ă la clef de signature sk y appartient. Et cet algorithme renvoie une signature Ï.
- La vĂ©rification VĂ©rifier prend en entrĂ©e la chaĂźne de rĂ©fĂ©rence commune, un ensemble R de clefs de vĂ©rifications, un message M et une signature Ï, et renvoie accepte ou rejette.
Ces algorithmes vont de pair avec des notions de sĂ©curitĂ© associĂ©s, qui sont la correction de la signature, qui spĂ©cifie que si une signature est honnĂȘtement gĂ©nĂ©rĂ©e, alors elle sera toujours acceptĂ©e. La non-falsifiabilitĂ©, qui requiert que sans possĂ©der de clefs privĂ©e associĂ©e Ă un des Ă©lĂ©ments de l'ensemble R, il est impossible de concevoir une signature valide, et lâanonymat, qui dit qu'il est impossible de lier une signature Ă son signataire.
Le schéma de Rivest, Shamir et Tauman
Dans cette partie, une description du schéma proposé par Rivest, Shamir et Tauman[1] est donnée.
Dans ce schĂ©ma, l'utilisateur gĂ©nĂšre une signature Ï pour le message M Ă signer, un alĂ©a v, son couple clef privĂ©e/publique et les clefs publiques des autres membres du cercle R = (pki)i â [1;n]. De plus ce schĂ©ma dĂ©pend dâun schĂ©ma de chiffrement (Enc, Dec).
Les utilisateurs peuvent ainsi vĂ©rifier cette signature Ă l'aide de Ï, M, v et de l'ensemble des clefs publiques impliquĂ©es dans le processus de crĂ©ation.
Signature
Le signataire gĂ©nĂšre un hachĂ© Ï du message M et choisit ensuite un nonce v0. Pour chaque clef publique pki â R autre que la sienne, le signataire choisit une valeur xi alĂ©atoirement, la chiffre avec la clef publique pki et effectue une disjonction exclusive du rĂ©sultat avec la valeur v avant d'appliquer une permutation symĂ©trique EÏ au rĂ©sultat, ce qui donnera une nouvelle valeur «âŻviâŻÂ».
Ce qui donne itĂ©rativement : vi := EÏ (Encpki(xi) â vi-1)
On recommence la manipulation avec les autres clefs publiques.
Ă la fin, on se retrouve avec une valeur v = vn. On recherche alors la valeur y qui, mise en ou exclusif avec le v trouvĂ© et permutĂ© avec EÏ, permet de retrouver v0. Autrement dit v0 = EÏ(y â v). On utilise enfin la clef privĂ©e pour retrouver l'antĂ©cĂ©dent de y par le chiffrement, c'est-Ă -dire x = Decsk(y).
Finalement la signature renvoyée sera Σ = (v, (xi)i)
VĂ©rification
Le destinataire refait les calculs vi = EÏ (f (xi) â vi+1) pour toutes les clefs publiques de la signature et vĂ©rifie qu'il retrouve bien le v original Ă la fin.
La taille de la signature est linéaire en N, qui correspond à la taille du cercle, car il faut spécifier les aléas xi utilisées par chaque participants.
Preuve de concept
Ci-suit une preuve de concept implantée en Python ou Python3 du papier original, utilisant RSA comme cryptosystÚme asymétrique. Le cercle contient quatre membres.
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)
Autres Schémas
Par la suite, d'autres schĂ©mas ont Ă©tĂ© conçus, dont celui de Dodis, Kiayias, Nicolosi et Shoup[3], qui propose un schĂ©ma Ă signatures de taille constante en le nombre d'utilisateurs en utilisant des accumulateurs et le schĂ©ma d'authentification de Fiat-Shamir. Une autre version, dans le modĂšle standard, possĂ©dant une taille qui croĂźt comme la racine carrĂ©e du nombre d'utilisateurs (O(âN)) a Ă©tĂ© proposĂ©e par Chandran, Groth et Sahai[4].
Cryptomonnaies
La technologie Cryptonote[5] utilise des signatures de cercles. Celle-ci est utilisée dans des crypto-monnaies comme Monero, Bytecoin ou DarkNote.
Le principe de signature dâanneau a Ă©galement Ă©tĂ© portĂ©e sur ShadowCash[6], une crypto-monnaie inspirĂ©e de Bitcoin.
Notes et références
Bibliographie
- [Bender, Katz et Morselli 2006] (en) Adam Bender, Jonathan Katz et Ruggero Morselli, « Ring signatures: Stronger definitions, and constructions without random oracles », TCC,â , p. 60â79
- [Chandran, Groth et Sahai 2007] (en) Nishanth Chandran, Jens Groth et Amit Sahai, « Ring signatures of sub-linear size without random oracles », Automata, Languages, Programming,â
- [Dodis, Kiayias, Nicolosi et Shoup 2004] (en) Yevgeniy Dodis, Aggelos Kiayias, Antonio Nicolosi et Victor Shoup, « Anonymous Identification in ad-hoc Groups », Eurocrypt, lNCS, vol. 3027,â
- [Rivest, Shamir et Tauman 2001] (en) Ronald Rivest, Adi Shamir et Yael Tauman, « How to Leak a Secret », Asiacrypt, lNCS,â , p. 552â565 (lire en ligne [PDF])
- (en) Rynomster et Tecnovert, « Shadow: Zero-knowledge Anonymous Distributed Electronic Cash via Traceable Ring Signatures » [PDF]
Liens externes
- Pierre-Louis Cayrel, Optimisation des cryptosystĂšmes basĂ©s sur les codes correcteurs dâerreurs (ThĂšse de Doctorat) (lire en ligne), chap. 6 (« signature de cercle Ă seuil, prĂ©sentation de la signature de cercle »).