Cryptage symétrique et asymétrique

mieux protéger une application internet

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
Vous vous rappelez Enigma, une machine utilisée par les Nazis pendant la 2e Guerre Mondiale pour crypter les messages et les rendre incompréhensibles pour des personnes non autorisées ? Si oui, vous savez de quoi va parler cet article. Il s'agit du cryptage et décryptage.

Dans la première partie de l'article on verra deux différentes méthode de cryptage. Ensuite on passera à la partie contenant quelques exemples de cryptage avec des algorithmes déjà existants.

Avant de continuer, une note explicative. Deux termes peuvent correspondre au sujet de cet article : cryptage/décryptage ou chiffrement/déchiffrement. Pour les raisons d'une meilleure clarté, on va opter pour un seul - le premier.

Le cryptage est donc un moyen de transmettre les informations confidentielles de telle sorte qu'elles puissent être lues uniquement par des personnes autorisées. On distingue deux principaux types de cryptage : symétrique et asymétrique.

Cryptage symétrique
Autrement appelée cryptage à clé privée, ce type se base sur l'utilisation d'une clé pour crypter et décrypter les messages. La sécurité de cette solution repose sur le fait que la clé est connue uniquement par l'émetteur et le récepteur du message.

L'exemple historique de l'utilisation du cryptage symétrique est fameux téléphone rouge qui reliait le Kremlin à la Maison Blanche. La clé privée était alors transmise dans une valise diplomatique. Pour une meilleure sécurité, elle était détruite et réinitialisée après chaque conversation.

Le cryptage symétrique fonctionne selon deux procédés différents :
- le cryptage par flot : le cryptage s'effectue en continu, bit par bit
- le cryptage par bloc : le cryptage s'effectue sur les blocs de bits

Les avantages du cryptage symétrique :
- la rapidité d'exécution (une seule clé utilisée)
- la simplicité d'implémentation (gestion d'une seule clé)
Les inconvénients du cryptage symétrique :
- la complexité de fonctionnement : une obligation d'avoir le nombre de clés privées égal au nombre de destinataires
- la sécurisation de la chaîne de transmission de la clé

Cryptage asymétrique
Le cryptage asymétrique, contrairement au symétrique, se base sur l'utilisation des 2 clés : publique (pour crypter, elle est accessible publiquement) et privée (pour décrypter le message, elle est gardée secrète). Ce type de cryptage élimine la problématique de la transmission de la clé (fameuse valise pour le Téléphone Rouge). Ce mode de cryptage est également nommé le cryptage à clé publique. Il est essentiel que l'on ne puisse pas déduire la clé privée de la clé publique.

Pour bien comprendre le principe, on peut l'illustrer avec l'échange d'une lettre entre un émetteur et un destinataire :
- l'émetteur possède deux clés : privé et publique. Il envoie sa lettre contenant la clé publique au destinataire.
- le destinataire utilise la clé publique pour crypter son message; il envoie tout à l'émetteur initial
- l'émetteur utilise sa clé privée pour décrypter le message

Un exemple d'utilisation du cryptage asymétrique est la transmission d'une clé secrète dans SSL. Dans la première phase de l'échange, le serveur envoie sa clé publique au client. Ensuite le client valide sa fiabilité. Si la validation est correcte, il génère une pré clé principale avec l'utilisation de la clé publique du serveur. Le résultat de cette génération est ensuite envoyée au serveur. Pour en savoir plus, je vous invite à consulter l'article consacré à l'introduction à SSL.

Les avantages du cryptage asymétrique :
- l'élimination de la problématique de la transmission de clé
- la possibilité d'utiliser la signature électronique
- l'impossibilité de décrypter le message dans le cas de son interception par une personne non autorisée
Les inconvénients du cryptage asymétrique :
- le temps d'exécution : plus lent que le cryptage symétrique
- le danger des attaques par substitution des clés (d'où la nécessité de valider les émetteurs des clés)

Exemples du cryptage symétrique
Dans nos exemples on utilisera deux méthodes fournies avec la librairie Mcrypt dans PHP : mcrypt_encrypt et mcrypt_decrypt. Voici les données qu'on employera :

$key = "private";
$text = "This is example of crypted string";
// MCRYPT_MODE_CBC : Cipher Block Chaining, par bloc se basant sur l'interdépendance entre les blocs cryptés (par exemple le bloc A sera lié d'une manière quelconque au bloc B)


Voici l'exemple de quelques algorithmes utilisant le cryptage à clé privée en PHP :
- Rijndael

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo "Data crypted with Rijndael : <br />";
echo ($crypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv));
echo "<br />Data decrypted with Rinjdael : <br />";
echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypted, MCRYPT_MODE_CBC, $iv);


- DES

$ivSize = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo "Data crypted with DES : <br />";
echo ($crypted = mcrypt_encrypt(MCRYPT_DES, $key, $text, MCRYPT_MODE_CBC, $iv));
echo "<br />Data decrypted with DES : <br />";
echo mcrypt_decrypt(MCRYPT_DES, $key, $crypted, MCRYPT_MODE_CBC, $iv);


- Blowfish

$ivSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
echo "Data crypted with BLOWFISH : <br />";
echo ($crypted = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_CBC, $iv));
echo "<br />Data decrypted with BLOWFISH : <br />";
echo mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $crypted, MCRYPT_MODE_CBC, $iv);


Comment ça fonctionne ? Au tout début on se charge de récupérer la taille d'un Initialization Vector (vecteur d'initialisation en français) avec la méthode mcrypt_get_iv_size(). Il s'agit d'un bloc de bits qui sera combiné avec le premier bloc chiffré dans le cas du cryptage par blocs. Ensuite on crée un VI aléatoire qui sera utilisé pour le cryptage et le décryptage. Il doit être le même pour les deux opérations. Ensuite on utilise la méthode mcrypt_encrypt pour crypter et mcrypt_decrypt pour décrypter le message.

Exemples du cryptage asymétrique
Pour illustrer le fonctionnement du cryptage asymétrique on utilisera l'extension OpenSSL. Il sert également à générer les clés privées et publiques. C'est d'ailleurs l'opération qu'on va effectuer avant l'écriture du code. Les commandes ci-dessous devraient effectuer la tâche :


// generate private key
openssl genrsa 1024 > ./ssl/priv.key
// generate public key
openssl rsa -in ./ssl/priv.key -pubout -out ./ssl/public.key


Passons maintenant à une courte présentation sous forme du code PHP :

// our script is placed on ssl directory
$toEncrypted = "This is a test";
$privateKey = openssl_pkey_get_private(file_get_contents(__DIR__."/priv.key"));
$publicKey = openssl_pkey_get_public(file_get_contents(__DIR__."/public.key"));
openssl_public_encrypt($toEncrypted, $encryptedData, $publicKey);
echo "Encrypted data are : <br />";
echo $encryptedData;
openssl_private_decrypt($encryptedData, $plainTextData, $privateKey);
echo "<br /><br />Decrypted data using private key are : <br /> ";
echo $plainTextData;
echo "<br /><br />";


Le fonctionnement est assez évident. Au tout début on récupère notre clé publique et privée. Ensuite on appelle la méthode qui se charge de crypter le texte $toEncrypted. Tout de suite après on s'occupe de le décrypter avec l'utilisation de la clé privée. Faites également un test et modifiez le contenu du fichier priv.key (par exemple remplaçant une lettre par une autre). En réexécutant le code, vous verrez que le contenu ne peut pas être décrypté.

La cryptographie est un domaine très ancien qui a fait ses preuves à travers des siècles. En commençant par Jules Cesar (cryptage par décalage), en passant par Enigma, et en terminant sur la transmission de la clé secrète dans le SSL, elle a causé les migraines de plusieurs personnes y travaillant. Cependant tel est aujourd'hui le prix d'une échange sécurisée et par définition confidentielle.
Bartosz KONIECZNY 24-06-2012 13:09 sécurité des applications web
Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Android

Un problème de connexion à un web service ou à l'internet.

Vérifiez dans votre AndroidManifest.xml si la balise suivante est présente :
<uses-permission android:name="android.permission.INTERNET" />