Vous avez jusqu'à la fin de la journée pour m'envoyer votre TP par email (pierre.hyvernat@univ-savoie.fr)

Consignes

Pour ce TP, vous devrez m'envoyer un email (signé et crypté) contenant un petit rapport.

IMPORTANT le sujet du message sera "[info-223] TP2 ...", où les ... peuvent être n'importe quoi.

Le rapport sera devra être un fichier texte. Les rapports envoyés dans un autre format (pdf, openoffice, openrtf, word) ne seront pas lus. (Ce n'est pas une blague.)

Faites attention lors de la rédaction du rapport : je ne veux pas lire la suite des commandes que vous avez utilisées. Soyez concis...

Liens utiles


1. Préliminaires

Pour commencer le TP, redémarrez votre machine sous Linux, identifiez vous et ouvrez un navigateur internet (Applications --> Internet --> Navigateur Web Iceweasel) sur la page du TP.

1.1. Une cryptanalyse facile

En utilisant la page http://lama.univ-savoie.fr/~hyvernat/substitution.php, décryptez le texte ci dessous.

Ds krdw s'xgxnq ydb kbu ru bq kx wbxd,
Qxsq kbu ohnbsu txnuxnbsq jrssb pxcab.
Ob krdw cbsorsqcb ds arpdb xduun wdnuuxsq ydb jbxd,
Pcxu, wrkn, ydn u'éqxnq trdcgrlé wxc eépxcab.
K'xqqxydbc, kb ebqqcb bs ydxcqnbcu,
Uncb krdw k'bûq txnq grkrsqnbcu;
Exnu nk txkkxnq kngcbc jxqxnkkb,
Bq kb eâqns éqxnq ab qxnkkb
X ub aétbsacb hxcanebsq.
Kb krdw arso, k'xjrcab hdejkbebsq,
Bsqcb bs wcrwru, bq kdn txnq orewknebsq
Udc urs bejrswrnsq, yd'nk xaencb.
«Nk sb qnbsacx yd'à grdu, jbxd uncb,
A'êqcb xduun pcxu ydb ern, kdn céwxcqnq kb ohnbs.
Ydnqqbi kbu jrnu, grdu tbcbi jnbs:
Gru wxcbnku l ursq enuécxjkbu,
Oxsocbu, hècbu, bq wxdgcbu anxjkbu,
Arsq kx orsanqnrs buq ab erdcnc ab txne.
Oxc ydrn? cnbs a'xuudcé; wrnsq ab tcxsohb knwwéb;
Qrdq à kx wrnsqb ab k'éwéb.
Udngbi ern, grdu xdcbi ds jnbs ebnkkbdc abuqns.»
Kb krdw cbwcnq: «Ydb eb txdacx-q-nk txncb?
--Wcbuydb cnbs, anq kb ohnbs: arssbc kx ohxuub xdf pbsu
Wrcqxsq jâqrsu bq ebsanxsqu;
Tkxqqbc obdf ad krpnu, à urs exîqcb orewkxncb:
Erlbssxsq ydrn grqcb uxkxncb
Ubcx trcob cbknbtu ab qrdqbu kbu txçrsu:
Ru ab wrdkbqu, ru ab wnpbrsu,
Uxsu wxckbc ab exnsqb oxcbuub.»
Kb krdw aémà ub trcpb dsb téknonqé
Ydn kb txnq wkbdcbc ab qbsacbuub
Ohbens txnuxsq, nk gnq kb ord ad ohnbs wbké.
«Yd'buq-ob kà? kdn anq-nk.--Cnbs.--Ydrn? cnbs?--Wbd ab ohrub.
--Exnu bsorc?--Kb orkknbc arsq mb udnu xqqxohé
Ab ob ydb grdu grlbi buq wbdq-êqcb kx oxdub.
--Xqqxohé? anq kb krdw: grdu sb ordcbi arso wxu
Rù grdu grdkbi?--Wxu qrdmrdcu; exnu yd'newrcqb?
--Nk newrcqb un jnbs, ydb ab qrdu gru cbwxu
Mb sb gbdf bs xdodsb urcqb,
Bq sb grdacxnu wxu eêeb à ob wcnf ds qcéurc.»
Obkx anq, exîqcb krdw u'bstdnq, bq ordcq bsorc.

Bonus : décryptez le texte suivant

1.2. Vérifications

Le but de ce TP est de vous familiariser avec la notion de signature électronique et de chiffrement clé publique / clé privée en utilisant le logiciel GPG (Gnu Privacy Guard : http://www.gnupg.org/). GPG est une version libre du logiciel PGP (Pretty Good Privacy : http://www.pgp.com/) crée par Philip Zimmermann. Bien qu'il existe des clients graphique (GPA par exemple), nous allons utilisez l'outil le plus basique (mais aussi le plus puissant) qui soit : le programme gpg en mode texte.

Dans un terminal (Menu Applications --> Accessoire --> Terminal, vérifiez que le logiciel est bien installé avec la commande

$ gpg --version

Créez ensuite un répertoire dans le bureau et positionnez-vous dans ce répertoire :

$ mkdir Desktop/info223-TP2
$ cd Desktop/info223-TP2

2. GPG et le chiffrement symétrique

2.1. Chiffrement

Si vous partagez une clé avec votre destinataire, vous pouvez utiliser GPG pour faire de cryptographie symétrique. Pour crypter le fichier "nom_fichier", il faut utiliser la commande :

$ gpg --symmetric --armour nom_fichier

Ceci créera un fichier "nom_fichier.asc" contenant le fichier chiffré.

Vous pouvez également créer un fichier crypté binaire. La commande correspondante est

$ gpg --symmetric nom_fichier

Ceci créera un fichier binaire "nom_fichier.gpg" contenant le fichier binaire chiffré.

Utilisez cette commande pour créer un fichier crypté. Vérifier qu'en modifiant un tout petit peu la clé ou le contenu du fichier, le contenu du fichier crypté change énormément.

Vous pouvez pour ceci utiliser un gros fichier texte et regarder ce qui se passe dans le fichier crypté en l'ouvrant avec un éditeur de texte (gedit ou autre).

2.2. Déchiffrement

Pour décrypter, il suffit d'utiliser :

$ gpg --decrypt nom_fichier.asc

(Bien entendu, "nom_fichier.asc" sera remplacé par "nom_fichier.gpg" si besoin...)

  1. Envoyez un fichier crypté à votre voisin.
  2. Décryptez le fichier chiffré de la question précédente et vérifier que vous obtenez le bon message. (Vous pouvez échanger la clé à l'oral.)
  3. Essayez de décrypter le fichier en utilisant une clé erronée (une seule lettre de différence), que se passe-t'il ?
  4. À votre avis, que peut-on faire pour déchiffrer le fichier si on a perdu la clé ?

3. Gestion des clés publique / privée

3.1. Création des clés

Les clés sont stockées dans un répertoire caché de votre répertoire personnel : .gnupg. Vous êtes la seule personne à avoir accès à ce fichier. De plus, vos clés sont protégées par un mot de passe pour renforcer la sécurité.

Pour créer votre propre clé publique/clé privée, il faut utiliser la commande

$ gpg --gen-key

Remarque : si GPG vous dis qu'il n'a pas assez d'entropie, il faut faire travailler le processeur. Vous pouvez utiliser la commande $ find / -name a dans un autre terminal et attendre un peu...

Pour vérifiez que les clés ont bien été créées, utilisez la commande

$ gpg --list-keys

Vous devriez obtenir quelque chose du genre

$HOME/.gnupg/pubring.gpg
-------------------------------
pub   1024D/2B79C360 2011-04-12 [expire: 2011-05-12]
uid                  Pierre Hyvernat (info-223) <pierre.hyvernat@univ-savoie.fr>
sub   2048g/30493BC3 2011-04-12 [expire: 2011-05-12]

qui vous indique que vous avez une clé principale (ligne "pub") qui expire le 12 mai ; et une sous-clé (ligne "sub") qui expire aussi le 12 mai. La ligne "uid" vous donne l'identité de l'utilisateur correspondant.

La clé principale est utilisé pour les signatures, et la sous-clé pour le chiffrement.

Créez votre propre clé et vérifiez son existence.

Remarque : lors de la création d'une clé de plus longue durée, il est impératif de créer des certificats de révocation avec "$ gpg --output revoke.txt --gen-revoke uid" où "uid" est l'identité de la clé concernée. C'est ceci qui vous permettra de faire savoir que votre clé ne doit plus être utilisée... (Si vous perdez votre clé privée par exemple.)

ATTENTION : votre clé secrète doit rester secrète. Si quelqu'un y a accès, il peut usurper votre identité et lire les messages chiffrés qui vous sont adressés. Votre passphrase doit en garantir la sécurité, car c'est la seul protection que vous avez si quelqu'un peut accéder à votre compte... Choisissez donc une passphrase sûre, et ne la dévoilez à personne.

Ceci est d'autant plus important si vous avez distribué votre clé publique...

3.2. Partage des clés

3.2.1. À la main

Pour envoyer votre clé publique à quelqu'un, vous pouvez commencer par l'exporter avec la commande

$ gpg --output cle.asc --export --armour uid

où "uid" est l'identité (l'adresse email par exemple) de la clé concernée et "cle.asc" le nom du fichier qui contiendra la clé en ASCII.

Si vous voulez exporter la clé en binaire, il faut utiliser :

$ gpg --output cle.gpg --export uid

À l'inverse, pour importer une clé (en binaire ou en ASCII) contenue dans le fichier "cle", il suffit d'utiliser la commande

$ gpg --import  cle
  1. Échangez vos clés avec votre voisin en exportant la votre et important la sienne.
  2. Vérifiez qu'une nouvelle clé apparaît dans la liste affichée par "$ gpg --list-keys".

3.2.2. Avec un annuaire

Pour partager les clés à grande échelle, on utilise plutôt un serveur de clés. Il existe de nombreux serveurs publics inter-connectés, comme par exemple celui du MIT : pgp.mit.edu. Il est pour cette raison impossible de pirater ces annuaires...

Pour ne pas polluer les annuaires publics avec nos essais, nous utiliserons en fait un serveur de clé local installé sur la machine d53.lama.univ-savoie.fr. (Il s'agit de l'ordinateur dans mon bureau...) Ce serveur n'est par contre accessible que depuis le campus.

Pour envoyer une clé sur un serveur, il faut utiliser la commande

$ gpg --keyserver d53.lama.univ-savoie.fr --send-key 0xnnnnnnnn

nnnnnnnn est le numéro de votre cle (les chiffres apparaissant après le 1024D sur la première ligne de votre entrée lors de la commande gpg --list-keys.

Vous pouvez également récupérer des clés avec

$ gpg --keyserver d53.lama.univ-savoie.fr --recv-key 0xnnnnnnnn

Le plus simple pour trouver le numéro de la clé de quelqu'un dans l'annuaire est d'utiliser l'interface web : http://d53.lama.univ-savoie.fr:11371. Vous pouvez aussi utiliser une commande gpg:

$ gpg --keyserver d53.lama.univ-savoie.fr --search-keys hyvernat

pour chercher ma clé.

Enregistrez votre clé dans l'annuaire d53.lama.univ-savoie.fr, et récupérez ma clé ainsi que celle de votre (vos) voisin(e/s).

3.2.3. Vérifier et contre-signer une clé

Chaque clé possède une « empreinte digitale ». Quand vous récupérez une clé, il est important de vérifier cette empreinte... Cette empreinte est suffisamment petite pour être facilement transmissible (carte de visite etc.)

Par exemple, ma clé possède l'empreinte

CDC0 B0FA 4FA5 8C62 AB23  1F7C 593B 4CF7 2B79 C360

Comme on ne peut pas faire confiance à une page web, je vous l'écrirais au tableau...

Pour trouver l'empreinte d'une clé, vous pouvez utiliser

$ gpg --fingerprint

qui listera toutes les clés connues avec leur empreinte. Si vous mettez une chaîne de caractères à la fin de la commande, cela ne listera que les clés qui contiennent la chaîne en question. (Pratique quand vous avez beaucoup de clés.)

Une fois que vous avez vérifié une clé, vous pouvez l'authentifier pour dire « je fais confiance à cette clé... » On parle de contre-signature. La commande est simplement :

$ gpg --sign-key uid

où "uid" est l'identité de la clé à authentifier.

Une fois que vous avez contre-signé une clé, vous pouvez la renvoyer à l'annuaire pour qu'il prenne en compte votre signature sur la clé publique :

$ gpg --keyserver d53.lama.univ-savoie.fr --send-key 0xnnnnnnn
  1. Vérifiez l'empreinte des clés que vous avez récupérées, et authentifiez les.
  2. Donnez moi votre empreinte, en main propre, c'est à dire en l'inscrivant sur la feuille que j'aurais amené pour le TP...
  3. Contre-signez ma clé, et renvoyez la sur l'annuaire. Vérifiez, avec l'interface web ( http://d53.lama.univ-savoie.fr:11371) que ma clé a bien été contre-signée.

4. Signature électronique

4.1. Signature

Maintenant que vous avez des clés, vous pouvez signer des messages. Pour cela, il faut utiliser :

$ gpg --clearsign fichier

pour signer le fichier "fichier". Ceci créera un nouveau fichier "fichier.asc" qui contiendra le fichier original avec une signature vous authentifiant.

La commande

$ gpg --detach-sign fichier

permet elle de créer uniquement une signature (binaire) pour le fichier en question. Cette signature (fichier "fichier.sig") devra être envoyé avec le fichier original.

Pour un fichier texte, la première méthode est préférable. (Sauf si c'est un email et que votre logiciel gère les signatures en pièce jointe...) Pour un fichier binaire, il faut mieux utiliser la seconde méthode.

4.2. Vérification

Pour vérifier un fichier signé, on utilise

$ gpg --verify fichier.asc

Il faut bien entendu pour cela disposer de la clé publique de la personne qui a signé le document.

  1. Comparez les signatures d'un document original (par exemple : « Les misérables » de Victor Hugo et du même document où vous avez passé une lettre de minuscule à majuscule.
  2. Vérifiez la signature d'un message que votre voisin vous enverra.
  3. Vérifiez la signature d'un message qui a été modifié après signature. Que se passe-t'il ?

Deux versions du sujet du TP signé se trouvent ici et .

  1. Quelle la bonne version ? Décrivez les étapes nécessaires pour cette vérification.
  2. Quelle a été la clé utilisée pour créer cette signature (clé publique ou clé privée, de qui) ?
  3. Quelle a été la clé utilisée pour vérifier cette signature ?

5. Chiffrement

5.1. Chiffrement

Le principe est le même que pour la signature : on utilise

$ gpg --encrypt --armour fichier

pour obtenir un fichier ASCII "fichier.asc" contenant le fichier original crypté. GPG nous demandera les destinataires, à choisir parmi les gens dont on possède les clés publiques.

Si on veut obtenir un fichier binaire, la commande devient :

$ gpg --encrypt fichier

pour obtenir un fichier "fichier.gpg" contenant le fichier original crypté.

5.2. Déchiffrement

Toujours pareil : pour décrypter, on utilise

$ gpg --decrypt fichier
  1. Testez le cryptage / décryptage avec votre voisin...
  2. Si vous voulez crypter et signer un fichier, quels sont les différences entre :
    • signer puis crypter,
    • crypter puis signer ?

6. Réseau de confiance

Lisez les parties 3.2, 4.1.4 et 4.2 du manuel de GPG et décrivez succinctement le concept de réseau de confiance.

7. FIN

Pour rappel, voici ce que doit contenir votre rapport (au format txt) :

  1. la cryptanalyse de la question 1 (texte original et référence bibliographique)
  2. vos constatations / expérimentations des questions 2 et 3
  3. vos réponses pour la question 9 et 10
  4. un petit paragraphe pour la question 11