Décembre 2022
La sécurité n'aime pas l'imprévisible. Mais elle a impérativement besoin
d'un avenir incertain pour justement, assurer la sécurité !
Voilà qui parait bien étrange au premier abord.
Le mot de passe ?
Imagine que tu veuilles entrer dans ton club privé préféré.
Mouais
A l'entrée, le cerbère te réclame le mot de passe.
C'était il y a longtemps. Et dans une autre galaxie.
Si jamais quelqu'un écoute aux portes, il connaitra le mot de passe et pourra entrer.
Certes. C'est embêtant.
Tu as le même problème avec ta porte de garage, et ta télécommande.
Ah bon ?
Bah oui. Il faudra bien que la télécommande donne le mot de passe pour ouvrir
la porte du garage !
Elle n'a pas un code secret ?
Secret ? Elle envoie une suite d'impulsions en ondes électromagnétiques.
La télécommande et le récepteur se sont mis d'accord sur un mot de passe.
Si un mauvais mot de passe est envoyé, ça ne marchera pas.
Tout le monde peut écouter, à commencer par la porte puisqu'elle attend le code secret.
Tu veux dire qu'il suffit d'écouter, par exemple avec un autre récepteur ?
Puis de reproduire la suite d'impulsions. C'est ce qu'on appelle une replay attack, on rejoue le code.
😲Mais c'est très con !
Eve écoute le code, puis le rejoue. Pas terrible au niveau sécurité !
On pourrait crypter le code envoyé, le rendre incompréhensible, non ?
Primo, on dit chiffré, pas crypté
Deuxio, c'est une machine qui se fiche de la signification du code, elle veut juste la bonne suite de bits
Tertio, cela n'empêche pas de rejouer le message, chiffré ou non.
Oui, bon, d'accord, inutile de crypter chiffrer le message vu qu'on imite la vraie télécommande.
Une liste de mots de passe ?
Et oui. Pour bien faire, il faudrait changer de code après chaque usage.
Ah oui, va falloir faire une liste de codes, alors
🤔Et se mettre d'accord sur une méthode pour se servir de la liste.
Effectivement. Le plus simple est de passer au code suivant après chaque utilisation.
Pour ne pas se resservir du même code.
La télécommande et le récepteur se sont mis d'accord sur une liste de codes.
La télécommande a déjà tenté les deux premiers codes, le récepteur a vu uniquement le premier.
Le récepteur accepte néanmoins les codes suivants, qui n'ont pas été utilisés.
Les codes n'ayant jamais été utilisés, on ne peut pas les rejouer !
Oui, mais on ne va pas pouvoir avoir une liste infinie.
On fait quoi quand on arrive au bout ?
En pratique, si elle est assez longue, tu peux repartir du début sans trop de risques.
On appelle ça un code tournant, rolling code en anglais.
Et t'es gentil, mais on peut appuyer sur le bouton de la télécommande par inadvertance
(ou si le mouflet joue avec).
C'est vrai. C'est pour ça que l'on acceptera, par exemple, les 256 codes suivants dans la liste.
Et si on a dépassé les 256 ?
Ah ben là, c'est mort. Il faudra resynchroniser, probablement en appuyant sur un bouton
spécial du récepteur dans le garage, puis en appuyant sur la télécommande.
C'est d'ailleurs ce qu'il faudra faire la première fois, à l'installation.
Accessoirement, afin de pouvoir utiliser plusieurs télécommandes pour la même porte,
on identifie la télécommande en ajoutant son nom dans le message qui est envoyé.
Mais c'est secondaire, pas de secret particulier, il faut juste produire des
télécommandes avec un nom unique, généralement il s'agit d'un numéro de série
gravé dans le marbre du silicium.
Un générateur de mots de passe ?
Ah ben tiens, justement, la première fois, comment on établit la liste ?
C'est là que ça devient pénible.
On ne peut décemment pas demander à chaque utilisateur
d'entrer une liste de milliers de passwords -mais c'est ce qu'il faudrait faire,
avec des mots de passe longs comme le bras pour assurer un minimum de sécurité.
Et il faudrait un système de communication pour programmer tout ça pas piqué des vers,
genre clavier, écran, câbles de programmation... autant oublier ça.
Il faudrait générer des codes imprédictibles.
Imprédictible. Je te vois venir avec ton générateur aléatoire.
Mais il va falloir que les deux se mettent d'accord sur les codes !
Effectivement. On va utiliser pour ça un générateur de nombre pseudo-aléatoire.
Pseudo-aléatoire ?
Ben oui, si le générateur était vraiment imprédictible, alors absolument
personne ne pourrait connaitre le code, pas même la porte.
Aussi il faut que la télécommande et la porte possèdent le même générateur
aléatoire, et qu'ils se synchronisent.
Générateurs aléatoires & pseudo-aléatoires
Dans sa forme la plus simple, un générateur de nombre aléatoire
est une boite noire qui sort une suite de bits.
La propriété principale est que chaque nouveau bit généré est imprédictible.
La boite émet des bits, des zéros et des uns, de manière imprédictible.
On a en moyenne autant de zéros que de uns (les dés ne sont pas pipés).
Sauf que rendre un générateur aléatoire réellement imprédictible,
dans le sens où absolument personne au monde ne peut vous donner à coup sûr
la valeur de sortie, est très difficile à réaliser et à prouver.
C'est ce que nous verrons dans les futures pages à propos des sources
d'entropie.
Du coup, on distingue deux classes de générateurs de nombres aléatoires :
- Les vrais, réellement imprédictibles.
On les appelle TRNG pour True Random Number Generator.
Ils sont forcément tous différents, vu qu'ils sont vraiment aléatoires,
il n'en existe pas deux pareils au monde.
- Les faux, ceux qui générent des bits à partir d'une formule de calcul.
On les appelle PRNG pour Pseudo Random Number Generator. Ceux-là, on peut
les reproduire, les dupliquer.
Un générateur aléatoire réalisé par programme.
Celui-là est particulièrement raté, malgré la bonne volonté du programmeur.
Va falloir faire mieux !
Ici, ce qui nous intéresse, c'est un pseudo (PRNG), car on veut avoir la même suite
de nombres aléatoires sur la télécommande et le récepteur. Et comme c'est
un algorithme, il ne prendra pas beaucoup de place —on n'a pas besoin d'une
mémoire énorme afin stocker une collection de mots de passe, ce serait trop cher.
Je n'ai pas l'intention de décrire ici les mille et une façons de faire un
PRNG, mais je vais vous donner un exemple super-simple afin que vous puissiez
vous faire une idée.
Cet algorithme a été proposé par John von Neumann en 1946,
c'est la méthode middle-square (carré médian):
Soit le nombre « 1111 ».
- 11112 = 1234321
- on récupère les chiffres du milieu : 3432. C'est la sortie du générateur.
- 34322 = 11778624
- on récupère les chiffres du milieu : 7786.
et ainsi de suite.
On remarquera qu'il faut une "graine", une valeur initiale pour démarrer.
Ici, c'était "1111".
C'est un point très important, car il s'agit d'un algorithme, autrement dit
les nombres générés à partir d'une graine précise seront toujours les mêmes.
Structure générale d'un générateur pseudo-aléatoire.
C'est un algorithme + une graine initiale, et la sortie sera totalement connue.
Mais si on ne connait pas la graine, alors la sortie semble aléatoire.
Ces algorithmes ont (très souvent) une autre propriété:
ils ne génèrent pas de suites infinies, il existe
une période, vu que si on retombe sur la graine, alors on recommence la séquence.
Mais la période peut être très longue.
On peut faire un générateur infini assez facilement: par exemple, on calcule
les décimales de π ou du nombre d'Euler e.
On sait que la distribution des chiffres
présente toutes les propriétés attendues des TRNG, sauf que la sortie est très
prévisible, c'est embêtant une fois que l'on a reconnue cette suite...
On notera que l'algorithme n'est pas spécialement secret, par contre il vaut
mieux que la graine soit très secrète, évidemment.
Avec un PRNG, c'est mieux, mais pas incassable.
Avec un générateur de nombres pseudo-aléatoires,
la suite de mots de passe se construit facilement facilement.
Plus de liste de passwords: un générateur s'en occupe.
Le même algorithme est implanté sur la télécommande
et le récepteur de la porte de garage.
Les systèmes doivent être compatibles, que ce soit au niveau de l'algorithme,
mais aussi du système de télécommunication: bande de fréquence, système de codage,
et autres fadaises. Plus de détails sur mon site consacré aux
technologies de liaison, par exemple en 433 MHz.
Attends voir !
Tu n'es pas en train de m'entuber, là ?
Plait-il ?
Et si tout le monde utilise la même télécommande, on aura tous
les mêmes codes !
Il faudra que le fabriquant grave un code différent
dans chaque puce électronique, pour que toutes les graines soient différentes
ou du moins, avec une chance négligeable de collision.
Pour réduire les problèmes, il gravera aussi un numéro de
série unique, qui pourra servir d'identifiant.
Il faut donc faire une confiance totale au fabriquant.
Comme toujours. Il a forcément tous les codes, mais bon,
s'il est honnête, il aura détruit ces informations.
Mouais, pour ma voiture, je pense qu'il garde tout,
sinon, en cas de perte de clés, ce serait mort...
C'est une information qu'il faudra protéger au maximum !
L'accès doit être rendu difficile et très limité.
A noter : c'est le même système pour ce qu'on appelle les "one-time password" (Token OTP).
Mais si, ces espèces de tamagoshis que votre entreprise vous donne pour vous connecter.
Vous devez entrer votre identifiant, puis appuyer sur le tamagoshi pour qu'il vous donne
un mot de passe à recopier.
Ça marche pareil, sauf que c'est l'ordinateur distant
qui joue le rôle de la porte de garage... et vous devez vous coltiner la recopie
du mot de passe à la main.
Mais ce n'est pas la seule configuration où on a besoin d'un générateur
aléatoire en sécurité. Et dans l'immense majorité des cas, on a besoin
d'un vrai générateur, vraiment imprédicitible, un TRNG.