Outils pour utilisateurs

Outils du site


nsi:tds:cryptographie:elgamal

Chiffrement de ElGamal

Le chiffrement de ElGamal est une technique cryptographique asymétrique voisine de la technique RSA vue en Terminale NSI, mais plus simple.

 

Calculs modulo

Cette technique, comme RSA, basée sur des propriétés arithmétiques – mathématiques des nombres entiers – fait un grand usage des puissances et des modulos.

Vous pouvez donc consulter l'intérêt des modulos en cryptographie

Vous devrez aussi passer voir ces deux exercices avant :

Vous aurez besoin des fonctions puissance_rapide_mod et inverse_modulaire implémentées dans ces deux exercices.

Je noterai ci-dessous $\cdots\overset{p}{\equiv}\cdots$ pour $\cdots = \cdots \mod p$.

Principe du chiffre de ElGamal

Clés

Comme dit précédemment, il s'agit d'un chiffre asymétrique. Il y aura donc une clé publique Kpu pour le chiffrement et une clé privée Kpr pour le déchiffrement.

Voici comment Bob va créer ces clés :

  • Bob choisit un nombre premier $p$ assez grand – plus il est grand, plus c'est sûr.
  • il choisit un entier $1 < d < p$,
  • il choisit un entier $1 < s$, ce sera sa clé privée,
  • il calcule $h \overset{p}{\equiv} d^s$.

La clé publique de Bob est composé du triplet $(p, d, h)$. Il peut la transmettre en clair.

L'idée est que $s$ sera utile au calcul de déchiffrement et que $s$ est difficile à trouver quand on ne connaît que $(p, d, h)$. Vous pouvez consulter cette page pour comprendre mieux pourquoi.

Chiffrement

Alice veut transmettre un nombre $m$, c'est son message. Elle a reçu les trois morceaux de la clé de Bob.

  • Alice choisit un nombre entier $1 < a$ comme elle veut,
  • Elle calcule $r \overset{p}{\equiv} m\cdot h^a$ et $t \overset{p}{\equiv} d^a$
  • Elle envoie le message chiffré composé des deux morceaux : $(r, t)$

Déchiffrement

Bob reçoit $(r, t)$, il peut utiliser $s$ qu'il est seul à connaître,

  • il calcule $t^s \mod p$,
  • il cherche l'entier $u$ qui vérifie $u\cdot t^s \overset{p}{\equiv} 1$
    $u$ est l'inverse modulaire de $t^s$,
  • il calcule $m' \overset{p}{\equiv} r \cdot u$, le résultat $m'$ n'est autre que $m$.

Un mot d'explication :

  • $t^s \overset{p}{\equiv} \left(d^a\right)^s = d^{a\cdot s} = \left(d^s\right)^a \overset{p}{\equiv} h^a$
  • donc $r \overset{p}{\equiv} m \cdot h^a \overset{p}{\equiv} m \cdot t^s$
  • et donc enfin $r\cdot u \overset{p}{\equiv} \left(m \cdot t^s\right) \cdot u \overset{p}{\equiv} m \cdot \left(t^s \cdot u\right) \overset{p}{\equiv} m \cdot 1 \overset{p}{\equiv} m $.

Comme vous le voyez, le déchiffrement exploite le fait que calculer $a^b \mod p$ est très rapide. Connaissant $s$, les calculs à faire pour déchiffrer sont rapides.

En connaissant la clé publique $(p, d, h)$, on pourrait trouver la valeur de $s$ mais cela nécessiterait beaucoup de calculs et donc beaucoup de temps. En gros il faudrait essayer toutes les valeurs entre 1 et $p$ ce qui serait long pour un $p$ très grand.

À faire

Vous disposes déjà des fonctions :

Pour le choix de a lors du chiffrement, vous pouvez générer un entier aléatoire par exemple avec randrange du module random.

Écrire de plus les fonctions suivantes :

  • calculer_cle_publique(Kpr) qui reçoit Kpr = (p, d, s) et renvoie Kpu = (p, d, h)
  • chiffrer(m, Kpu) qui reçoit le message m et la clé publique Kpu et renvoie la paire mc = (r, t) du message chiffré
  • dechiffrer(mc, Kpr) qui reçoit le message chiffré et la clé privée et renvoie le message déchiffré..

Faire le test en choisissant Kpr(7639, 59, 13), m = 253.

nsi/tds/cryptographie/elgamal.txt · Dernière modification : de goupillwiki