title: Cryptographie à base de codes
text: # Cryptographie à base de codes
  
  La cryptographie à base de codes est une technique permettant de construire des primitives cryptographiques à clé publique à partir de codes correcteurs d'erreurs. Il s'agit d'une des premières constructions de cryptographie asymétrique, et constitue l'une des directions de recherche explorées pour développer la cryptographie $post-quantique^,.$ La sécurité de ces constructions repose sur le théorème que le décodage d'un code linéaire est NP-difficile en général.
  
  ## Histoire
  
  En 1978, Elwyn Berlekamp, Robert McEliece et Henk von Tilborg démontrent que le problème consistant à décoder un code linéaire est en général NP-difficile. McEliece en tire un cryptosystème à clé publique à partir des codes algébriques binaires de Goppa, appelé cryptosystème de McEliece. En 1986, Harald Niederreiter publie une construction similaire mais plus rapide, le cryptosystème de $Niederreiter^,,$ qui s'avère en fait équivalent (dual) à celui de McEliece. À ce jour, la version de McEliece a résisté à la cryptanalyse, l'attaque la plus efficace connue étant le décodage par ensemble d'information, légèrement plus efficace sur un calculateur quantique, mais aisément contrecarrée en utilisant des paramètres assez grands.
  
  Cependant, la taille prohibitive des clés et la complexité importante de l'algorithme de déchiffrement ont poussé au développement de variantes reposant sur d'autres codes. Ainsi il a été proposé de construire sur le même principe des cryptosystèmes à partir des codes de Reed-Solomon, de Reed-Muller, et plus récemment sur les codes LDPC ou MDPC $quasi-cycliques^,^,.$ Toutes ces variantes ont cela dit été rapidement $cassées^,^,.$ Il semble que le gain de structure, qui permet de compresser les clés publiques, facilite du même coup grandement le travail de l'attaquant.
  
  Une autre solution consiste à considérer des codes correcteurs pour une autre métrique, en remplaçant par exemple la distance de Hamming par le rang. Si le problème du décodage est a priori plus difficile encode dans ce contexte, en pratique une attaque due à Raphael Overbeck en 2008 a cassé toutes les propositions de ce type. Des recherches se poursuivent sur la possibilité de contourner l'attaque.
  
  Enfin, même l'utilisation d'un code de Goppa ne garantit pas la sécurité : si le taux approche 1 des attaques sont connues, de même si on considère un code $q$-aire avec $q$ non premier.
  
  ## Principe général
  
  La cryptographie à base de codes s'appuie sur la notion qu'un code linéaire peut être décrit par une matrice génératrice (ou une matrice de parité), qui sera donc la clé publique. Le chiffrement d'un message consiste simplement à appliquer le code correcteur correspondant, c'est-à-dire à effectuer le produit matrice vecteur, puis ajouter un aléa de poids de Hamming faible $\leq t$. Le déchiffrement consiste à appliquer l'algorithme de décodage du code correcteur.
  
  Le code retenu pour cette construction est choisi de sorte qu'étant donnée la matrice génératrice du code, il est difficile d'en déduire un algorithme de décodage corrigeant jusqu'à $t$ erreurs. Ainsi, alors que le destinataire légitime du message bénéficie d'un algorithme efficace car spécialisé, un adversaire sera contraint d'appliquer des méthodes génériques, bien moins efficaces. En choisissant les paramètres du code de manière appropriée, on peut rendre le travail de l'adversaire arbitrairement difficile, tout en gardant le travail du destinataire légitime sous contrôle.
  
  Pour éviter que l'adversaire ne « reconnaisse » le code à partir de sa matrice génératrice, on choisit le code parmi une famille assez large pour que la matrice semble aléatoire. On peut combiner cela avec des permutations afin de dissimuler la matrice davantage, au prix d'opérations supplémentaires pour le déchiffrement. Toutefois, l'apport concret de ces variations sur la sécurité du schéma semble mineure.
  
  Construit ainsi, un chiffrement à base de codes correcteurs est vulnérable à toute une famille d'attaques classiques. Cela peut toutefois être évité de manière générique en appliquant une transformation due à Kazukuni Kobara et Hideki Imai qui dote le cryptosystème d'une résistance aux attaques adaptatives par chiffrés choisis (IND-CCA2) pratiquement sans augmenter la bande passante par rapport à l'original.
  
  ## Primitives à base de codes correcteurs
  
  Schémas de chiffrement :
  
  * Chiffrement de McEliece
  * Chiffrement de Niederreiter
  * McBits
  
  Schémas de signature :
  
  * CFS
  * Cayrel-Gaborit-Prouff
  * KKS (cassés en 2011)
  