Encoder / Décoder des chaines de caractères avec le code Vigenère

Comment encoder avec Vigenere ? (Principe de chiffrement)

Le chiffrement utilise une clé (et un alphabet).

Soient le message clair DCODE, la clé CLE et l'alphabet latin ABCDEFGHIJKLMNOPQRSTUVWXYZ

A chaque lettre, on fait correspondre la valeur de son rang dans l'alphabet en partant de 0=A,1=B,...,25=Z

Il y a plusieurs méthodes de chiffrement (qui arrivent au même résultat) :

Chiffrement Vigenere par addition de lettres

Le chiffrement consiste à additionner la clé au texte clair. Le calcul s'effectue lettre après lettre (on n'additionne pas directement les lettres mais leur valeur dans l'alphabet).

Le résultat est donné modulo 26 : si le résultat est supérieur ou égal à 26, on soustrait 26 au résultat (où 26 est la longueur de l'alphabet).

La clé est répétée aussi souvent que nécessaire pour correspondre à la longueur du texte : CLECLECLEC...

On prend les premières lettres du message D (=3) et de la clé C (=2) et on les ajoute 3+2=5. On note la valeur et on continue avec la lettre suivante du message C (=2) et la lettre suivante de la clé L (=11) : 2+11=13 etc. Si on arrive à la fin de la clé, on recommence au début de celle-ci.

Pour chaque nombre obtenu (qui doit avoir une valeur entre 0 et 25), on fait correspondre la lettre ayant le même rang dans l'alphabet.

D. C. O. D. E (message clair)
3. 2.14. 3. 4 (valeurs des lettres du message)
C. L. E. C. L (clé de chiffrement répétée)
2.11. 4. 2.11 (valeurs des lettres de la clé)
5.13.18. 5.15 (résultat de l'addition modulo 26)
F. N. S. F. P (message chiffré)

Comment décoder par Vigenere ? (Principe de déchiffrement)

Le déchiffrement nécessite une clé (et un alphabet).

Soient le message chiffré FNSFP, la clé CLE et l'alphabet latin ABCDEFGHIJKLMNOPQRSTUVWXYZ

Déchiffrement de Vigenere par soustraction de lettres

A chaque lettre, on fait correspondre la valeur de son rang dans l'alphabet en partant de 0=A,1=B,...,25=Z.

Pour déchiffrer, prendre la première lettre du message et la première lettre de la clé, et soustraire leurs valeurs. Si le résultat est négatif, ajouter 26 au résultat (où 26 est le nombre de lettres dans l'alphabet), le résultat correspond au rang dans l'alphabet de la lettre claire.

On prend les premières lettres du message F (=5) et de la clé C (=2) et on les soustrait (5-2=3), la lettre de rang 3 est D.

On continue avec la lettre suivante du message et la lettre suivante de la clé, arrivé à la fin de la clé, on recommence au début de celle ci.

F. N. S. F. P (message chiffré)
5.13.18. 5.15 (valeurs des lettres du message)
C. L. E. C. L (clé de chiffrement répétée)
2.11. 4. 2.11 (valeurs des lettres de la clé)
3. 2.14. 3. 4 (résultat de la soustraction modulo 26)
D. C. O. D. E (message clair)

Ce qu'il faut faire ?

Vous allez écrire deux programmes en C, code et decode. Le premier servira à coder un texte avec le code vigenère, le second à le décoder. Ces programmes devront correspondre à la descriptions ici dessous (section "Manuels").

Rendu

  • le projet doit être envoyé par mail, depuis une adresse ESIEE, au plus tard le to be defined...
  • le sujet du mail doit commencer par [E3FR LOGIN1 LOGIN2] où LOGIN1 et LOGIN2 sont a remplacer par les logins ESIEE des deux membres du binome
  • le mail contient une unique pièce jointe, "login1_login2.tgz"
    • Pour creer une archive : tar czf archive.tgz REPERTOIRE (toujours archiver un repertoire et non une liste de fichiers)
    • Pour décrompresser une archive : tar xzf archive.tgz
  • Un seul trinome et/ou monome au plus sera accepté (aux délégués d'arbitrer)
  • Le projet pourra être évalué en partie au cours d'une soutenance. Les conditions spécifiques de cette soutenance vous seront commniquées ultérieurement, mais les deux membres d'un même binômes n'auront pas automatiquement la même note.
  • Si deux projets sont trop similaires, les deux auront 0. Les choix techniques sont suffisemment peu imposés pour que deux binomes "travaillants" ensemble soient facilement détectés

Contenu

L'archive, une fois décompressée, génèrera un unique dossier login1_login2/ contenant :

  • un sous dossier bin
  • un sous dossier src
  • un sous dossier doc
  • Le dossier doc devra contenir deux fichiers : user_manual.pdf dev_manual.pdf

    user_manual.pdf decrit comment installer le programme à partir de l'archive, comment le lancer, les fonctionnalités du programme, les bugs... Bref, tout ce qu'un utilisateur du programme doit savoir.

    dev_manual.pdf decrit comment est écrit le programme : les choix algorithmiques, le design du code, comment rajouter des fonctionnalités, des pistes pour corriger les bugs... Il doit permettre à un développeur de comprendre votre code et de le modifier. Il ne devra surtout pas contenir de code, même des petits bouts. Il peut éventuellement faire référence à un fichier source présent dans le répertoire src/. Ce document est très très important. Il est aussi important, voir plus, que le code lui même pour la notation.

  • Le dossier login1_login2/ devra contenir un fichier Makefile.
  • Le dossier bin devra être vide !
  • Vous pouvez ajouter un répertoire tests contenant des fichiers permettant de tester d'autres alphabets / clés (voir plus bas)
  • La commande make devra compiler les fichiers sources du répertoire src et placer (tous) les fichiers produits dans le répertoire bin (aucun fichier ne doit venir polluer le répertoire src)
  • "make clean" effacera les fichiers binaires, "make force" recompilera toutes les cibles.
  • La commande de compilation devra utiliser les options de gcc vues en cours : -ansi -pedantic -Wall
  • Les projets qui ne compilent pas (error) ne sont pas corrigés.
  • Un point en moins par avertissements (warning).
  • "make code" devra produire l'executable "code" (dans bin)
  • "make decode" devra produire l'executable "decode" (dans bin)
  • "make" devra produire les deux executables (dans bin)
  • Les exécutables devront afficher leur mode d'emploi (voir section suivante) s'ils sont appelés avec les options --help ou -h

Il est interdit d'utiliser du code externe et tout code commun à plusieurs projets vaudra zéro pour tous les projets concernés.


Manuels

code

Synopsis

code [options] [fichier...]
Options : [-sh] [--help] [--skip] [-a alphabet] [-k clé] [--alphabet=alphabet] [--key=clé]

Description

Le programme code encode un texte en utilisant le code Vigenère.
Lorsqu'aucun fichier n'est fourni, l'encodage se fait depuis l'entrée standard vers la sortie standard, ligne par ligne.
Lorsqu'un seul fichier est fourni, l'encodage se fait depuis le fichier vers la sortie standard.
Lorsque deux fichiers sont fournis, l'encodage se fait depuis le premier vers le deuxième.
L'option -s (--skip), lorsqu'elle est présente, indique que les lettres du texte à encoder non présentes dans l'alphabet sont supprimées. Lorsqu'elle est absente, ces lettres restent en clair dans le message codé.
Les options -a (--alphabet) et -k (--key) permettent de spécifier les fichiers contenant respectivement l'alphabet et la clé. Si elles sont absentes, l'alphabet est l'alphabet latin non accentué composé uniquement de lettres minuscules (abcdefghijklmnopqrstuvwxyz) et la clé est notaverysmartkey.
L'option -h (--help) affiche ce manuel.

Exemple

à venir

decode

Synopsis

decode [options] [fichier...]
Options : [-sh] [--help] [--skip] [-a alphabet] [-k clé] [--alphabet=alphabet] [--key=clé]

Description

Le programme decode decode un texte en utilisant le code Vigenère.
Lorsqu'aucun fichier n'est fourni, le décodage se fait depuis l'entrée standard vers la sortie standard, ligne par ligne.
Lorsqu'un seul fichier est fourni, le décodage se fait depuis le fichier vers la sortie standard.
Lorsque deux fichiers sont fournis, l'encodage se fait depuis le premier vers le deuxième.
L'option -s (--skip), lorsqu'elle est présente, indique que les lettres du texte à décoder non présentes dans l'alphabet sont supprimées. Lorsqu'elle est absente, ces lettres sont restituées telles quelles dans le message décodé.
Les options -a (--alphabet) et -k (--key) permettent de spécifier les fichiers contenant respectivement l'alphabet et la clé. Si elles sont absentes, l'alphabet est l'alphabet latin non accentué composé uniquement de lettres minuscules (abcdefghijklmnopqrstuvwxyz) et la clé est notaverysmartkey
L'option -h (--help) affiche ce manuel.

Exemple

à venir

Aide, conseils,

  • Commencez par réaliser une version minimaliste du programme, qui fonctionne sans options et qui travaille sur des chaines de caractères constantes déclarées dans le main() et passées à des fonctions.
  • Ajoutez ensuite la possibilité de changer l'alphabet et la clé de chiffrement, toujours en les spécifiant dans des chaines de caractères constantes déclarées dans le main() et passées en paramètres supplémentaires à vos fonctions précédantes.
  • Passez ensuite à la gestion des fichiers. Ceci n'a pas été vu en cours. Vous pouvez vous aider d'internet et de ce document.
  • Pour gérer les options, vous utiliser les fonctions de la famille getopt()
  • Votre code devra minimiser la duplication de code (notamment les deux programmes devraient théoriquement partager un certain nombre de fonctions). Il devra être proprement structuré avec des fichiers .h et .c dont le contenu sera déterminé intelligemment.