# Signature de groupe

La signature de groupe est une primitive cryptographique analogue à la signature numérique, en ce sens où elle vise à permettre à un utilisateur de signer un message au nom d’un groupe, en restant anonyme au sein de ce groupe. C’est-à-dire qu’une personne voyant la signature peut vérifier avec la clef publique que le message ait bien été émis par un membre du groupe, mais ne peut pas savoir lequel. En parallèle, les utilisateurs ne peuvent pas abuser de cet anonymat puisqu'une autorité est capable de lever l'anonymat des utilisateurs (malveillants) en utilisant une information secrète.
Pour illustrer le concept, on peut considérer un espace de commentaires anonyme, où les utilisateurs (disposant d'une clef privée) pourraient poster des messages. La présence d’une signature vérifiable sur les messages permet de contrôler si les messages ont bien été postés par une personne autorisée à le faire. L’anonymat permet de son côté d’assurer la protection de la vie privée des utilisateurs. En revanche, en cas d’abus, si quelqu’un poste un message hors-charte par exemple, alors un administrateur possédant une information secrète est capable de lever l’anonymat de l’utilisateur ayant posté le message frauduleux, et pourra prendre les mesures qui s’imposent (comme révoquer l'utilisateur).
Un avantage des signatures de groupes par rapport à l'utilisation des signatures numériques classiques est le fait qu'il n'y a qu'une seule clef publique à stocker pour l'ensemble du groupe au lieu de devoir avoir connaissance de toutes les clefs publiques différentes qui pourraient mener à une attaque de l'homme du milieu.

## Historique

La signature de groupe a été introduite en 1991 par Chaum et van Heyst où les notions d’anonymat et de traçabilité ont été définies pour décrire la sécurité du protocole. À partir de cet instant, de nombreux protocoles ont été introduits, rajoutant sur ce modèle des notions comme la non-falsifiabilité analogue à celle des signatures numérique, mais aussi des notions plus spécifiques comme la dénonciation.
Il a fallu attendre Bellare, Micciancio et Warinschi pour proposer un modèle formel plus épuré qui est utilisé aujourd'hui comme le modèle formel dans lequel travailler pour la signature de groupe. Les notions de sécurité ont été résumées en deux notions en plus de la correction : la traçabilité totale, et l'anonymat total.

## Définition

Une signature de groupe est un ensemble de quatre algorithmes efficaces : l’initialisation, la signature, la vérification et l'ouverture, décrits comme suit.
* L’initialisation prend en entrée un paramètre de sécurité λ et la taille du groupe N et renvoie une clef publique pour le groupe gpk, un vecteur de clefs secrètes gsk où ${\mathsf {gsk}}[d]$ correspond à la clef privée de l'utilisateur d et une clef d'ouverture ok.
* La signature, qui prend en entrée une clef secrète ${\mathsf {gsk}}[d]$, un message m et renvoie une signature σ.
* La vérification, qui prend en entrée la clef publique du groupe gpk, un message m et une signature σ et qui renvoie un booléen.
* L’ouverture, qui prend en entrée la clef privée d’ouverture ok, un message m et une signature σ et qui renvoie une identité d ou un message d'erreur « ⊥ ».
La correction d'une signature de groupe traduit le fait que la vérification d’un message signé par des parties faisant tourner honnêtement les différents algorithmes renverra vrai :
$\forall m,(gpk,gsk)\gets Init(\lambda ,N):{\mathsf {Verif}}\left(gpk,m,{\mathsf {Sign}}({\mathsf {gsk}}[d],m)\right)={\mathsf {Vrai}}$

## Sécurité

Comme précisé dans l'historique, la sécurité d'un schéma de signature de groupe se résume au travers de deux notions: l'anonymat total, et la traçabilité totale.

### Anonymat

L'anonymat traduit le fait que si on ne possède pas la clef d'ouverture ok, alors il devient très difficile de lever l'anonymat des utilisateurs.
Autrement dit, étant donné deux identités $d_{0}\neq d_{1}$ et un message m. En ayant accès aux clefs privées des utilisateurs, à la clef publique du groupe, et en ayant accès à un oracle de déchiffrement, il est impossible de distinguer en temps polynomial avec probabilité non négligeable ${\mathsf {Sign}}(m,d_{0})$ de ${\mathsf {Sign}}(m,d_{1})$.

### Traçabilité

La traçabilité quant à elle traduit la sécurité du système vis-à-vis des utilisateurs malhonnêtes. En d'autres termes, elle traduit le fait qu’un utilisateur ne pourra pas « falsifier (en) » une signature valide σ qui ouvrira sur un utilisateur honnête, ou découlera sur un échec.

## Extensions

La signature de groupe possède différentes variantes et extensions. On peut noter par exemple l'ajout de fonctionnalités comme la révocation, ou encore l’ouverture dépendante des messages, qui vise à limiter la puissance de l'autorité d'ouverture en rajoutant une autre autorité capable de délivrer un jeton, qui couplé à la clef d'ouverture ok permet de lever l’anonymat des signatures sur les messages ciblées par le jeton.

## Construction générique

Pour appuyer leur modèle, Bellare, Micciancio et Warinschi ont proposé une construction générique reposant sur des primitives plus bas niveau. Ils ont ainsi prouvé qu’avec un schéma de chiffrement IND-CCA, une signature numérique non-falsifiable sous des attaques à message choisis et une preuve à divulgation nulle de connaissance permettant la preuve de possession d’un couple message-signature, il est possible de construire un schéma de signature de groupe. Cette construction est la suivante:
* Initialisation(1$^λ$, N):
** Génère les paires de clefs (sk$_E$, pk$_E$), (sk$_S$, vk$_S$) pour le chiffrement et la signature respectivement, choisis pour être sûrs pour le paramètre de sécurité λ.
** Pour chaque utilisateur $d\in [\![0;N-1]\!]$, calculer une signature pour cette identité et en faire la clef secrète de l’utilisateur d : $gsk[d]\gets \mathbf {Signer} ({\mathsf {sk}}_{S},d)$
** Finalement renvoyer $gpk=({\mathsf {pk}}_{E},{\mathsf {pk}}_{S},1^{\lambda })$, et $ok={\mathsf {sk}}_{E}$.
* Signature(gpk, gsk[d], d, M):
** L’utilisateur commence par chiffrer son identité d: $C\gets \mathbf {Chiffrer} ({\mathsf {sk}}_{E},d)$.
** L’utilisateur prouve ensuite la possession d’un couple message-signature, pour le message sous le chiffré C, ce qui donne la preuve π. Le message est inclus dans la preuve.
** La signature est ainsi $\sigma =(C,\pi )$.
* Vérification(gpk, M, σ):
** Pour vérifier la signature, l’utilisateur commence par lire σ comme étant (C, π).
** La signature est acceptée si et seulement si la preuve est vérifiée.
* Ouverture(gpk, ok, M, σ):
** Si la vérification ne passe pas, alors l’algorithme retourne le symbole d'erreur ⊥.
** Sinon l’algorithme déchiffre C pour obtenir d’, et vérifie que d’ est bien dans $[\![0,N-1]\!]$. Si ce n’est pas le cas, l'algorithme renvoie un symbole d’erreur. Sinon il renvoie d’.

### Sécurité

L’anonymat est garanti par le fait que le chiffrement de l’identité C est chiffré par un schéma indistinguable sous des attaques à chiffrés choisis.
La traçabilité quant à elle vient de la robustesse (soundness) de la preuve à connaissances nulles.