Accueil RSA Paillier DGHV GSW Boostrapping Le Chiffrement homomorphe

Le Bootstrap

Problématique et intuition

Problématique

Les cryptosystème vus précédemment n'étaient pas complètement homomorphes. En effet, RSA et Paillier ne sont pas homomorphes pour toutes les opérations, ils sont respectivement homomorphes pour la multiplication uniquement ou pour l'addition uniquement. Les cryptosystèmes comme DGHV et GSW présentés tels quels ne peuvent réaliser qu'un nombre donné d'opérations.

Nous allons voir qu'il existe toutefois un procédé, le bootstrap (ou réamorçage), qui permet de pallier à cette contrainte de nombre limite d'opérations.

Le Bootstrap, concrètement

Intuition

On rappelle qu'un cryptosystème "somewhat" homomorphe a, pour toute fonction \(f\) qui peut être exprimée sous la forme d'un circuit de profondeur donnée, la relation suivante : $$f(\overline{a_1},\overline{a_2},\ldots,\overline{a_k}) = \overline{f(a_1,a_2,\ldots,a_k)}$$ (où \(\overline{m}\) représente le chiffré de \(m\))

Maintenant, imaginons qu'un cryptosytème soit fait de telle façon qu'il puisse évaluer sa propre fonction de déchiffrement, on aurait la relation suivante : $$Dec(\overline{s},\overline{c}) = \overline{Dec(s,c)}$$ Creusons encore le raisonnement, supposons que nous ayons à notre disposition une clé secrète \(s\) chiffrée à l'aide d'une clé publique \(p_2\) quelconque : \(\overline{s}\). Supposons de plus que nous ayons un chiffré \(c\) qui résulte d'un certain nombre d'opérations et qui est donc bruité. A présent, chiffrons \(c\) à l'aide de \(p_2\) : on obtient \(\overline{c}\). On peut alors exprimer la fonction de déchiffrement sous la forme d'un circuit et utiliser la relation précédente : $$c_2 = Dec(\overline{s},\overline{c}) = \overline{Dec(s,c)} = \overline{m}$$ Ainsi, à partir d'un chiffré \(c\) bruité on a obtenu un chiffré \(c_2\) bien moins bruité puisqu'il est égal à \(\overline{Dec(s,c)}\) et que \(Dec(s,c)\) est débruité. On a en quelque sorte déchiffré et rechiffré \(c\) avec \(p_2\) d'un seul coup.

On a donc là une intuition de comment réduire le bruit des chiffrés, tout en les gardant chiffrés.

Le Théorème du Bootstrap

Dans sa thèse fondatrice de 2009, Gentry a pour la première fois mis en avant cette intuition et démontré le théorême du Bootstrap :

Suppose that \((G,E,D)\) is a CPA circular secure somewhat homomorphic encryption scheme for the family \(F\) and suppose that for every pair of ciphertexts \(c,c′\) the map \(Dec(c)-NAND-Dec(c′)\) is in \(F\). Then \((G,E,D)\) can be turned a fully homomorphic encryption scheme.

Expliquons cela :

  • \((G,E,D)\) est un cryptosystème, il est constitué à partir de \(G\) (fonction de génération de clés), de \(E\) (fonction de chiffrement, "encryption" en anglais) et de \(D\) (fonction de déchiffrement)
  • Nous reviendrons sur la signification de "CPA circular secure"
  • Le cryptosystème est somewhat homomorphe car il peut réaliser tous type d'opération, mais en nombre limité
  • Etant donné que le nombre d'opération est limité, alors toutes les fonctions que peut réaliser ce cryptosystème sont dans \(F\), une certaine famille de fonctions
  • Le théorême nous dit qu'à partir du moment où le cryptosystème peut réaliser \(Dec(c)-NAND-Dec(c′)\) quelque soit les chiffrés \(c,c′\) alors il est complètement homomorphe
Le Théorème peut être aisément compris ainsi : à partir du moment où notre cryptosystème peut supporter sa fonction de déchiffrement, plus une opération universelle (comme la porte NAND), alors il peut réduire le bruit des chiffrés (en effectuant la manipulation décrite précédemment) et réaliser une opération supplémentaire. Etant donné que toutes les fonctions logiques peuvent être exprimées avec un certains nombre d'opérations NAND, et étant donné que nous pouvons réinitialiser le bruit après chacune de ces opérations, notre cryptosystème peut exprimer toutes les fonctions possibles, peu importe le nombre d'opérations : il est complètement homomorphe.

"CPA circular security"

Reprenons le Théorème du Bootstrap et déterminons concrètement comment le mettre en place :

On pose la situation suivante : Alice a besoin d'effectuer d'importants calculs, elle souhaite donc envoyer ses données à Bob, qui possède la puissance de calcul nécessaire. Toutefois, elle souhaite garder ses données secrètes : Alice et Bob vont donc utiliser un cryptosystème homomorphe. Alice envoie à Bob sa clé publique \(p\), un message chiffré avec cette clé \(c\), une autre clé publique \(p_2\), ainsi que la clé secrète \(s\) qui a bien entendu été chiffrée, avec \(p_2\) : \(\overline{s}\). Bob effectue donc des opérations sur \(c\), jusqu'à ce que le bruit devienne trop important. Il décide donc de réinitialiser ce bruit à l'aide du procédé du Bootstrap :

  • Il chiffre \(c\) à l'aide de \(p_2\) : il obtient \(\overline{c}\)
  • Il évalue la fonction de déchiffrement sur \(\overline{s}\) et \(\overline{c}\) : il obtient \(Dec(\overline{s},\overline{c}) = \overline{Dec(s,c)} = \overline{m}\)
  • Il peut alors réaliser un nombre donné d'opérations sur le nouveau chiffré obtenu
  • Quand le bruit devient trop grand, il réalise de nouveau le processus
Un problème apparait toutefois. Pour réaliser le bootstrap une première fois, il a utilisé \(\overline{s}\), et il a obtenu \(c_2\) le message chiffré avec \(p_2\). Bob ne connait toutefois pas \(s_2\) (bien heureusement, sinon il pourrait déchiffrer \(\overline{s}\)), étant donné que c'est Alice qui lui a donné \(p_2\). Le bootstrap ne pourra pas continuer si Bob n'a pas à disposition une clé publique \(p_3\) et la clé \(s_2\) chiffrée avec \(p_3\). Et s'il veut faire une itération supplémentaire, il devra avoir également avoir une clé \(p_4\) ainsi que \(s_3\) chiffrée à l'aide de \(p_4\). Et ainsi de suite.

Le bootstrap réalisé ainsi ne permet pas d'avoir un cryptosystème complètement homomorphe, étant donné que le nombre d'opérations sera limité par la taille de la clé (qui est l'ensemble des clés secrètes chiffrées et des clés publiques).

On peut alors penser à une autre façon de réaliser le bootstrap : plutôt que d'utiliser une clé \(p_2\) quelconque, utilisons la clé \(p\) pour chiffrer \(s\). Ainsi, lorsqu'il procédera au bootstrap, il obtiendra un message chiffré non pas avec une clé quelconque, mais avec \(p\). Il connaîtra donc d'avance la clé secrète chiffrée \(\overline{s}\), et pourra faire autant d'itération du bootstrap que souhaité.

Cette méthode requiert toutefois que le cryptosystème soit CPA-circular-secure, c'est-à-dire que la connaissance de \(p\) et de \(s\) chiffrée à l'aide de \(p\) ne divulgue aucune information sur \(s\) (si ce n'est sur sa taille). D'où la supposition de "CPA circular security" dans le théorême du bootstrap.

Pour aller plus loin

Pour avoir une approche différente et imagée du bootstrap par son inventeur Craig Gentry, vous pouvez consulter son papier "Computing Arbitrary Functions of Encrypted Data" : https://crypto.stanford.edu/craig/easy-fhe.pdf

Pour en savoir plus sur les problématique de "CPA circular security", vous pouvez jeter un coup d'oeil sur cet article de blog du cryptologue Matthew Green : https://blog.cryptographyengineering.com/2012/04/27/wonk-post-circular-security/

Pour retrouver le théorême du bootstrap tel qu'écrit sur cette page, vous pouvez vous référer à ce cours de Boaz Barak : http://www.boazbarak.org/cs127spring16/chap15_FHE.html#fn4