Sécurisation des communications

I/ Chiffrement symétrique

1) Exemple

En effectuant un "ou exclusif" chiffre par chiffre entre chaque lettre du message et la lettre correspondante de la clé, on peut rendre un message inintelligible pour qui ne connaît pas la clé :

def chiffrement(message,clef):
	chiffré = ""
	position  = 0
	for lettre in message:
		chiffré += chr(ord(lettre)^clef[position])
		position = (position+1)%len(clef)
	return chiffré

Dans cet exemple, on a choisi de représenter la clef de chiffrement par une liste d'entiers, par exemple

[365, 353, 288, 355, 364, 489, 288, 371, 377, 365, 489, 372, 370, 361, 369, 373, 357]

(obtenu par le code maclé = [256+ord(l) for l in "ma clé symétrique"])

Avec cet algorithme de chiffrement à clef symétrique, le message Veuillez transférer 1000 € sur mon compte offshore se code par ĻĄŕĊĀƅŅĉřęƛĕĜĚėƜėĈēĀŒŜǙĐœ⇕ōƚāĀʼnĜĚċōĂŏĎĜƝŅœĖċƏćĚĆăĐ qui est effectivement assez peu lisible.

2) Caractéristiques algorithmiques

L'algorithme de chiffrage donné ci-dessus possède les avantages suivants :

3) Inconvénient

Par contre ce genre de chiffrement nécessite que la clef soit partagée entre l'émetteur et le récepteur. Ce qui pose des problèmes de logistique : la clef doit être transmise préalablement, par un autre canal. Ce problème est évoqué (avec une solution) dans ce célèbre article de Ron Rivest (coécrit avec Adi Shamir et Len Adleman), dont voici quelques extraits :

Encryption is the standard means of rendering a communication private. 
The sender enciphers each message before transmitting it to the receiver.  
The receiver (but no unauthorized  person)  knows  the  appropriate  deciphering  
function  to  apply  to  the received  message  to  obtain  the  original  message.   
An  eavesdropper  who  hears  the transmitted message hears only “garbage” (the ciphertext)
which makes no sense to him since he does not know how to decrypt it.

Rivest cite ensuite des exemples de chiffrements symétriques, comme ceux utilisés par le NBS, notamment DES basé sur les réseaux de Feistel. Voici une traduction moderne des personnages :

chez Rivestnom
receiverAlice 👩
senderBob 👨
eavesdropperEve 👽
deciphering functionclef 🔑

Rivest écrit ensuite (en citant Hellman) :

All  classical  encryption  methods  (including  the  NBS  standard)  
suffer  from  the "key distribution problem".  The problem is that before a private 
communication can begin, another private transaction is necessary to distribute 
corresponding encryption and  decryption  keys  to  the  sender  and  receiver,  
respectively.   Typically  a  private courier is used to carry a key from the sender 
to the receiver.  Such a practice is not feasible  if  an  electronic  mail  system  
is  to  be  rapid  and  inexpensive.   A  public-key cryptosystem needs no private 
couriers; the keys can be distributed over the insecure communications channel.

II/ Chiffrement asymétrique

1) Principe

Le principe du chiffrement symétrique est que Alice 👩 et Bob 👨 ont tous les deux besoin de la clef de chiffrement 🔓 et de la clef de déchiffrement 🔑 pour communiquer par voie sécurisée. Il leur faut donc, outre le message crypté, échanger également les clefs 🔐.

Le principe du chiffrement asymétrique est d'utiliser deux clefs différentes :

En voici le fonctionnement décrit par Rivest :

Two users can also establish private communication over an insecure 
communications channel without consulting a public file.  Each user sends his encryption 
key to the other.  Afterwards all messages are enciphered with the encryption key of 
the recipient, as in the public-key system.  An intruder listening in on the channel 
cannot decipher any messages, since it is not possible to derive the decryption keys 
from the encryption keys.

2) Fonctionnement algorithmique

Le chiffrement asymétrique (par exemple avec l'algorithme de Rivest, Shamir et Adleman) est relativement rapide, mais moins que le chiffrement symétrique. On préfère donc y avoir recours le moins souvent possible, par exemple pour https qui requiert un débit élevé.

Voir aussi cet article de mathématiques

III/ Échange de clé symétrique

En 1976, Martin Hellman a coécrit avec Whit Diffie un article où est décrit le protocole suivant, utilisant les clefs asymétriques pour échanger des clefs symétriques. On illustre le protocole par un message 📃 placé dans une boîte 📦 fermée par des cadenas.

  1. Alice 👩 met le message 📃 dans la boîte 📦 , puis la ferme avec sa clef publique 🔓 ;
  2. Alice 👩 envoie la boîte fermée 📦🔒 à Bob 👨 ;
  3. Bob 👨 ne peut pas ouvrir la boîte 📦🔒 car il n'a pas la clef privée 🔑 d'Alice 👩 ; alors il rajoute sa clef publique (📦🔒🔓→📦🔒🔒)
  4. Bob 👨 envoie la boîte fermée deux fois 📦🔒🔒 à Alice 👩 ;
  5. Alice 👩 utilise sa clef privée 🔑 pour ouvrir partiellement la boîte (📦🔒🔒→👩🔑→📦🔓🔒) ;
  6. Alice 👩 renvoie la boîte 📦🔒 à Bob 👨 .
  7. Bob 👨 utilise sa clef privée 🔑 pour ouvrir la boîte 📦🔓.
  8. Bob peut alors récupérer le message 📃 .

Pour https, le message 📃 partagé entre Alice 👩 et Bob 👨 est une clef symétrique 🔐. La sécurisation de la communication est assurée parce qu'il est impossible à Eve 👽 de se faire passer pour Alice 👩 ou pour Bob 👨 sans disposer de la clé privée 🔑 de l'un des deux.

Le protocole de Diffie-Hellman permet donc d'échanger une clé de chiffrement symétrique 🔐 à l'aide du chiffrement asymétrique.