Lipsum.dev

Groupes, logarithmes et confidentialité persistante

26 novembre 2020 — Cryptographie, Go, Diffie-Hellman

Le protocole TLS (anciennement SSL) permet de sĂ©curiser les communications sur Internet — authentification, contrĂŽle d’intĂ©gritĂ© et confidentialitĂ© des Ă©changes.

Ce protocole dĂ©finit notamment un handshake au cours duquel client et serveur s’accordent sur le choix de la suite cryptographique Ă  utiliser pour sĂ©curiser la communication ultĂ©rieure et Ă©changent des clefs cryptographiques.

La page SSL Labs permet de scanner un serveur et de déterminer les versions de TLS et des suites cryptographiques (cipher suites) supportées.

Voici un extrait du résultat pour lipsum.dev :

SSL Labs lipsum.dev

On constate en particulier que le format des suites cryptographiques a changé avec TLS 1.3.

Dans la RFC 8446 qui définit ce protocole il est indiqué :

Static RSA and Diffie-Hellman cipher suites have been removed; all public-key based key exchange mechanisms now provide forward secrecy.

Nous proposons ici de présenter quelques notions mathématiques qui permettent la mise en oeuvre de cette confidentialité persistante (forward secrecy).

En particulier, TLS 1.3 repose sur des variantes d’un mĂ©canisme d’échange de clefs imaginĂ© en 1976 et utilisant des concepts mathĂ©matiques issus de la thĂ©orie des groupes.

Un peu de théorie

Une des caractĂ©ristiques des mathĂ©matiques est l’abstraction.

Cette abstraction consiste parfois à observer différents ensembles, les opérations associées et en déduire des structures communes.

L’une des structures algĂ©briques les plus classiques est celle de groupe, qui intervient dans de nombreuses branches des mathĂ©matiques mais aussi en physique thĂ©orique, cristallographie, etc.

Structure de groupe

Un groupe est un ensemble GG muni d’une opĂ©ration (notĂ©e ici ∗*) qui permet d’effectuer des calculs sur cet ensemble en associant Ă  deux Ă©lĂ©ments a,ba, b un troisiĂšme Ă©lĂ©ment c=a∗bc = a * b de GG.

Pour que cette opération définisse une structure de groupe, on exige :

  • l’opĂ©ration est associative : a∗(b∗c)=(a∗b)∗ca * (b * c) = (a * b) * c (on omettra donc les parenthĂšses)
  • il existe un Ă©lĂ©ment neutre e∈Ge \in G tel que g∗e=e∗g=gg * e = e * g = g pour tout Ă©lĂ©ment gg du groupe GG
  • les Ă©lĂ©ments de GG sont inversibles : pour tout a∈Ga \in G, il existe b∈Gb \in G tel que a∗b=b∗a=e{a * b = b * a = e}.
    Sous ces conditions, on montre que l’inverse est unique — je vous laisse le vĂ©rifier en exercice. On le notera a−1a^{-1}, ou −a-a lorsque l’opĂ©ration du groupe est l’addition ++.
Exemples
  • L’ensemble Z\Z muni de l’opĂ©ration d’addition ++ est un groupe.
    L’« inversion » de nn consiste alors Ă  prendre son opposĂ© −n-n.
  • L’ensemble Q∗\Bbb{Q}^{*} des nombres rationnels non nuls muni de l’opĂ©ration de multiplication ×\times est un groupe.
    L’inversion du nombre ab\frac{a}{b} (avec a,ba, b entiers non nuls) donne alors ba\frac{b}{a}.

Exponentiation et logarithme

L’exponentiation en base gg consiste Ă  appliquer l’opĂ©ration ∗* de façon itĂ©rĂ©e Ă  un Ă©lĂ©ment gg d’un groupe GG.

On dĂ©finit ainsi g0=eg^0 = e puis par rĂ©currence gn+1=g∗gng^{n+1} = g * g^n pour n∈Nn \in \N.

Exemples
  • L’exponentiation de l’addition sur Z\Z correspond Ă  la multiplication, par exemple : a+a+a+a=4a{a + a + a + a = 4a} (aa dĂ©signant un entier quelconque)
  • La notation avec un exposant est rĂ©servĂ©e Ă  l’exponentiation de la multiplication, qui correspond Ă  la classique « puissance n-Ăšme » : a×a×a×a=a4{a \times a \times a \times a = a^4}
Exponentiation rapide

Pour calculer gng^n, on peut naĂŻvement effectuer des multiplications successives pour calculer la suite g,g2,g3,...,gng, g^2, g^3, ..., g^n.

Si l’on procùde ainsi, le nombre de multiplications à effectuer est n−1n-1.

Il existe une approche beaucoup plus efficace qui consiste Ă  multiplier les rĂ©sultats intermĂ©diaires par eux-mĂȘmes.

Par exemple, pour calculer h=g42h = g^{42}, on peut remarquer que 42=1010102{42 = 101010_2} (notation binaire) puis :

  • On part de h=eh = e (Ă©lĂ©ment neutre)
  • On calcule successivement g,g2,g4=(g2)2,g8=(g4)2,g16=(g8)2,g32=(g16)2g, g^2, g^4 = {(g^2)}^2, g^8 = {(g^4)}^2, g^{16} = {(g^8)}^2, g^{32} = {(g^{16})}^2, en multipliant hh par g2kg^{2^k} Ă  l’étape kk si le bit correspondant en notation binaire est Ă  11.
  • Le nombre obtenu est dans notre cas g2∗g8∗g32=g42g^2 * g^8 * g^{32} = g^{42}.

Ce calcul fait intervenir 55 multiplications au lieu des 4141 de la mĂ©thode naĂŻve. Pour un exposant nn, ce nombre de multiplications est de l’ordre de log⁥2(n)\log_2(n).

Notons que cet algorithme d’exponentiation rapide ne fait aucune hypothùse sur le groupe dont il est question ni sur la loi de composition ∗*.

đŸ’»  En voici une implĂ©mentation (en Go), dans le cas classique de la multiplication des entiers :

// Computes a^n in O(log n) steps
func Exponentiate(a int, n int) int {
res := 1
for n > 0 {
if n%2 == 1 {
res *= a
n = (n - 1) / 2
} else {
n /= 2
}
a *= a
}
return res
}
Logarithme

Pour un groupe GG et un Ă©lĂ©ment gg de ce groupe, le problĂšme du logarithme en base gg consiste Ă  rĂ©soudre l’équation gn=hg^n = h d’inconnue nn.

Suivant les cas, il existera zĂ©ro, une ou plusieurs solutions nn Ă  cette Ă©quation — parfois une infinitĂ©.

Groupes cycliques

Un groupe cyclique est un cas particulier de groupe qui a les propriétés additionnelles suivantes :

  • GG est fini, on notera nn son nombre d’élĂ©ments.
  • GG est monogĂšne, c’est-Ă -dire qu’il existe un Ă©lĂ©ment gg Ă  partir duquel on peut obtenir tous les autres par exponentiation.

On a alors G={g0,g1,...,gn−1}{G = \{g^0, g^1, ..., g^{n-1}\}} et nĂ©cessairement (je vous laisse le prouver) gn=g0=eg^n = g^0 = e.

Calcul du logarithme discret

Le logarithme (discret) en base gg sur un groupe cyclique GG Ă  nn Ă©lĂ©ments et gĂ©nĂ©rĂ© par gg peut ĂȘtre dĂ©fini comme une fonction log⁥g:G→{0,1,...,n−1}\log_g: G \to \{0, 1, ..., n - 1 \} qui vĂ©rifie glog⁥g(h)=hg^{\log_g(h)} = h pour tout h∈Gh \in G.

Cette relation ne donne a priori ni formule explicite de calcul ni algorithme autre qu’une mĂ©thode par force brute consistant Ă  tester successivement avec 0,1,2,...,n−10, 1, 2, ..., n - 1.

On effectue alors en moyenne de l’ordre de nn opĂ©rations d’exponentation.

Il est cependant possible de le calculer de façon plus efficace :

  • sur n’importe quel groupe cyclique, par exemple avec l’algorithme baby-step giant-step que nous dĂ©crivons ci-dessous
  • ce nombre d’opĂ©rations peut encore ĂȘtre rĂ©duit si la dĂ©composition de nn en produit de nombres premiers vĂ©rifie certaines conditions (algorithme de Pohlig-Hellman)
  • sur des cas particuliers de groupes, d’autres considĂ©rations peuvent amener Ă  rĂ©duire drastiquement la complexitĂ© du problĂšme
💡 Algorithme « Baby-step giant-step »

Ce paragraphe visant à présenter cet algorithme est facultatif, vous pourrez librement y revenir ensuite.

Cet algorithme proposĂ© en 1971 permet d’obtenir log⁥g(h)\log_g(h) en un nombre d’opĂ©rations de l’ordre de n\sqrt{n}.

Notons G={g0,g1,...,gn−1}G = \{g^0, g^1, ..., g^{n-1}\} un groupe cyclique Ă  nn Ă©lĂ©ments et NN l’arrondi supĂ©rieur de n\sqrt{n} (notĂ© N=⌈n⌉N = \lceil \sqrt{n} \rceil).

Définissons alors :

  • Babies={0,1,2,...,N−1}\textnormal{Babies} = \{ 0, 1, 2, ..., N-1 \} les entiers de 00 Ă  N−1N-1 par pas de 11
  • Giants={0,N,2N,...,(N−1)N}\textnormal{Giants} = \{ 0, N, 2N, ..., (N-1)N \} les entiers de 00 Ă  (N−1)N(N-1)N par pas de NN

L’application f:Babies×Giants→Gf: \textnormal{Babies} \times \textnormal{Giants} \to G dĂ©finie par f(i,j)=gi+jf(i, j) = g^{i + j} est surjective.

Je vous laisse vous en convaincre en exercice, en considérant pour gk∈Gg^k \in G quelconque la division euclidienne de kk par NN.

f(i,j)=hf(i, j) = h Ă©quivaut Ă  rĂ©soudre gi∗gj=hg^i * g^j = h soit gi=h∗g−jg^i = h * g^{-j}

On est donc amenĂ© Ă  chercher une collision entre les sĂ©quences (gi)i∈Babies(g^i)_{i \in \textnormal{Babies}} et (h∗g−j)j∈Giants(h*g^{-j})_{j \in \textnormal{Giants}}, qui contiennent chacun N=⌈n⌉N = \lceil \sqrt{n} \rceil Ă©lĂ©ments.

On sait résoudre ce problÚme en O(n)O(\sqrt{n}) opérations (par exemple avec une table de hachage).

Les indices i,ji, j obtenus vérifient alors gi+j=hg^{i + j} = h ce qui résoud le problÚme du logarithme discret.

Échange de clĂ©s Diffie-Hellman

En 1976 est publié un article intitulé New Directions in Cryptography.

Cet article dĂ©finit l’un des premiers mĂ©canismes cryptographiques d’échange de clef, qui porte le nom d’échange de clĂ©s Diffie-Hellman.

Ce mĂ©canisme permet Ă  deux personnes, que nous appellerons Amandine et Bastien, d’établir une clef secrĂšte S que eux seuls connaissent en Ă©changeant sur un canal non sĂ©curisĂ©.

Nous verrons plus loin comment ce mécanisme est utilisé en pratique dans le protocole TLS.

Description de l’échange
  1. Amandine et Bastien ont choisi un groupe cyclique GG de taille nn et un gĂ©nĂ©rateur gg de ce groupe — ces donnĂ©es sont publiques.
    Le groupe GG étant fini, on peut encoder ses éléments sous forme de nombres de taille définie.
  2. Amandine génÚre un entier aléatoire aa, avec 0<a<n0 < a < n. Elle conserve secrÚtement aa et transmet à Bastien gag^a (sur le canal non sécurisé).
  3. De mĂȘme, Bastien gĂ©nĂšre un entier alĂ©atoire bb, avec 0<b<n0 < b < n. Il conserve secrĂštement bb et transmet Ă  Amandine gbg^b (sur le canal non sĂ©curisĂ©).
  4. Bastien utilise sa clef secrĂšte bb pour calculer (ga)b=gab(g^a)^b = g^{ab}.
  5. Amandine utilise sa clef secrĂšte aa pour calculer (gb)a=gba=gab(g^b)^a = g^{ba} = g^{ab}.

À l’issue de cet Ă©change, Amandine et Bastien ont tous deux connaissances du secret partagĂ© S=gab{S = g^{ab}}.

Robustesse

Les clefs gag^a et gbg^b circulant sur des canaux non sĂ©curisĂ©s, elles peuvent ĂȘtre utilisĂ©es par une tierce personne pour tenter d’obtenir le secret SS.

Si cette personne est capable de calculer l’un des logarithmes discrets log⁡g(ga)\log_g(g^a) ou log⁡g(gb)\log_g(g^b), elle peut alors obtenir l’un des exposants secrets aa ou bb et recalculer SS.

La rĂ©solution du logarithme discret est donc un vecteur d’attaque potentiel contre le mĂ©canisme de Diffie-Hellman.

Bien que cela ne soit pas prouvĂ© dans le cas gĂ©nĂ©ral, on considĂšre d’ailleurs que Diffie-Hellman est aussi sĂ»r que le problĂšme du logarithme discret.

La difficulté de calcul du logarithme sera donc déterminante dans le choix du groupe cyclique utilisé en pratique.

đŸ’» ImplĂ©mentation avec Golang

⚠ Les implĂ©mentations naĂŻves prĂ©sentĂ©es dans cet article ne doivent Ă©videmment pas ĂȘtre utilisĂ©es en production, leur but est purement didactique.

Nous proposons ci-dessous une implémentation avec différents groupes cycliques.

Cette implĂ©mentation est Ă©crite en Go, dont nous utiliserons le module crypto, mais il n’est pas nĂ©cessaire d’ĂȘtre familier avec ce langage pour lire la suite.

Une interface CyclicGroup

L’interface ci-dessous dĂ©finit ce qu’on attendra d’une implĂ©mentation d’un groupe cyclique.

On y retrouve les notions suivantes :

  • Identity, Compose, Inverse qui correspondent aux axiomes d’un groupe (Ă©lĂ©ment neutre, loi de composition interne et inversion)
  • Order, Generator qui correspondent au cas d’un groupe cyclique
type CyclicGroup interface {
Identity() interface{}
Compose(a, b interface{}) interface{}
Inverse(a interface{}) interface{}
Exponentiate(a interface{}, exp *big.Int) interface{}
Generator() interface{}
Order() *big.Int
String() string
}

💡 On a utilisĂ© des empty interface (qui peuvent contenir n’importe quelle valeur) pour typer les Ă©lĂ©ments du groupe, dont nous ne savons rien a priori. Dans d’autres langages, on pourrait utiliser des types gĂ©nĂ©riques (inexistant en Go).

Groupe multiplicatif modulo p

Rappelons quelques définitions vues dans un article précédent.

On note Z/nZ\Z/n\Z l’ensemble des nombres entiers modulo nn (nn dĂ©signe un entier positif quelconque).

Compter dans Z/nZ\Z/n\Z revient Ă  compter avec les nombres {0,1,...,n−1}\{0, 1, ..., n - 1\} en considĂ©rant tous les calculs comme effectuĂ©s modulo nn.

Par exemple, modulo 77, on a 5×5=25=4{5 \times 5 = 25 = 4} et la table de multiplication de Z/7Z\Z/7\Z est la suivante :

x0123456
00000000
10123456
20246135
30362514
40415263
50531642
60654321

On sait que lorsque pp est un nombre premier les Ă©lĂ©ments de Z/pZ\Z/p\Z diffĂ©rents de 00 sont tous inversibles pour la multiplication : Z/pZ\Z/p\Z est un corps que l’on notera aussi FpF_p.

On remarque également sur ce particulier que 33 permet de générer les 66 éléments non nuls de Z/7Z\Z/7\Z :
30=13^0 = 1, 31=33^1 = 3, 32=9=23^2 = 9 = 2, 33=63^3 = 6, 34=43^4 = 4, 35=53^5 = 5.

De fait, on montre qu’il existe toujours au moins un nombre dans FpF_p qui permet de gĂ©nĂ©rer tous les Ă©lĂ©ments non nuls par exponentiation, comme c’est le cas de 33 dans F7F_7.

Un tel nombre est appelé une racine primitive modulo pp.

DĂšs lors, l’ensemble des Ă©lĂ©ments non nuls de FpF_p muni de la multiplication est un groupe cyclique, d’ordre p−1p-1.

Implémentation de MultGroup

Voici ci-dessous une implémentation trÚs simple des groupes multiplicatifs modulo pp.

Notons que l’on utilise le type big.Int pour manipuler des entiers de taille arbitraire.

type MultGroup struct {
P *big.Int
Gen *big.Int
}
func (group *MultGroup) Order() *big.Int {
// P - 1
return new(big.Int).Add(group.P, big.NewInt(-1))
}
func (group *MultGroup) Identity() interface{} {
return big.NewInt(1)
}
func (group *MultGroup) Compose(a, b interface{}) interface{} {
// a * b % P
return new(big.Int).Mod(
new(big.Int).Mul(a.(*big.Int), b.(*big.Int)),
group.P,
)
}
func (group *MultGroup) Inverse(a interface{}) interface{} {
return new(big.Int).ModInverse(a.(*big.Int), group.P)
}
func (group *MultGroup) Exponentiate(a interface{}, exp *big.Int) interface{} {
return new(big.Int).Exp(a.(*big.Int), exp, group.P)
}
func (group *MultGroup) Generator() interface{} {
return group.Gen
}

💡 On utilise l’exponentiation modulaire des entiers implĂ©mentĂ©e nativement en Go, plus efficace que l’exponentiation rapide gĂ©nĂ©rique prĂ©sentĂ©e prĂ©cĂ©demment du fait d’optimisations spĂ©cifiques au calcul modulaire.

Implémentation naïve de Diffie-Hellman

Je vous propose une implĂ©mentation naĂŻve (cliquez sur le bouton Run ▶ pour l’exĂ©cuter) de Diffie-Hellman en Go.

Le premier résultat utilise le groupe multiplicatif du corps F1291799F_{1291799} :

---
Diffie-Hellman: F_1291799 multiplicative group
Group order 1291798
Generator 17
---
Amandine generated secret key:
1266948
Amandine transmitted (public) key:
91778
Bastien generated secret key:
81716
Bastien transmitted (public) key:
1089774
Amandine computed shared secret:
489232
Bastien computed shared secret:
489232

Évidemment, ce groupe d’ordre 12917981291798 n’est pas à utiliser en pratique.

Je laisse d’ailleurs aux lecteurs et lectrices le soin d’implĂ©menter l’algorithme baby-step giant-step dĂ©crit plus haut pour casser le secret ci-dessus


Notons que les groupes multiplicatifs associĂ©s aux corps finis sont le choix d’origine pour l’échange de Diffie-Hellman et qu’ils sont encore utilisĂ©s aujourd’hui, avec des groupes dont le paramĂštre pp est sur 2048 bits ou plus.

Utilisation des courbes elliptiques

Qu’est-ce qu’une courbe elliptique ?

L’équation y2=x3+486662x2+xy^2 = x^3+486662x^2+x d’inconnues x,yx, y dans le corps FpF_p (avec p=2255−19{p = 2^{255} - 19}) dĂ©finit une courbe elliptique sur FpF_p.

Le sujet est bien trop vaste pour une vraie présentation dans le cadre de cet article, remarquons simplement ceci :

  • il s’agit d’une courbe plane, son Ă©quation relie deux inconnues xx et yy de la mĂȘme façon que l’équation y−x2=0{y - x^2 = 0} dĂ©finit une courbe dans le plan R2\R^2 (en l’occurrence une parabole)
  • cette courbe est, comme la parabole, une courbe algĂ©brique : elle est dĂ©finie par une Ă©quation polynomiale Ă  deux indĂ©terminĂ©es
  • c’est une cubique — le terme dominant de son Ă©quation est de degrĂ© 33. La parabole est quant Ă  elle une conique — degrĂ© 22

💡 Parmi les courbes qui ont ces propriĂ©tĂ©s, les courbes elliptiques ont de plus un genre Ă©gal Ă  11. Le genre dĂ©signe ici une notion de gĂ©omĂ©trie algĂ©brique qui coĂŻncide dans le cas des courbes complexes avec une notion topologique assez visuelle : les courbes elliptiques sur C\Complex ont la mĂȘme topologie qu’un donut.

Loi de groupe sur les courbes elliptiques

À toute courbe elliptique peut ĂȘtre associĂ©e une loi de groupe.

Cette loi est commutative et associe à deux points PP et QQ de la courbe un troisiÚme point noté R=P+QR = P + Q.

💡 Ébauche de construction

L’idĂ©e gĂ©nĂ©rale est qu’en considĂ©rant deux points situĂ©s sur cette courbe, on peut en produire un troisiĂšme par un calcul algĂ©brique.

Sans rentrer dans les dĂ©veloppements, deux points PP et QQ d’une courbe plane dĂ©finissent une droite — l’unique droite qui passe par PP et QQ (si P=Q{P = Q}, on considĂšre la droite tangente Ă  la courbe en ce point).

Cette droite admet une Ă©quation de la forme ax+by=cax + by = c oĂč (a,b)≠(0,0)(a, b) \neq (0, 0).

La recherche de tous les points d’intersections de cette droite avec une courbe elliptique amĂšne Ă  rĂ©soudre une Ă©quation du troisiĂšme degrĂ© en xx.

Par exemple pour la courbe dĂ©finie plus haut : (c−axb)2=x3+486662x2+x{(\frac{c - ax}{b})^2 = x^3+486662x^2+x}

Sous certaines hypothĂšses supplĂ©mentaires (notamment pour prendre en compte le cas b=0b = 0 ci-dessus
), on en dĂ©duit un mĂ©canisme permettant d’associer aux points PP et QQ un troisiĂšme point R=P+QR = P + Q.

On montre alors que l’opĂ©ration ++ ainsi introduite dĂ©finit une loi de groupe commutatif.

Notons que malgrĂ© le vocabulaire de la gĂ©omĂ©trie plane utilisĂ© ici (droite, tangente), cette construction est purement algĂ©brique et possible sur n’importe quel corps de base — en particulier les corps finis.

đŸ’» ImplĂ©mentation en Go

Le package elliptic de Go introduit une interface Curve (reproduite ci-dessous) décrivant une courbe elliptique ainsi que différentes implémentations.

type Curve interface {
// Params returns the parameters for the curve.
Params() *CurveParams
// IsOnCurve reports whether the given (x,y) lies on the curve.
IsOnCurve(x, y *big.Int) bool
// Add returns the sum of (x1,y1) and (x2,y2)
Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int)
// Double returns 2*(x,y)
Double(x1, y1 *big.Int) (x, y *big.Int)
// ScalarMult returns k*(Bx,By) where k is a number in big-endian form.
ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int)
// ScalarBaseMult returns k*G, where G is the base point of the group
// and k is an integer in big-endian form.
ScalarBaseMult(k []byte) (x, y *big.Int)
}

Ce package implémente notamment les courbes P-256 et P-384 recommandées par le NIST et définies sur des corps FpF_p avec pp premier (sur 256256 et 384384 bits respectivement).

Ces courbes sont trĂšs utilisĂ©es en pratique, bien qu’elles soient l’objet de soupçons de backdoor par la NSA


Diffie-Hellman avec la courbe P-256

Ci-dessous, voici ce que donne notre implémentation de Diffie-Hellman avec la courbe P-256 (exécuter en ligne) :

---
Diffie Hellman: Elliptic Curve P-256
Field F_115792089210356248762697446949407573530086143415290314195533631308867097853951
Group order 115792089210356248762697446949407573529996955224135760342422259061068512044369
---
Amandine generated secret key:
7342462952232507609821760396776010434242597936110644963427068432176148435477
Amandine transmitted (public) key:
4298064935869640021519201203011003733572235803818690789383769808073692516886
Bastien generated secret key:
110170395102730437573897103177357816686836430099641375606421793187578417842509
Bastien transmitted (public) key:
6169708491757107974945465047131128230446890469460906853603235544851377683418
Amandine computed shared secret:
85470343014045070211971750616744066840724631640773885304746048731416023347568
Bastien computed shared secret:
85470343014045070211971750616744066840724631640773885304746048731416023347568

💡 On remarque que l’ordre du groupe gĂ©nĂ©rĂ© est relativement proche de celui du corps fini utilisĂ© : sur leurs 7878 chiffres, les 3737 premiers coincident.
C’est une consĂ©quence d’un thĂ©orĂšme connu


TLS 1.3 et la confidentialité persistante

Avant TLS 1.3, il Ă©tait possible d’utiliser le mĂȘme couple de clefs cryptographiques pour l’authentification et l’échange des clefs de session.

Ce mĂ©canisme est qualifiĂ© de statique (par exemple static RSA, lorsque l’algorithme sous-jacent est RSA).

Avec TLS 1.3, des clefs asymĂ©triques Ă  usage unique (clefs Ă©phĂ©mĂšres) doivent ĂȘtre utilisĂ©es pour chaque session.

Ceci permet de garantir une confidentialitĂ© persistante : si une clef privĂ©e est compromise dans le futur, elle ne pourra pas ĂȘtre utilisĂ©e pour dĂ©chiffrer a posteriori des communications chiffrĂ©es qui auraient Ă©tĂ© conservĂ©es.

Le mĂ©canisme de Diffie-Hellman permet de satisfaire cette exigence, en partageant une clef secrĂšte S=gabS = g^{ab} — la clĂ© « pre-master » — basĂ©e sur des clefs secrĂštes aa (client) et bb (serveur) Ă©phĂ©mĂšres.

Les lecteurs et lectrices souhaitant en savoir plus sur le fonctionnement de TLS pourront lire cette présentation par Cloudflare.

Le livre An Introduction to Mathematical Cryptography, utilisĂ© comme source d’inspiration pour cet article, est une rĂ©fĂ©rence pour approfondir les notions thĂ©oriques.



Maths et applications, avec les mains et avec du code đŸ’»
Suivre sur Twitter