Cryptographie en java 1/3 : Notions de base

Trois billets pour expliquer les notions élémentaires de cryptographie, comment les mettre en œuvre sous linux puis dans une application JAVA.

Clé privée / clé publique

La clé privée et la clé publique sont similaires dans leur présentation (un fichier contenant une longue chaîne de caractères) mais diffèrent par leur utilisation. La seule différence est le fait qu'on peut générer la clé publique à partir de la clé privée, alors que l'inverse est évidemment faux. Pour le reste il est possible de crypter un fichier avec l'une des deux clés, et ce message pourra être décrypté avec l'autre clé.

Les autres différences résident dans l'utilisation qui est faite de ces clés, la clé publique est destinée à être distribuée alors que la clé privée doit rester à l'usage exclusif de son propriétaire.

La clé privée a trois usages :

  • Générer la clé publique
  • Signer un document
  • Décrypter un fichier crypté avec la clé publique

La clé publique a deux usages :

  • Crypter un fichier
  • Vérifier la signature d'un document signé à l'aide de la clé privée

En pratique cette paire de clé est utilisée pour deux raisons :

  • Crypter un fichier avec la clé publique, cela permet permet de garantir que seule la personne qui possède la clé privée pourra lire le message.
  • Crypter un fichier avec la clé privée et envoyer à la fois le fichier crypté et le fichier en clair. Cela permet à toute personne possédant la clé publique d'utiliser cette clé pour décrypter le message et de comparer le résultat avec le fichier en clair. Si les deux fichiers sont identiques, on est certain que le fichier original a été crypté par quelqu'un possédant la clé privée. Les mécanismes de signature électronique sont basés sur ce principe.

Certificats électroniques

Un certificat est destiné à lier une clé publique à son propriétaire. Je dois demander à un organisme spécialisé, appelé autorité de certification, de signer ma clé publique en utilisant sa clé privée. Le rôle de l'autorité de certification est de vérifier mon identité avant de procéder à la signature.

Le résultat de cette signature, clé publique + clé publique cryptée, est placé dans un fichier appelé certificat. Ainsi toute personne possédant la clé publique de l'autorité de certification peut confirmer que cette autorité de certification a "validé" ma clé publique. Je peux donc distribuer mon certificat et chacun pourra vérifier que la clé que je distribue m'appartient bien.

Il est également possible de vérifier auprès de l'autorité de certification si le certificat est toujours valide. Si je sais que quelqu'un a eu accès à ma clé privée, il me suffit d'avertir l'autorité de certification qui après avoir vérifié mon identité va révoquer mon certificat. Mon certificat sera donc ajouté à une "liste noire".

Chaîne de certificats

Si une autorité de certification se fait dérober sa clé privée, tous les certificats créés à l'aide de cette clé sont suspects, car toute personne possédant la clé privée a la possibilité de créer un certificat. Dans un cas pareil, l'autorité de certification déclare que sa clé est compromise. Les éditeurs de logiciels vont alors mettre à jour la liste des autorités de certification acceptées dans les navigateurs (ou tout autre logiciel nécessitant une authentification). Les faux certificats, comme les vrais, seront donc refusés par les navigateurs.

Pour éviter que tous les certificats d'une autorité particulière ne soient invalidés d'un coup, on utilise une chaîne de certificat. Une clé privée unique permet de certifier un certain nombre de clés publiques. On parle alors de certificat intermédiaire. Les clés privées liées à ces clés publiques sont à leur tour utilisées pour certifier d'autres clés et ainsi de suite. Ainsi la compromission d'une clé à de moins grandes conséquences. La clé "Racine" est par ailleurs relativement facile à protéger car on n'en a plus besoin sauf pour créer éventuellement d'autres certificats intermédiaires.

Evidemment le problème de la validité de la clé "Racine" se pose. C'est aux éditeurs de logiciels de décider à quelles autorités de certifications ils font confiance et d'ajouter les clés publiques correspondantes dans leurs logiciels. Pour JAVA par exemple, les certificats racine sont stockés dans le fichier "jre/lib/security/cacerts".

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.