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.
L'algorithme de chiffrage donné ci-dessus possède les avantages suivants :
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 Rivest | nom |
---|---|
receiver | Alice 👩 |
sender | Bob 👨 |
eavesdropper | Eve 👽 |
deciphering function | clef 🔑 |
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.
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.
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
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.
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.