Chiffrement asymétrique
Introduction
Au cours précédent, vous avez vu le chiffrement symétrique et son talon d'Achille : pour qu'Alice et Bob échangent des messages chiffrés, ils doivent d'abord se mettre d'accord sur une clé secrète commune. S'ils ne se sont jamais rencontrés, comment faire ? La cryptographie a trouvé la réponse en 1976 avec une idée révolutionnaire : utiliser deux clés différentes par personne, l'une publiable et l'autre gardée secrète, mathématiquement liées de telle façon que l'une chiffre et l'autre seule sait déchiffrer. C'est le chiffrement asymétrique, et c'est ce que demande .
Le principe — deux clés par personne
Chaque utilisateur dispose d'une paire de clés :
- une clé publique qu'il publie librement (sur sa page web, dans un annuaire, à la fin d'un mail) ;
- une clé privée qu'il garde sur sa machine, jamais transmise à personne.
Les deux fonctions sont :
- N'importe qui peut chiffrer un message avec de Bob.
- Seul Bob peut le déchiffrer avec .
L'asymétrie est dans le nom : la clé qui chiffre n'est pas celle qui déchiffre. Et il est calculatoirement impossible de retrouver à partir de — c'est ce qui rend le système sûr.
L'idée de RSA — modulo et exponentiation
Le représentant le plus connu de chiffrement asymétrique est RSA (Rivest, Shamir, Adleman, 1977). Vous n'avez pas à connaître la démonstration complète au niveau Terminale, mais vous devez en reconnaître les ingrédients : le modulo et l'exponentiation modulaire.
L'idée tient en trois étapes (très simplifiées) :
- Bob choisit deux grands nombres premiers et . Il calcule leur produit . Ce devient public — il fait partie de .
- Bob calcule un couple d'exposants liés par une relation modulaire. est public (avec ), est privé.
- Pour chiffrer un message représenté comme un entier, on calcule : Et pour déchiffrer :
Pour comprendre l'opération centrale, regardez ce qu'est l'exponentiation modulaire :
def exp_modulaire(base: int, exposant: int, modulo: int) -> int:
"""Calcule (base ** exposant) % modulo, efficacement."""
return pow(base, exposant, modulo)
# Exemple jouet avec p=11, q=13 → n=143, e=7, d=103
n, e, d = 143, 7, 103
M = 42
C = exp_modulaire(M, e, n)
print(C) # 81
M_restitue = exp_modulaire(C, d, n)
print(M_restitue) # 42
L'instruction pow(base, exposant, modulo) de Python calcule
efficacement, sans construire l'entier
géant intermédiaire. C'est l'opération de base de RSA.
Dans RSA, la sécurité repose sur la difficulté de…
Que peut-on faire avec une paire de clés ?
L'asymétrie autorise deux usages complémentaires :
| Opération | Clé utilisée pour chiffrer | Clé utilisée pour déchiffrer | But |
|---|---|---|---|
| Confidentialité | du destinataire | du destinataire | Seul le destinataire lit |
| Signature | de l'expéditeur | de l'expéditeur | N'importe qui peut vérifier que c'est bien l'expéditeur |
Dans le cas de la signature, on inverse les rôles : seul Bob, qui détient de Bob, peut produire tel que . C'est une preuve d'identité vérifiable par tous. La signature est essentielle pour les certificats que vous croiserez avec HTTPS.
Si Alice veut envoyer un message confidentiel à Bob, elle chiffre avec…
Activité débranchée
Pour aller plus loin
D'autres systèmes asymétriques existent : Diffie-Hellman (échange de
clé), ECC (cryptographie sur courbes elliptiques, plus compacte que
RSA à sécurité équivalente). RSA reste le plus enseigné parce qu'il
illustre directement le rôle du modulo et de l'exponentiation — deux
opérations que vous savez écrire en Python avec pow(a, b, n).