Cryptographie à clef publique, clef privée

Table des matières

1. Cryptographie symétrique

1.1. Chiffrement de Caesar (décalage)

Alice et Bob se mettent d’accord sur une clef qui est un entier (dans 1..25). Lorsqu’Alice désire envoyer un message, elle substitue à chaque lettre la lettre décalée de la valeur de la clef.

Ainsi, si la clef est 2, les A sont remplacés par des A+2=C, les B par des C+2=E… les X par des X+2=Z, les Y par des Y+2=A, les Z par des Z+2=B.

1.2. Chiffrement affine

Le chiffrement de Caesar réalisait une opération d’addition, le chiffrement affine va étendre l’idée en appliquant cette fois à chaque lettre la transformation : \(\left(x \mapsto a\times x +b\right)\%26\). Afin que la transformation soit bijective, le choix de \(a\) n’est pa uelconque, il doit être premier avec 26.

1.3. Chiffrement par substitution

Le chiffrement par sustitution généralise la transformation, en choisissant maintenant comme clef une table complète indiquant une permutation de l’alphabet. Ainsi une clef pourrait être AZERTYUIOPQSDFGHJKLMWXCVBN indiquant que les A se transforment en A, les B en Z, les C en E…

1.4. Chifferment par bloc, méthode de Hill

L’idée est ici d’étendre le chiffrement affine. On choisit une taille de bloc (par exemple 3), On note \(x_1, x_2, x_3\) les trois caractère d’un bloc. A partir de ces 3 caractères on calcule trois nouveaux caracères \(y_1,y_2,y_3\) qui sont des commbinaisons linéaires des \(x_i\). Par exemple : \(y_1= 3\times x_1+7\times x_2+5\times x_3, \; y_2= x_1+9\times x_3, \; y_3 = x_1+x_2\). Le système ainsi formé doit être inversible, et le déterminant doit être premier avec le nombre de caractères de l’alphabet.

1.5. Exemple : Chiffrement par XOR

1.5.1. Avec un livre de code

Alice et Bob veulent échanger des messages sur un canal non fiable (Charlie écoute). Examinons une première méthode afin qu’ils parviennent à leur fins. On note \(m\) le message à transmettre, \(M\) son encodage (ici, on peut passer de \(m\) à \(M\) en passant toutes les lettres en majuscules, et en supprimant espaces la ponctuation…). On note \(C\) le message chiffré de \(M\).

Alice et Bob se rencontrent et échangent en secret un livre qui contient une suite de caractères tirés aléatoirement. Pour l’exemple, le livre contient uniquement « B B A D W W M Y A Z A B B A C A B B Y ». rentrée chez elle, Alice désire communiquer à Bob le message « H E L L O ». Voici ce qu’elle fait :

  B B A D W
+ H E L L O
= B(1) + H = I B(1) + E = F A(0) + L = L D(3) + L = O W(22 = -4) + O = K

Alice transmet alors à Bob : « commence à la lettre n°1 du livre, C = IFLOK ». Lorsque Bob reçoit ce message, il prend son livre de code et démarre au 1er caractère :

- B B A D W
+ I F L O K
= -B(1) + I = H -B(1) + F = E -A(0) + L = L -D(3) + O = L -W(22 = -4) + K = O

Bob s’esbaudit de la profondeur du message d’Alice : HELLO.

Au prochain message, Bob envoie à Alice « commence à la lettre n°6 du livre, C = HATE », quel message Bob veut(il lui communiquer ?

1.5.2. Avec une clef connue

Les livres de code, ce n’est plus tellement à la mode, c’est lourd, il faut se rencontrer, les messages sont maintenant incroyablement longs (images, vidéos,…). Pendant la guerre froide, l’exact procédé précédent avec échange de la main à la main des dirigeants de ces fameux livres a été utilisé. Cela n’est pas pratique, d’autant plus que toute partie du livre déjà utilisée ne doit plus être utilisée (c’est un des points important, l’autre étant que les données du livre doivent être aléatoires uniformes). On va donc essayer de se limiter à l’échange d’un petit bout de papier sur lequel on écrit une clef (ordre de grandeur, un nombre de 150 chiffres), ce sera mieux que les 12 tomes de la situation précédente.

Une solution, est de se transmettre quelque chose de plus court qui sera le générateur du livre de code :

  • imaginons une fonction, pour faire simple \(f(x) = (23 \times x +13)\; \%\; 738\)
  • définissons la suite \(U_{n+1} = f(U_{n})\)
  • avec \(U_{0} = clef\) où pour l’exemple la clef = 42

Examinons les premières valeurs de cette suite :

42 241 390 127 720 337 384 727 498 397 288 733
636 619 228 91 630 481 6 151 534 487 144 373
474 583 138 235 252 643 42 241 390 127 720 337
384 727 498 397 288 733 636 619 228 91 630 481
6 151 534 487 144 373 474 583 138 235 252 643

Pour peu que certaines conditions simples soient remplies sur (23, 738) la période de cette suite de nombre est 738, et donc il est possible de générer des suites arbitrairement longues. Maintenant, definissons \(V = (char) (U_{n} \%26 +'A')\) (pour transformer cet entier en caractère, on obtient alors sur la même séquence :

Q H A X S Z U Z E H C F
M V U N G N G V O T O J
G L I B S T Q H A X S Z
U Z E H C F M V U N G N
G V O T O J G L I B S T

Ce qui donne une simulation du livre de code dont on disposait précédemment dont la sécurité tient à :

  • connaissant les premiers caractères de cette suite il est difficile de prédire les suivants
  • la clef n’est pas devinable : en particulier connaissant les lettres obtenues, il est difficile de retrouver la clef (ici le 42), et cette clef de départ est choisie dans un domaine suffisamment grand pour que son exploration exhaustive ne soit pas pertinente.

idée

On pourrait indiquer comme clef : chapitre 9, caractère 127 de l’Idiot de Dostoïevski, édition Pleïade, 31/03/1953. Le correspondant n’a plus qu’à se procurer cet ouvrage, et il dispose alors du code pour déchiffrer.

Cette méthode ne résisterait pas longtemps à une cryptanalyse assez élémentaire :

  • le texte proposé n’est absolument pas aléatoire (plus de ’e’ que de ’x’, les mots de la clef ne sont pas quelconques, ils sont dans un ensemble tout petit, le dictionnaire ’conjugué’, …)
  • la clef, quoique le texte soit long, contient en réalité peu d’information : le nombre de livres possibles est en réalité petit, et le nombre de départs possibles est également petit…

La conjugaison de ces deux points fait qu’armé d’une bonne bibliothèque informatisée et d’un programme assez simple, il ne reste presque plus rien de la sécurité.

1.5.3. La même idée, pour aller un pas plus loin (lecture facultative)

1.6. Chiffement autoclave

Le chiffrement autoclave consiste à utiliser une clef de taille insuffisante, et lorsque la longueur de la clef est atteinte, on utilise por le chiffrement le message en clair. Ainsi, si dispose comme clef la chaine ’ZTE’ et qu’on désire chiffree LANUITLESCHATS, on utilise comme clef de chiffement : ZTELANUITLESCHA.

2. Chiffrement par transposition

Contrairement à une première impression, le chiffement par transposition est plus difficile à casser que les chiffements symetriques vus au début (mis à part le XOR). Ce type de chiffement consiste à ’mélanger’ les lettres du message. On peut utiliser des tables afin de réaliser ce chiffrement.

3. Surchiffrement : le chiffre bifide de Delastelle

Le surchiffrement consiste à combiner plusieurs méthodes de chiffrement. Ainsi, le chiffre bifide de Delastelle va combiner de façon très astucieuse un chiffrement par transposition par table et un chiffrement par substitution.

4. Cryptographie asymétrique, le principe

4.1. Présentation imagée

Alice est en France dans le Périgord. Elle voudrait transmettre une valise de fromages et charcuteries à son ami Bob qu’elle a rencontré sur Facebook et qui habite Washington. Elle s’inquiète des malfaisants qui prélèveraient une partie des denrées, attirés par des effluves alléchantes dégagées par ces victuailles…

  • Elle décide de placer un cadenas à clef sur la valise, avec écrit en lettres capitales sur la valise : « quand tu recevras cette valise, mets-y un cadenas et renvoie-la moi ! »
  • Bob reçoit la valise, y ajoute un cadenas à côté de celui d’Alice, enlève le message, et renvoie la valise à Alice.
  • Alice reçoit la valise, enlève le cadenas qu’elle y avait placé (c’est son cadenas, elle en a la clef !), et renvoie la valise.
  • Bob reçoit la valise, enlève son cadenas (c’est le sien, il en a la clef !), et se délecte des denrées qui sont passées au nez et à la barbe de bien des facheux qui n’ont pu que se pourlécher les babines…

4.2. Formalisation du cas précédent

Formalisons le processus proposé pour la transmission d’un message \(m\) :

  1. Alice calcule \(f(m)\), et le transmet à Bob
  2. Bob calcule \(g(f(m))\) et le transmet à Alice
  3. Alice calcule \(f^{-1}(g(f(m))) = g(m)\)
  4. Bob calcule \(g^{-1}(g(m)) = m\)

Quelles sont les contraintes :

  1. La fonction \(f\) doit être inversible (il doit être possible de retrouver le message original) et la fonction \(f^{-1}\) doit être difficile à découvrir.
  2. Mêmes propriétés sur \(g\).
  3. Il faut que \(g\) et \(f^{-1}\) commutent (il est en fait assez rare que des fonctions commutent : avancer puis tourner à droite ne nous amène pas au même point que tourner à droite puis avancer)

4.3. Premier exemple

Prenons un exemple (message nécessitant une haute sécurité car transmettant la liste des cadeaux de Noël de votre fille de 6 ans)

  • \(f\) associe à chaque lettre la lettre correspondant à son code ASCII plus 2
  • \(g\) calcule l’image miroir de son argument (ABCD devient DCBA).

On vérifie les points soulevés précédemment :

  • Les fonctions \(f\) et \(g\) sont inversibles et commutent : tout va bien.

Si on reçoit un message encodé par \(f\), il est possible qu’un humain ne le décode pas rapidement, mais pour ce qui est d’un ordinateur, il existe des méthodes très simples et rapides permettant de retrouver l’original, donc ce point n’est pas respecté.

  • Un message encodé par \(g\) est vite décodé, même par un humain « ENUL AL CEVA SUOV-ZEDNER A LIELOS EL »

4.4. Deuxième exemple, les maths arrivent !

Prenons un deuxième exemple :

  1. Choisir \(p\) et \(q\) des nombres premiers distincts
  2. On note \(n = p \times q\)
  3. On note \(\phi(n) = (p-1) \times(q-1)\)
  4. Choisir un entier \(e < \phi(n)\) premier avec \(\phi(n)\)
  5. En utilisant l’algorithme d’Euclide , calculer d tel que \(d \times e \equiv 1 [mod \; \phi(n)]\) [Euclide étendu : https://www.youtube.com/watch?v=bWHY9Eto2wU puis on passe le côté gauche et le côté droit modulo \(\phi(n)\)]

Chiffrement / déchiffement :

  • Le message \(m\) est encodé par \(M\). Attention, il faut que \(0 \leq M < n\).
  • Le message à transmettre (le chiffré) est l’entier \(C = M^{e} [mod\;n]\)
  • Le déchiffrement du message \(C\) est \(M = C^{d}[mod\;n]\)

Schéma d’utilisation :

  1. Alice construit (dans son coin) les 3 nombres \((e, d, n)\)
  2. Elle publie sur son site Web, à la vue de tous les nombres \((e,n)\) (c’est sa clef publique) et garde secret le nombre \(d\)
  3. Bob écrit à Alice en chiffrant le message avec la clef publique d’Alice
  4. Alice reçoit le message et le déchiffre en utilisant sa clef privée \((d,n)\)

La fonction de chiffrement est définie par le couple \((n, e)\) et est connue de tous, la fonction de déchiffrement est définie par \((d, n)\) et n’est connue que d’Alice. Ce qui fait que l’algorithme fonctionne :

  • la connaissance de \((n,e)\) et d’une multitude de couples \((M, C)\) (des messages qui ont été chiffrés dont on connaît le déchiffrement) ne nous fournit pas de méthode efficace pour savoir décoder un nouveau message.
  • il y a un problème dans la méthode : il faut être capable de générer des nombres premiers grands, en un temps raisonnable, et qui ne soient pas prévisibles [à noter : il n’existe pas de distribution de probabilité uniforme sur un ensemble dénombrable, ce qui signifie dans notre cas « tirer un nombre premier au hasard de façon uniforme » n’a pas de sens, si vous êtes intéressé, vous pouvez jeter un coup d’oeil à https://www.pourlascience.fr/sd/mathematiques/les-entiers-ne-naissent-pas-egaux-7065.php]
  • Il est à noter que si on n’était pas en arithmétique modulaire (avec des modulos), mais sur des réels, le problème serait trivial, grâce à la fonction log (qui n’a pas d’équivalent facilement calculable en arithmétique modulaire). Sur les réels, le chiffré (connu) serait \(C = M^e\), on passe au log : \(\log C = \log e + \log M\) comme on connaît \(e\), on peut enlever son log \(\ln C - \ln e = \ln M\) et finalement en passant à l’exponentielle \(M= e^{\ln C -\ln e}\) (mais calculer un log en arithmétique modulaire peut être difficile)

Exemple avec xcas (et des entiers tout petits) :

  • Mise en place par Alice
    • on choisit p = 733, q le plus petit nombre premier supérieur à 142.
    • on vérifie qu’ils sont premiers [xcas : isprime].
    • on calcule \(n\) et \(\phi(n)\).
    • on choisit la plus petite valeur de e possible supérieure à 36 (sur xcas, on l’appelle mon_e, car e est pour \(\exp(1)\)
    • on vérifie que mon_e est premier avec \(\phi(n)\) [xcas : gcd]
    • on calcule d [xcas : iabcuv]
    • Alice communique au monde le couple \((mon\_e,n)\)
  • Construction du message \(M\) par Bob
    • le message que Bob veut transmettre est m = ABC, on encode le A par 10, le B par 11, le C par 12, on met bout à bout les valeurs obtenues, ce qui donne \(M = 101112\) (remarque : la façon de passer de M à m ou de m à M n’est pas secrète)
    • on vérifie que \(M < \phi(n)\)
  • Cryptage du message par Bob (qui connait \((mon\_e, n)\)
    • Bob calcule \(C = M^{mon\_e} [mod\;n]\) [xcas : irem]
    • Bob transmet à Alice le message \(C\)
  • Décryptage du message de Bob par Alice
    • Alice calcule \(M = C^{d} [mod\;n]\) puis le transcrit en \(m = ABC\) et s’esbaudit devant la profondeur de la pensée de Bob !

Au fait, tout cela a l’air bien compliqué pour un petit exemple… ah oui, c’est l’algorithme de cryptographie le plus célère: RSA, dont le nom est construit à partir des initiales de 3 illustres anciens (Rivest https://fr.wikipedia.org/wiki/Ronald_Rivest, Shamir https://fr.wikipedia.org/wiki/Adi_Shamir et Adleman https://fr.wikipedia.org/wiki/Leonard_Adleman)

4.5. Chiffrement asymétrique pour l’identification

En utilisant ce que l’on a vu précédemment, au lieu de transmettre un message, on peut valider que son correspondant est bien celui qui nous a fourni la clef publique :

  • Alice génère un message aléatoire
  • Alice le crypte avec la clef publique de Bob
  • Alice l’envoie à Bob
  • Bob le décrypte
  • Bob renvoie le message décrypté à Alice
  • Si Alice reçoit son message aléatoire du début, c’est donc que le Bob qui parle est très vraisemblablement celui qui lui a fourni la clef publique, sinon … Charlie est intervenu sur la ligne, mais n’a pas réussi à se faire passer pour Bob.

5. ssh

5.1. Malin, non ?

ssh est le protocole de communication sécurisée le plus fréquemment utilisé. Il va mixer les deux types de chiffement:

  • le chiffrement asymétrique (très lent) qui va permettre d’identifier le destinataire et de transmettre une clef partagée,
  • le chiffrement symétrique (très rapide) qui utilise la clef qui vient d’être partagée.

5.2. Et sur linux ?

Pour créer votre clef ssh : ssh-keygen -t ecdsa -b 521

  • -t ecdsa choix d’un algorithme reconnu preque partout et très vraisemblablement plus fiable que rsa (qui est l’algorithme par défaut)
  • b 521 la clef est sur 521 bits (c’est ce qui se fait de mieux pour l’instant, et cela reste assez petit pour ne pas créer de surcharge de trafic sur le réseau ; et non, c’est bien 521)

Si on être capable de conserver sa clef privée secrète, on peut laisser la passphrase vierge, cette passphrase servant à chiffrer sur la machine la clef privée.

Vous pouvez créer une clef pour chacun des algorithmes. Cela génèrera à chaque fois, une clef publique xxx.pub et une clef privée.

Si vous voulez faire connaitre votre clef publique, vous pouvez bien entendu la diffuser dans votre signature mail, sur votre compte facebook, etc… mais plus efficacement, la transmettre par : ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host qui vous permettra de vous faire connaitre de la machine ’host’.

Pour ceux qui mettent des ’pass phrases’, il est possible d’exécuter ssh-agent qui se chargera de leur gestion et vous évitera de les tapper à tout bout de champ.

6. Et la cryptanalyse ?

Là, on entre dans le domaine des mathématiques, et pas sur un chapitre particulièrement facile…

6.1. Analyse fréquentielle

Une des rares choses simples est que l’on peut s’aider avec les tables de fréquences des lettres, digrammes, mots, etc.

Imaginons un code simple : Le message \(M\) ne contient que des majuscules, les mots sont séparés par des espaces. Soit \(f\) la bijection choisie par Bob pour communiquer avec Alice (par exemple, \(f\) remplace les ’A’ par des ’Z’, les ’B’ pr des ’U’, …). On suppose qu’Alice connait \(f\).

  1. Fabriquer \(f\) en aléatoire uniforme : https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
  2. Ecrire la fonction de chiffrement (elle applique \(f\) à chacune des lettres du message à transmettre)
  3. Ecrire la fonction de déchiffrement (elle applique \(f^{-1}\) à chacune des lettres du message reçu)
  4. Récupérer une table de fréquence des lettres (français ou anglais au choix), comme cette table par exemple.
  5. Ecrire une fonction Charlie_lettre qui prend un message crypté et qui essaie de le décrypter en utilisant la table de fréquence (il faut que le décrypté ait des fréquences de lettres les plus proches possibles de celle de la langue dans laquelle le message est écrit)

6.2. Indice de coincidence

L’indice de coincidence mesure la probabilité que deux lettres prises au hasard soient les mêmes dans un message. Il est en particulier dépendant de la langue dans laquelle le message est écrit, mais il est suffisament stable, le locuteur en locuteur et de message en message pour pouvoir être utilisé (un indicateur à forte vaiance est moins intéressant qu’un indicateur à faible variance, car pour converger vers la valeur de l’indicateur, il devient nécessaire de disposer de messages de longueur très importante).

Auteur: Yves-Jean DANIEL Yves-Jean DANIEL

Created: 2023-04-04 mar. 09:47