Réseaux et cryptographie

Définition

Définition

Un réseau est un sous-groupe de \(\R^n\) engendré par une base de \(\R^n\).

Comme groupe, un réseau est isomorphe à \(\Z^n\), mais il a une structure géométrique supplémentaire héritée de l’espace ambiant \(\R^n\) : distance, volume.

Exemple

  • le réseau \(\Z^n\subset\R^n\). Comme on le verra, il faut avoir conscience que ce réseau n’est pas du tout le réseau typique, il est beaucoup trop régulier et symétrique.

  • réseau hexagonal \(\Z[j]\subset\C=\R^2\)

  • \(\Z[\sqrt 2]\subset \R^2\) n’est pas un réseau (sous-groupe dense de \(\R\))

  • toute matrice \(A\in\Gl_n(\R)\) définit le réseau \(A\Z^n\) engendré par les colonnes de \(A\).

Définition

Soit \(V=(v_1,\dots v_n)\) une base d’un réseau \(\Lambda\). Le domaine fondamental relativement à \(V\) est l’ensemble

\[D_V = V\times[0,1[^n=\set{\sum x_iv_i\in\R^n, 0\leq x_i\lt 1}\]

L’espace est pavé par les translatés du domaine par le réseau

\[\R^n = \bigcup_{x\in\Lambda} x+D_v\]

Définition

Soit \(\Lambda=A\Z^n\subset\R^n\) un réseau. Le volume de \(\Lambda\) est le volume d’un domaine fondamental

\[\Vol(\Lambda) = \Vol(\R^n/\Lambda) = \abs{\det(A)}\]

En crypto, on s’intéresse surtout aux réseaux entiers, c’est-à-dire aux sous-groupes de \(\Z^n\) de rang \(n\). Dans ce cas, le volume est le cardinal du groupe quotient

\(\Z^n/\Lambda\).

Une construction courante, le réseau du noyau modulo \(N\) d’une application linéaire :

\[\Lambda = \set{ x\in\Z^n, Ax\equiv 0\bmod N }\]

Exemple

Soit \(p\) un nombre premier et \(\lambda\in\F_p^\times\), on pose \(\Lambda=\set{(x,y), x=\lambda y\bmod p}\subset\Z^2\).

Une base est donnée par les vecteurs \((p,0)\) et \((\lambda,1)\), le réseau est de volume \(p\) (ce qui correspond au fait qu’une proportion \(1/p\) des vecteurs de \(\Z^2\) est dans le réseau).

Courts vecteurs

Trouver le plus petit vecteur d’un réseau est problème difficile, NP-dur en général https://people.csail.mit.edu/vinodv/6876-Fall2015/L10.pdf.

Pourtant, il est facile de démontrer qu’il existe nécessairement des vecteurs courts

Minkowski

Soit \(\Lambda\subset\R^n\) un réseau, on note \(V_n\) le volume de la boule unité. Si \(V_n R^n\geq \Vol(\Lambda)\), alors \(\Lambda\) contient un vecteur non nul de norme \(\leq 2R\).

Démonstration

La projection de la boule de rayon \(R\) sur \(\R^n/\Lambda\) ne peut pas être injective, deux vecteurs \(x,y\) de même image fournissent un vecteur \(x-y\) du réseau, de norme inférieure à \(2R\).

Corollaire

En notant \(\norm{v_1}\) le plus petit vecteur non nul, on a \(\norm{v_1}\leq 2\left(\frac{\Vol(\Lambda)}{V_n}\right)^{\frac 1n}\), où le volume de la boule

\[V_n = \frac{2\pi^{\frac{n}2}}{(n+1)\Gamma(\frac n2)} \sim \frac1{\sqrt{n\pi}}\left(\frac{2\pi e}n\right)^{\frac n2}\]

tend vers \(0\) pour \(n\to\infty\).

Exemple

Avec l’exemple précédent, le volume de la boule est \(V_2=\pi\), donc il existe un vecteur de norme \(x^2+y^2\leq (2\sqrt{\frac{p}{\pi}}^2< 2p\).

Si \(p\equiv -1\bmod 4\), on peut choisir \(\lambda\) tel que \(\lambda^2=-1\), alors le vecteur court est de norme \(x^2+y^2\equiv 0\bmod p\), on a donc \(x^2+y^2=p\).

Exemples de problèmes résolus à l’aide de vecteurs courts

Approximations rationnelles

Une approximation \(\pi\approx\frac ab\), \(b\leq B\), correspond à une petite valeur \(b\pi - a\). Pour se ramener à des valeurs entières, si l’on multiplie par la borne \(B\) et que l’on arrondit, les bonnes approximations correspondent à de petites valeurs entières de \(\delta_{a,b}=b\round{B\pi}-Ba\).

Par exemple pour \(B=10^4\), on pose le réseau

A = [ -10^4, round(10^4*Pi) ; 0 , 1 ]

La fonction qflll renvoie les coordonnées de vecteurs courts,

qflll(A)

et l’on retrouve effectivement les approximations usuelles de \(\pi\) : \(\tfrac{22}7\) et \(\tfrac{355}{113}\).

De manière générale, on a le résultat suivant.

Proposition

Soit \(\alpha\in\R\), et \(B>0\). Alors le réseau

\[(v_1,v_2)\Z^2=\begin{bmatrix}\round{B\alpha}&-B\\1&0\end{bmatrix}\Z^2\]

est de volume \(B\), il contient un vecteur \(v=av_1+b_2\) de norme \(\norm{v}\leq \sqrt{3}2\sqrt{B}\), et pour lequel on a l’approximation

\[\abs{ \alpha-\frac{a}b } \leq\frac{2\sqrt2}{b\sqrt{3B}} \leq\frac{4\sqrt2}{6b^2}\]

Démonstration

En dimension 2, une base réduite \(v,v'\) vérifie \(\Vol(\lambda)\geq \frac{\sqrt3}2\norm{v}^2\), donc ici \(\norm{v}\leq \frac{2}{\sqrt 3}\sqrt{B}\).

Notons \(r=b\round{B\alpha}-aB\) de sorte que \(v=av_1+bv_2=(r,b)\), alors

\[\begin{aligned} \abs{b\alpha-a} &\leq \frac1B\abs{bB\alpha-Ba} \\ &\leq \frac1B\abs{b(\round{B\alpha}-B\alpha)+b\round{B\alpha}-aB}\\ &\leq \frac1B\left(\abs{b}+\abs{r}\right) \\ &\leq \frac{\sqrt{2}\sqrt{b^2+r^2}}B \end{aligned}\]

Relations de dépendance linéaires

P = 1+3*x-7*x^2+3*x^4+x^5
r = polrootsreal(P)[1]

Supposons qu’on ne connaisse pas \(P(x)\), comment retrouver ce polynôme à partir d’une approximation d’une racine ?

B=10^3;
A = matconcat([matid(5),0;vector(5,k,round(B*r^(k-1))),round(B*r^5)])

Le réseau obtenu contient déjà de petits vecteurs, car \(r<1\). Si on fait le même jeu avec \(-1/r>1\), on obtient de grandes valeurs en dernière coordonnée, ce qui force un petit vecteur (dont on sait qu’il existe) à l’annuler.

r = -1/r;
B=10^3;
A = matconcat([matid(5),0;vector(5,k,round(B*r^(k-1))),round(B*r^5)])
qflll(A)

On reconnaît bien le polynôme (réciproque) comme plus court vecteur.

gp > lindep([1,Pi,Pi^2,Pi^3],5)
%6 = [19, -15, -16, 6]~
gp > 19 - 15*Pi-16*Pi^2+6*Pi^3
%7 = 9.9860522284574566383655397409785263529 E-5

Attaque de Wiener

La relation \(ed-k\varphi(n)=1\) implique que \(ed-kn = 1 - k (n-\varphi(n)) = O(k\sqrt n)\), avec \(k<d\).

On considère le réseau engendré par \(v_1=(e,\sqrt n)\) et \(v_2=(n,0)\), alors le vecteur \(w=dv_1-kv_2=(O(k\sqrt n),d\sqrt n)\) est de norme \(\norm{w}=O(d\sqrt n)\), et le réseau de volume \(n^{\frac 32}\).

Si \(d=O(n^{\frac14})\), alors \(w\) est un petit vecteur du réseau.

Bases

L’espace des réseaux de \(\R^n\) est donc le groupe \(\Gl_n(\R)/\Gl_n(\Z)\) (bases modulo changement de base).

Définition

Si \(\Lambda\subset\Z^n\) est un réseau entier, la forme normale de Hermite est une base bien définie du réseau.

On a unicité de cette base, mais d’un point de vue géométrique elle est catastrophique : le domaine fondamental est complètement applati, les vecteurs de la base sont gigantesques.

Il existe toujours une base dont le premier vecteur est le plus court vecteur, et il existe des bases

SVP, CVP

Définition

On appelle Shortest Vector Problem le problème de déterminer le plus court vecteur d’un réseau, et Closest Vector Problem celui de déterminer le vecteur du réseau le plus proche d’un point de \(\R^n\).

Ce sont deux problèmes très durs dès que le réseau n’a pas de structure particulière et que la dimension augmente.

Voir par exemple le jeu Cryptris https://cryptris.nl/index_fr.html pour se convaincre qu’obtenir de petits vecteurs à partir d’une mauvaise base est très compliqué.

Pour résoudre le CVP, on a besoin d’une base la plus orthogonale possible.

Soit \(v_1\) le plus court vecteur du réseau, alors on peut disposer des boules de diamètre \(\norm{v_1}\) aux points du réseau qui sont tangentes : un réseau donne un empilement de sphères.

Réduction

Définition

Une base d’un réseau est une base en tant que \(\Z\)-module. Deux bases d’un réseau diffèrent par un élément de \(Gl_n(\Z)\).

Exemple

Le réseau \(\Z^2\) a pour base \(v_1=(4,3)\) et \(v_2=(3,2)\).

La réduction consiste à obtenir la base la plus agréable possible pour un réseau. Une «bonne base» est

  • formées de vecteurs courts

  • qui sont aussi orthogonaux que possible, (c’est-à-dire que les angles sont minorés).

L’intérêt de ce second critère est que les courts vecteurs du réseau aient de petits coefficients sur la base, et que le domaine fondamental contienne la plus grande boule possible.

Attention, quand la dimension augmente la géométrie est pleine de surprises :

  • la famille libre des plus courts vecteurs n’est pas toujours une base

  • la plus petite base pour l’ordre lexicographique sur les normes (base de Hermite) est en général loin d’être orthogonale.

Cas de la dimension 2

Par exemple, pour un réseau de \(\R^2\), si l’on prend pour \(v_1\) le plus petit vecteur et qu’on renormalise en posant \(v_1=(0,1)\), \(v_2\) est en dehors du cercle unité, et par translations de \(v_1\) on peut le choisir dans la bande \(-1/2,1/2\).

Cela signifie que

  • le projeté orthogonal \(v_2^\bot\) de \(v_2\) sur \(\prodscal{v_1}^\bot\) est de norme supérieure à \(\frac{\sqrt 3}2=\frac{\sqrt 3}2\norm{v_1}\)

  • la composante de \(v_2\) sur \(v_1\), c’est-à-dire le coefficient \(\mu\) de l’égalité \(v_2=v_2^\bot+\mu v_1\), est inférieure à \(1/2\).

Réduction de Hermite

En généralisant on obtient la définition suivante

Définition

Une base \((\alpha,\beta)\)-réduite d’un réseau \(\Lambda\) est une base \(v_1,\dots v_n\) telle que pour tout \(i\), si on note \(v_i^\bot\) la projection de \(v_i\) sur \(\prodscal{v_{i+1},\dots v_{i+n}}^\bot\), alors

  • \(\norm{v_{i+1}^\bot}\geq \alpha \norm{v_{i}^\bot}\)

  • en écrivant \(v_i = v_i^\bot + \sum_{j<i} \mu_{i,j} v_j^\bot\) on a \(\abs{\mu_{i,j}}\leq\beta\).

La traduction en termes de matrices est plus simple à comprendre : soit \(v_1,\dots v_n\) une base et \((v_1^\bot,\dots v_n^\bot)\) son orthogonalisée de Gram-Schmidt.

En disposant les vecteurs en colonne, le procédé d’ortogonalisation de Gram-Schmidt s’écrit

\[\begin{pmatrix} \vert&&\vert\\ v_1&\cdots&v_n\\ \vert&&\vert\\ \end{pmatrix} = \begin{pmatrix} \vert&&\vert\\ v_1^\bot&\cdots&v_n^\bot\\ \vert&&\vert\\ \end{pmatrix} \begin{pmatrix} 1&\star&\star\\ &\ddots&\star\\ &&1\\ \end{pmatrix}\]

où les coefficients \(\star\) de la matrice de droite sont les composantes de projection \(\frac{\prodscal{v_i^\bot,v_j}}{\norm{v_i^\bot}_2^2}\).

Le critère de \(\beta\)-reduction consiste simplement à prendre les coefficients \(\abs{\star}\leq\frac12\), ce qui est trivial par opérations sur les colonnes.

Par ailleurs, en notant \(D\) la matrice diagonale \((\norm{v_i^\bot})_i\), la matrice des \(v_i^\bot\) s’écrit \(KD\), où \(K\in O_n(\R)\) est la matrice de la base orthonormale \(\frac{v_i^\bot}{d_i}\).

Le critère de réduction \(\alpha\) consiste à imposer que la diagonale \(D\) soit «pseudo-croissante» de raison au moins \(\alpha\).

On obtient donc le théorème de Hermite d’existence d’une base réduite

Hermite, Siegel

Soit

\[%T_\beta=\set{(t_{i,j}), t_{i,i}=1, \abs{t_{i,j}}\leq\beta, 1\leq i\lt j\leq n} T_\beta=\set{\begin{pmatrix} 1&\star&\star\\ &1&\star\\ &&1\\ \end{pmatrix}, \abs{\star}\leq \beta }\]

l’ensemble des matrices triangulaires supérieures bornées par \(\beta\), et

\[%D_\alpha=\set{(d_{i,i}), \alpha d_{i,i} \leq d_{i+1,i+1}, 1\leq i\lt n} D_\alpha=\set{\begin{pmatrix}d_1&&\\&\ddots&\\&&d_n\end{pmatrix}, d_{i+1}\geq \alpha d_{i}, 1\leq i\lt n}\]

l’ensemble des matrices diagonales \(\alpha\)-échelonnées.

Si \(\alpha\leq\frac{\sqrt3}2\) et \(\beta\geq\frac12\), alors

\[\Gl_n(\R) \subset O_n(\R)D_\alpha T_\beta \Gl_n(\Z).\]

En d’autres termes, tout réseau possède une base \(\alpha,\beta\)-réduite.

Démonstration

La démonstration, dans les premiers paragraphes de [Borel-IntroGroupesArithmetiques], est celle que l’on va donner de l’algorithme LLL ci-dessous,

Une base réduite au sens de Hermite n’est pas unique, mais elle se calcule en temps polynomial : c’est l’algorithme appelé LLL.

algorithme LLL

Soit \(V=(v_1,\dots v_n)\) une base de \(\R^n\), on considère la procédure suivante :

  • calculer la base orthogonale \(v_1^\bot,\dots v_n^\bot\)

  • ajuster chaque \(v_j\) par une combinaison entière des \(v_i,i<j\) pour que \(-\beta < \star = \frac{\prodscal{v_i^\bot,v_j}}{\norm{v_i^\bot}^2}\leq \beta\)

  • vérifier pour \(i=1,\dots n-1\) que \(\norm{v_{i+1}^\bot}\geq \alpha\norm{v_i^\bot}\), sinon échanger \(v_i\) et \(v_{i+1}\) et reprendre au début.

Si \(\alpha\leq\frac{\sqrt{3}}2-\epsilon\) et \(\beta\geq\frac12\), cette procédure termine en un nombre d’opérations polynomial en \(n,\frac1\epsilon\) et produit une base \(\alpha,\beta\) réduite.

Démonstration

Il suffit de que l’on réalise un nombre polynomial d’échanges \((i,i+1)\), on le montre en considérant le volume du réseau engendré par les \(i\) premiers vecteurs \(v_1,\dots v_i\).

Après échange des vecteurs \(i,i+1\), les vecteurs orthogonaux \(v_1^\bot,\dots v_{i-1}^\bot\) ne changent pas, tandis que l’on a désormais au rang \(i\) le vecteur \(\tilde v_{i}^\bot = v_{i+1}^\bot+a_{i,i+1}v_i^\bot\) (\(v_{i+1}^\bot\) était réduit par rapport à l’ancien \(v_i^\bot\), ce n’est plus le cas).

Le volume du réseau engendré par les \(i\) premiers vecteurs est \(\prod_{j\leq i}\norm{v_j^\bot}\). Lors de l’échange, le carré du volume décroît d’un facteur \(\frac{\norm{\tilde{v_{i}^\bot}}^2}{\norm{v_{i}^\bot}^2} \leq \alpha^2+\frac14 < 1\) (on utilise l’orthogonalité pour développer la norme).

Puisque le réseau est discret, il ne peut y avoir qu’un nombre logarithmique d’échange sur chaque indice \(i\), d’où la terminaison et la complexité.

La traduction matricielle est la suivante

  • on part d’une matrice \(V\in\Gl_n(\R)\)

  • calculer l’orthogonalisation \(V = V^\bot A\), \(A\) triangulaire supérieure, ainsi que \(d=(\norm{v_i^\bot})\).

  • calculer \(U\in\Gl_n(\Z)\) telle que \(AU\) ait des coefficients \(\abs{\star}\leq \beta\)

  • si il existe \(i\) tel que \(d_{i+1}\leq \alpha d_i\), échanger les colonnes \(i\) et \(i+1\) de \(U\) recommencer en remplaçant \(V\) par \(VU\).

Retourner la base \(VU\).

Pour \(\alpha<\frac{\sqrt3}2\) et \(\beta>\frac12\) on a un algorithme de calcul polynomial.

Démonstration

Le principe : Si \(v_1,\dots v_n\) est une base, on considère son orthogonalisée de Gram-Schmidt \(\overline{v_1},\dots \overline{v_n}\) et on se ramène en décalant \(v_i\) d’une combinaison de \(v_j, j<i\) à des coordonnées \(a_i,j=\prodscal{v_i,\overline{v_j}}\leq \beta\). On vérifie la condition \(\alpha\), s’il existe \(i\) tel que \(\norm{\overline{v_i+1}}<\alpha\norm{\overline{v_i}}\) on échange les deux vecteurs et on recommence depuis le début.

Théorème : l’algorithme termine en temps polynomial.

En pratique, rendre l’algorithme efficace est un sujet de recherche complexe.

Théorème

Les bases réduites satisfont

\[\norm{v_i}\leq 2^{\frac{n(n-1)}{4(n-i+1)}} Vol(\Lambda)^{\frac{1}{n-i+1}}\]

en particulier

\[\norm{v_1}\leq 2^{\frac{n-1}{4}} Vol(\Lambda)^{\frac{1}{n}}\]

à comparer avec la borne de Minkowski

\[\norm{w_1}\leq 2 \left(\frac{Vol(\Lambda)}{V_n}\right)^{\frac{1}{n}}\]

Un des buts de la théorie est d’écrire des

Cryptographie et réseaux

  • Les cryptosystèmes construits à partir de réseaux : utilisent en général un problème CVP, facile à résoudre si on a une bonne base (clef privée) et impossible avec une mauvaise base (clef publique).

    Un message est un petit vecteur. Il est dans le domaine fondamental d’une bonne base, mais pas dans celui d’une mauvaise. On chiffre et déchiffre en transmettant l’image du vecteur dans le domaine fondamental.

  • Les cryptosystèmes attaqués via les réseaux : sac à dos, Coppersmith

Le cryptosystème Sac à Dos

On appelle sac à dos le problème combinatoire suivant : soit \(c\) un entier, la capacité du sac, et \(a_1,\dots a_n\) des entiers positifs. On cherche à écrire \(c=\sum e_ia_i\) pour des coefficients \(e_i\in\set{0,1}\).

C’est-à-dire que l’on veut sélectionner des objets dans un ensemble qui permettent de remplir exactement le sac-à-dos.

C’est un problème NP-complet.

Cryptosystème de Merkle-Hellman

On prend une suite \(a_i\) dite supercroissante, c’est-à-dire telle que pour tout \(i\), \(a_i>\sum_{j<i}a_j\).

Dans ce cas le problème de sac-à-dos se résout trivialement par approche gloutonne (on a \(m_n=1\Leftrightarrow c\geq a_n\), puis \(m_{n-1}=1\Leftrightarrow c-m_na_n \geq a_{n-1}\), etc.)

On mélange cette suite de poids \(a_i\) comme suit : on choisit un module \(N>\sum a_i\), un élément aléatoire \(K\in(\Z/N\Z)^\times\), et on pose \(b_i=K a_i\bmod N\).

  • La clef publique est la suite de poids modifiés \(b_i\), de longueur \(n\).

  • On chiffre un message \(m\in\set{0,1}^n\) par l’entier \(c=\sum m_i b_i\).

  • La clef privée est la suite supercroissante \(a_i\), et les entiers \(N,K\).

  • Pour déchiffrer, on se ramène au problème facile en posant \(K^{-1}c\bmod N = \sum m_i a_i\bmod N\), ce qui permet de retrouver les \(m_i\).

Attaque LLL

La stratégie habituelle est de trouver le vecteur \(m_i\) comme vecteur court \((m_0,\dots m_n,0)\) du réseau engendré par les colonnes de

\[A = \begin{pmatrix} 1&0&0&0&0\cr 0&\ddots&0&0&\vdots\cr 0&0&\ddots&0&\vdots\cr 0&0&0&1&0\cr b_1&\cdots&\cdots&b_n&-c\cr \end{pmatrix}\]

Toutefois, il est probable que ce réseau contienne beaucoup d’autres vecteurs \((x_1,\dots x_n,\epsilon)\) avec \(\sum x_ib_i = c+\epsilon\). Pour ne sélectionner que des solutions atteignant l’égalité \(\sum x_ib_i=c\) on met un grand poids \(B\approx\sqrt n\) à la dernière ligne, de sorte qu’un vecteur ne satisfaisant pas l’égalité est automatiquement grand.

\[A_B = \begin{pmatrix} 1&0&0&0&0\cr 0&\ddots&0&0&\vdots\cr 0&0&\ddots&0&\vdots\cr 0&0&0&1&0\cr Bb_1&\cdots&\cdots&Bb_n&-Bc\cr \end{pmatrix}\]

Un autre problème est que contrairement à la solution du sac à dos, les courts vecteurs s’autorisent à prendre indifféremment des coefficients positifs et négatifs.

Une astuce pour privilégier les coefficients \(0\) et \(1\) consiste à considérer le réseau

\[A_B' = \begin{pmatrix} 1&0&0&0&-\frac12\cr 0&\ddots&0&0&\vdots\cr 0&0&\ddots&0&\vdots\cr 0&0&0&1&-\frac12\cr Bb_1&\cdots&\cdots&Bb_n&-Bc\cr \end{pmatrix}\]

Le vecteur correspondant à la combinaison de colonnes \((m_1,\dots m_n,1)\) d désormais pour composantes \((m_1-\frac12,\dots m_n-\frac12,0)\) de norme \(\sqrt{n}/2\) puisque chaque composante vaut \(\pm\frac12\).

On obtient un résultat similaire en prenant le réseau

\[A_B' = \begin{pmatrix} n+1&-1&-1&-1&-1\cr -1&\ddots&-1&-1&\vdots\cr -1&-1&\ddots&0&\vdots\cr -1&-1&-1&n+1&-1\cr Bb_1&\cdots&\cdots&Bb_n&-Bc\cr \end{pmatrix}\]

et une constante \(B > n\).

On appelle densité du problème la quantité

\[d = \frac{N}{\log_2{b_n}}\]

Algorithme de Coppersmith

Cet algorithme permet de déterminer les «petites racines» de polynômes de «petit degré» modulo un entier \(n\) non premier.

Remarque

  • Il est facile de trouver les racines modulo \(p\) d’un polynôme, en calculant d’abord \(f_0 = \pgcd(f,x^p-x)\) pour isoler le facteur scindé modulo \(p\), puis si ce facteur est de degré \(>1\) on le décompose en calculant \(\pgcd(f_0,(x+a)^{\frac{p-1}2}-1)\) pour des valeurs aléatoires de \(a\), ce qui sépare les racines \(x\) telles que \(x+a\) est un carré (technique de Cantor-Zassenhaus).

  • Tout algorithme permettant de trouver une racine d’un polynôme modulo \(n\) permet de factoriser \(n\) (on obtient en particulier les racines carrées).

La première étape est de montrer qu’il est facile de calculer les petites racines de polynômes à petits coefficients, puisque ce sont en réalité des racines dans \(\Z\).

Lemme

Soit \(f(x)\in\Z[x]\) de degré \(n\), si

  • \(f(x_0)\equiv 0\bmod b^m\) avec \(\abs{x_0}\leq X\)

  • \(\norm{f(xX)}_2 < \frac{b^m}{\sqrt(n)}\)

alors \(f(x_0)=0\) dans \(\Z\).

Démonstration

On applique Cauchy-Schwartz \(\abs{f(x_0)}=\abs{\sum a_ix_0^i}\leq\sum \abs{a_iX^i}\leq \sqrt n\norm{f(xX)}_2<n\) donc la congruence à \(0\) est en réalité une égalité.

Soient maintenant \(f(x)\) un polynôme dont on sait qu’il a une racine \(f(x_0)\equiv 0\bmod b\), où \(x\leq X\) et \(b\) est un diviseur de \(N\), avec \(b\geq N^\beta\).

\(b\) et \(x_0\) sont les inconnues, tandis que les paramètres \(X,N,\beta\) sont connus. Il suffit de déterminer \(x_0\), puisqu’on retrouve ensuite \(b\) en calculant \(\pgcd(f(x_0),N)\).

On se ramène au lemme en déterminant un polynôme \(g(x)\) dont \(x_0\) est racine, et qui a de petits coefficients : la stratégie est de construire un réseau de tels polynômes pour obtenir une combinaison linéaire petite.

Si \(f(x_0)\equiv 0\bmod b\), alors \(N^ix_0^jf(x_0)^k\equiv 0\bmod b^{i+k}\), de sorte que les polynômes \(g_{i,j}(x) = N^{m-i}x^jf^i(x)\) vérifient \(g_{i,j}(x_0)\equiv 0\bmod b^m\), ainsi que toute combinaison linéaire.

On considère le réseau engendré par les coefficients des \(g_{i,j}(xX)\), s’il possède un vecteur de norme \(\norm{g}_2\leq \frac{b^m}{\sqrt n}\), on a gagné. On choisit \(X\) le plus grand possible pour que les bornes LLL permettent d’obtenir un tel \(g\).

Coppersmith

Soit \(N\) un entier composé possédant un diviseur \(b\geq N^\beta\). Soit \(f(x)\in\Z[x]\) un polynôme unitaire de degré \(\delta\). Alors on peut trouver toutes les solutions \(x_0\) de l’équation \(f(x)\equiv 0\bmod b\) telles que

\[\abs{x_0}\leq \frac12N^{\frac{\beta^2}{\delta}-\epsilon}\]

en temps polynomial en \(\log(N),\delta,\frac1\epsilon\).

Démonstration

voir May [MayRSA].

L’attaque ROCA

Autrement dit, «Coppersmith, le retour», 2016-2017.

La société Infineon est un poids lourd des semiconducteurs embarqués. Elle commercialise des solutions cryptographiques, par exemple des cartes d’identité numériques sécurisées. À ce titre, elle a sa propre bibliothèque de cryptographie RSA, très largement utilisée dans ce contexte.

En 2016 des analystes ont repéré des anomalies statistiques sur les clefs publiques commercialisées par cette société et découvert une faille majeure permettant de factoriser les clefs publiques.

La seule publication du fait que les clefs n’étaient pas robustes a permis à d’autres cryptographes de découvrir la faille et reconstituer l’attaque en quelques jours.

Reconstitution

Quand on génère des premiers RSA, la stratégie est de tirer des entiers au hasard et de tester leur composition. Pour gagner du temps, on peut se restreindre à tirer des entiers impairs, puis non divisibles par \(3\), etc.

Une stratégie acceptable est de tirer au hasard des entiers \(a_i\neq 0\bmod p_i\) et d’imposer que \(p\) soit congru à \(a_i\) modulo \(p_i\), ie à une valeur \(A\) modulo \(M=\prod p_i\).

En effet, le choix a priori de congruences indépendantes ne modifie par la distribution finale, si l’on choisit ces congruences de manière uniforme et indépendante pour chaque choix de premier.

En revanche, des versions erronées de cette stratégie seraient de

  • conserver la valeur \(A\) entre tirages de premiers distincts

  • choisir \(A\) directement modulo \(M\) par une méthode qui n’assure pas une distribution uniforme sur \((\Z/M\Z)^\times\).

En observant les clefs Infineon, les cryptographes se sont rendus compte qu’elles n’étaient pas du tout distribuées uniformément modulo les petits premiers, ce qui correspond à la seconde erreur.

La démarche adoptée par les programmeurs d’Infineon est la suivante : ils prennent un très grand produit de premiers successifs \(M\), et cherchent \(p\) congru à \(A=e^a\bmod M\)\(e=65537=2^{16}+1\) est l’exposant de chiffrement, et \(a\) est un exposant tiré aléatoirement avant le choix de \(p\).

De cette manière on évite de considérer les entiers divisibles par de petits nombres premiers, ainsi que ceux qui sont congrus à \(1\) modulo \(e\).

Concrètement, pour un premier \(p=kM+(e^a\bmod M)\) de 256 bits, le module \(M\) est de \(219\) bits (produit des 39 premiers inférieurs à 167), ainsi que l’exposant \(a\), et le multiplicateur \(k\) de \(37\) bits.

On a bien l’impression que le double choix de \(k\) et \(a\) se fait dans un espace de \(219+37=256\) bits, mais en réalité le sous-groupe \(\prodscal{e}\bmod M\) engendré par \(e\) est de taille au plus \(\ppcm_{p\leq 167}(p-1) \approx 2^{61}\) dans \((\Z/M\Z)^\times\) qui n’est pas du tout cyclique. On choisit donc \(p\) dans un sous-ensemble minuscule.

Comment factoriser ? si l’on connaît \(a\) c’est facile, on connaît alors \(p\bmod M\) avec \(M>\sqrt N\), ce qui permet d’appliquer l’attaque de Coppersmith sur les bits de poids faible de \(p\).

On ne connaît pas \(a\), et l’attaque sur \(a\) est de type force brute, mais avec quelques astuce.

D’abord l’espace de recherche (60 bits) est grand, mais puisqu’on peut appliquer Coppersmith tant que \(M>\sqrt N\), on peut artificiellement prendre pour \(M\) un produit minimal de premier, ce qui diminue la taille du groupe \(\prodscal{e\bmod M}\).

Par exemple, \(M'=\prod_{p\leq 103}p\) a plus de 128 bits, et \(e\) est d’ordre \(\lambda<2^{39}\) modulo \(M'\). Cela vaut aussi la peine de chercher un sous-produit différent \(\prod_{i\in I}p_i>\sqrt N\) qui minimise l’ordre du groupe \(\ppcm_{i\in I}(p_i-1)\).

Ensuite, puisque les deux facteurs \(p\equiv e^a\bmod M'\) et \(q\equiv e^b\bmod M'\) sont construits de la même manière, il suffit de déterminer \(a\) ou \(b\) modulo \(\lambda\), sachant que l’on connaît la somme \(a+b\) puisque \(N\equiv e^{a+b}\bmod M'\). L’intervalle \([\frac{a+b}2,\frac{a+b+\lambda}2]\) contient \(a\) ou \(b\).

https://crocs.fi.muni.cz/_media/public/papers/nemec_roca_ccs17_preprint.pdf