retour
Lyon, le 27/10/2023
Entropie
Par pure pédanterie,
(c'est aussi un vieux fantasme)
et comme il y a quelques équations à écrire ici et là,
j'ai décidé de rédiger cet article
(dont l'intérêt est très certainement discutable)
en LaTex.
\documentclass{article}
\usepackage{comment, multicol}
\usepackage{hyperref}
\usepackage{calc,pict2e,picture}
\usepackage{textgreek,textcomp,gensymb,stix}
\setcounter{secnumdepth}{2}
\title{De l'entropie de mots de passe générés}
\author{Rédigé avec $\varheartsuit$ par Gloumouth1}
\date{2023}
\begin{document}
\maketitle
\begin{abstract}
Nous montrons dans cet article que certaines méthodes sont à éviter pour générer des mots de passe.
\end{abstract}
\section{Définitions}
Soit $S_1$, $S_2$, ..., $S_n$ n ensembles de symboles avec $n > 1$, respectant
$ \forall i, j, 1 \leq i, j \leq n, S_i \cap S_j = \emptyset $ \\
Soit $$ S = \bigcup\limits_{i=1}^{n} S_i $$
Soit $a_1$, $a_2$, ..., $a_n$ tel que $ \forall i, 1 \leq i \leq n, a_i = \text{card}(S_i) $ \\
Soit $$A = \sum_{i=1}^{n} a_i$$
Soit $B$ le nombre de symboles contenus dans le mot de passe à générer.
\section{Algorithmes}
Dans cette section nous évoquerons plusieurs algorithmes de génération de mot de passe. \\
\subsection{Algorithme 1}
La première méthode consiste simplement à tirer au sort successivement les caractères dans S.
L'entropie du mot de passe vaut ici
$$ H(P_1) = B \log_2{A} $$
\subsection{Algorithme 2}
L'algorithme de génération consiste ici à générer un nombre fixé de caractères de chaque type.\\
Soient $b_1$, $b_2$, ..., $b_n$ tels que $b_i$ le nombre de caractères de $ S_i $ contenu dans le mot de passe
généré avec cet algorithme.
Remarquons que $$B = \sum_{i=1}^{n} b_i$$
L'entropie pour le choix des caractères de l'ensemble $ S_i $ vaut $ b_i \log_2(a_i) $, donc pour les n $ S_i $,
on obtient
$ \sum_{i=1}^{n} b_i \log_2(a_i) $
Vient ensuite la position des caractères de chacun des caractères de $ S_i $. \\
Le choix pour les caractères de $S_1$ apporte l'entropie
$$ \log_2(C_B^{b_1}) $$
Le choix pour $S_2$ apporte l'entropie
$$ \log_2(C_{B-b_1}^{b_2}) $$
Le choix pour $S_3$ apporte l'entropie
$$ \log_2(C_{B-b_1-b_2}^{b_3}) $$
Plus généralement, pour $S_i$ l'apport d'entropie est de
$$ \log_2(C_{B-\sum_{k=1}^{i-1} b_k}^{b_i}) $$
L'apport entropique du choix de la position des $S_i$ dans le mot de passe est donc
$$ \log_2(C_B^{b_1} C_{B-b_1}^{b_2} C_{B-b_1-b_2}^{b_3} \ldots C_{B-b_1-b_2-\ldots-b_{n-1}}^{b_n}) $$
$$ = \log_2(\frac{B!}{b_1!(B-b_1)!}. \frac{(B-b_1)!}{b_2!(B-b_1-b_2)!}.\frac{(B-b_1-b_2)!}{b_3!(B-b_1-b_2-b_3)!}.
\ldots. \frac{(B-b_1-b_2-\ldots-b_{n-1})!}{b_n!(B-b_1-b_2-\ldots-b_n)!} ) $$
$$ = \log_2(\frac{B!}{\prod_{i=1}^n b_i!}) $$
L'entropie vaut ici $$ H(P_2) = \sum_{i=1}^{n} b_i \log_2(a_i) + \log_2{\frac{B!}{\prod_{i=1}^n b_i!}} $$
\subsection{Algorithme 3}
L'algorithme consiste ici en la génération aléatoire de caractères dont chaque type a une position fixe.
L'entropie globale vaut donc plus simplement
$$ H(P_3) = \sum_{i=1}^{n} b_i \log_2(a_i) $$
\section{Applications numériques}
Prenons le cas de la génération d'un mot de passe de longueur 17, contenant des majuscules, des minuscules et des
chiffres.
Dans ce cas
$ S_1 = \{ 'a', 'b', \ldots, 'z' \} $,
$ S_2 = \{ 'A', 'B', \ldots, 'Z' \} $,
$ S_3 = \{ '0', '1', \ldots, '9' \} $ \\
Donc
$ a_1 = 26 $,
$ a_2 = 26 $,
$ a_3 = 10 $ et
$ A = 62 $\\
Prenons les hypothèses suivantes :
$ b_1 = 13 $,
$ b_2 = 2 $,
$ b_3 = 2 $ et
$ B = 17 $\\
Les entropies valent donc
$$
\begin{align*}
H(P_1) &= 17 \log_2{62} \\
&\approx 101,22 \text{ bits} \\
H(P_2) &= 26 \log_2(13) + 26 \log_2(2) + 10 \log_2(2) + \log_2{\frac{17!}{13! \ 2! \ 2!}} \\
&\approx 90,95 \text{ bits} \\
H(P_3) &= 26 \log_2(13) + 26 \log_2(2) + 10 \log_2(2) \\
&\approx 77,15 \text{ bits} \\
\end{align*}
$$
On voit donc que l'entropie de $P_1$ dépasse les 100 bits, ce qui selon l'ANSSI (Agence nationale de sécurité des
systèmes d'information)
est considéré comme un mot de passe fort, alors que $P_2$ est moyen et $P_3$ faible selon les critères de la même
agence, bien qu'ayant la même taille et les mêmes caractères possibles.
La méthode de génération seule fait toute la différence.
\section{Conjecture}
Nous proposons la conjecture suivante :\\
$$ H(P_1) > H(P_2) > H(P_3) $$
Ce qui revient à prouver que
$$ (\sum_{i=1}^{n} b_i) \log_2(\sum_{i=1}^{n} a_i) >
\log_2((\sum_{i=1}^{n} b_i)! \prod_{i=1}^n \frac{{a_i}^{b_i}}{b_i!}) >
\log_2(\prod_{i=1}^n {a_i}^{b_i}) $$
Ou encore
$$ {(\sum_{i=1}^{n} a_i)}^{(\sum_{i=1}^{n} b_i)} >
(\sum_{i=1}^{n} b_i)! \prod_{i=1}^n \frac{{a_i}^{b_i}}{b_i!} >
\prod_{i=1}^n {a_i}^{b_i} $$
Comme vu plus haut, la deuxième inégalité peut se reformuler comme suit :
$$ \prod_{i=1}^n C_{\sum_{k=i}^{n} b_k}^{b_i} . \prod_{i=1}^n {a_i}^{b_i} > \prod_{i=1}^n {a_i}^{b_i} $$
Ce qui permet de conduire aisément au résultat, mais pour la première inégalité, on va pas s'mentir, je vois pas
trop, et j'ai la flemme.
\section{Conclusion}
L'algorithme maximisant l'entropie parmi ceux parcourus dans cet article est probablement toujours le premier,
c'est-à-dire celui
qui consiste à choisir de manière équiprobable chacun des caractères indépendemment.
S'il est mal conçu, un algorithme peut générer des mots de passe d'entropie significativement plus faible,
donc plus vulnérables à une attaque comme l'a montré une application numérique.
Cependant, il reste à en apporter la preuve dans le cas général.
\end{document}
\\
\\
Mouais, où est la bibliographie ?
Ca donne une idée du sérieux de la démarche...
En tout cas ok,
LaTeX, c'est joli.
D'autant plus joli
que le rendu est exécuté
à la volée par votre navigateur
grâce à la librairie latex.js
Par ailleurs,
Pour la déconne,
j'ai posé la question à GPT-4.
Et je dois admettre que
si on fait abstraction d'une (petite) erreur de calcul à la fin,
le raisonnement est parfatiement exact.

Et je me demande s'il n'explique pas les choses
beaucoup plus clairement que moi.
Petit calculateur que j'ai écrit : ici
Article de l'ANSSI sur la force des mots de passe : ici
retour