TP3 : Application de codage/decodage

publicité
TP3 : Application de codage/decodage
[email protected]
R&T 2ème année
Vous avez à votre disposition (sur le répertoire commun) : le cours, les TDs,
et quelques documents provenant d’Internet. Vous devez prendre l’habitude de rechercher l’information dans ces documents et dans le sujet de TP. Chaque question
inutile1 sera notée et aura des conséquences sur la note du TP.
A la fin du TP, envoyez par mail les fichiers .java présents dans le répertoire
src du répertoire TP2 de votre répertoire de travail Eclipse. Si je ne reçoit pas ces
fichiers (et seulement cela), votre note sera nulle.
N’hésitez pas utiliser l’aide de Java : http://java.sun.com/j2se/1.5.0/docs/api/
But du TP :
Utiliser les interfaces et les classes. Manipuler les String.
1 Application de codage/décodage
Avant de commencer votre TP, créez un nouveau projet TP3 dans Eclipse.
1.1 Principe
On souhaite réaliser une application qui va permettre de crypter/décrypter un
texte rentré par l’utilisateur. L’application sera capable d’utiliser plusieurs codes de
cryptage.
1.2 Présentation de l’application
Le diagramme UML de l’application est présenté en figure 1, utilisez le comme
base de travail, mais réalisez bien le tp dans l’ordre.
1.3 Classe de test
La première classe à construire est une classe de test ayant simplement une
méthode main ce qui va vous permettre de pourvoir tester vos classes les unes
après les autres. A la fin du TP, elle proposera différentes options à l’utilisateur.
1
qui a sa réponse de manière simple dans les fichiers fournis
1
1.4 L’interface Cryptage
Pour créer une interface, utilisez l’assistant (File, New, Interface). Dans cette
interface, placez la déclaration des entêtes des deux méthodes (sans accolades,
terminées par un point virgule).
1.5 La classe EncodeCesar
Cette classe encode une chaı̂ne de caractères en utilisant le codage de César
(http://fr.wikipedia.org/wiki/Chiffre de C%C3%A9sar)
Créez la classe EncodeCesar en utilisant l’assistant de création de classe. En
face du champ Interfaces, cliquez sur Add puis remplissez le champ de texte avec
Cryptage (normalement Eclipse vous le propose en tapant seulement quelques
caractères). Automatiquement, Eclipse va rajouter les deux méthodes nécessaires
dans le code.
Créez ensuite les différents attributs et les entêtes des méthodes restantes (dont
le constructeur).
Le constructeur EncodeCesar(int uneValeur) La valeur reçue en paramètre
doit simplement être placé dans l’attribut valeur.
La méthode void setSourceText(String string) Cette méthode place la chaine
reçue dans l’attribut source puis appelle la méthode Encrypt
La méthode void Encrypt() Cette méthode encrypte la chaı̂ne désignée par l’attribut source et la place dans l’attribut destination.
La principe de cryptage est le suivant :
– Si le caractère est compris entre ’a’ et ’z’ le caractère est remplacé par sa
valeur encodé.
– Si le caractère est compris entre ’A’ et ’Z’ le caractère est remplacé par sa
valeur encodé.
– Sinon, le caractère (chiffre, ponctuation, . . .) n’est pas remplacé.
Pour encoder les minuscules, la formule est la suivante :
valeur codé = ’a’ + ( valeur à encoder - ’a’ + valeur ) modulo 26
On en déduit la formule pour encoder les majuscules.
En java, il est possible d’ajouter un entier à un caractère. Après des opérations
arithmétiques sur des char, Eclipse peut signaler une erreur et proposer un transtypage (cast en anglais) pour résoudre cette erreur. Le transtypage est une notation
du type b = (char) a. Elle consiste à “considérer” la variable a comme un char
avant de la placer dans b (qui lui est un char).
L’encodage se faisant caractère par caractère la chaı̂ne destination est modifiée très souvent. Pour améliorer les performances de votre programme il est plus
judicieux d’utiliser un objet de la classe StringBuffer comme variable temporaire
pendant l’encodage. Une fois l’encodage fini, vous n’avez plus qu’à construire un
objet de la classe String à partir de cette variable temporaire puis de l’associer à
l’attribut destination.
2
Les différentes méthodes associées aux classes String et StringBuffer sont
disponibles dans l’aide générale du langage Java sur http://java.sun.com/j2se/1.5.0/docs/a
La liste des classes est dans la partie inférieur gauche de la page internet.
L’implémentation en Java nécessite quelques précautions, l’opérateur modulo
(représenté par les symbole %) n’a pas le comportement voulu (voir le détail sur
http://fr.wikipedia.org/wiki/Modulo %28informatique%29).
La méthode int Modulo(int x, int y) Comme le modulo calculé par Java n’a
pas le comportement voulu, vous allez écrire une méthode permettant de calculer
“le bon” modulo. La méthode int Modulo(int x, int y) renvoie le modulo de x
divisé par y. Le modulo calculé par l’opérateur % est le bon si il est positif.
Si le modulo calculé par l’opérateur % est négatif votre fonction doit renvoyer y
+ x%y.
La méthode String getCryptedText() Cette méthode renvoie l’attribut destination.
1.6 La classe DecodeCesar
Elle est identique à la classe précédente sauf qu’elle décode la chaı̂ne désignée
par l’attribut source et place la version décodée dans l’attribut destination.
A partir du schéma UML et du travail fait ci-dessus, écrivez la classe DecodeCesar
1.7 Test de vos deux classes
La fonction main de votre classe de test doit avoir deux variables de type Cryptage.
Ces deux variables seront nommées moteurCryptage et moteurDecryptage. Il n’y
a pas d’erreur, le type de ces deux variables est bien une interface.
Créez ensuite pour moteurCryptage un objet de type EncodeCesar avec une
valeur de décalage de 5 (par exemple) et créez pour moteurDecryptage un objet de
type DecodeCesar avec le même décalage.
Demandez ensuite à l’utilisateur de donner une chaı̂ne de caractère (en utilisant
la méthode nextLine() d’un objet de type Scanner).
Affichez la chaı̂ne encodée.
Décodez la chaı̂ne et affichez le résultat.
1.8 Les classes DecodeVigenere et EncodeVigenere
Le codage de Vigenère est plus efficace que le codage de César. Il est présenté
dans http://fr.wikipedia.org/wiki/Chiffre de Vigen%C3%A8re. Par rapport
au codage de César, il nécessite une clef de cadage (une chaı̂ne de caractère), qui
permet de calculer un décalage variable contrairement au code de César.
Exemple La clef de codage est le mot clef et le texte à encoder est Linux. Une
méthode possible est basée sur le calcul de l’ecart entre une lettre de la clef et la
lettre ’a’. Dans notre cas, les étapes de codage sont les suivantes :
– La lettre L sera codée avec un décalage valant ’c’-’a’
3
–
–
–
–
La
La
La
La
lettre
lettre
lettre
lettre
i
n
u
x
sera
sera
sera
sera
codée
codée
codée
codée
avec
avec
avec
avec
un
un
un
un
décalage
décalage
décalage
décalage
valant
valant
valant
valant
’l’-’a’
’e’-’a’
’f’-’a’
’c’-’a’
Travail à effectuer Créez les deux classes DecodeVigenere et EncodeVigenere
comme pour le codage de César. Les principaux point de changement sont les
constructeurs, ils reçoivent une chaı̂ne de caractères qui est la clef de codage/décodage
(toujours en minuscules) et les méthode Encrypt.
Test du cryptage de Vigenère Dans la classe de test vous avez juste à changer
les deux constructeurs des objets moteurCryptage et moteurDecryptage.
1.9 Utilisation d’un fichier source
Cette partie est destinée aux étudiants les plus avancés dans le TP. . .
Pour cette partie, n’hésitez pas à regarder l’aide de java (http://java.sun.com/j2se/1.5.0/d
ainsi que des tutoriaux sur Internet.
Dans la méthode de test vous pouvez utiliser un fichier texte comme données à
encrypter/decrypter.
Les fichiers sont représentés à l’aide de la classe File. Le constructeur de cette
classe accepte une chaı̂ne de caractères qui représente le nom du fichier.
Pour lire dans un fichier texte, on utilise un objet Scanner comme précédemment,
le fichier (objet de la classe File) à lire étant passé en paramètre au constructeur.
L’accès aux fichiers demande quelques précautions (problèmes d’entrés/sorties, fichier non existant,. . .) qui sont gérées par les exceptions. Lorsque vous travaillerez
sur cette partie, Eclipse vous signalera une erreur du type “Unhandled exception
type FileNotFoundException”, demandez à l’enseignant des explications. . .
Pour écrire dans un fichier, on utilise un objet de type PrintWriter. Il peut être
construit en plaçant le fichier à écrire en paramètre du constructeur. Ensuite, la
méthode println est utilisée comme pour écrire du texte sur le terminal.
4
DecodeVigenere
- source : Chaine
- destination : Chaine
- clef : Chaine
+ DecodeVigenere(Chaine laClef)
+ setSourceText(Chaine unTexte) :
+ getCryptedText() : Chaine
- Encrypt() :
- Modulo(Entier x, Entier y) : Entier
EncodeVigenere
- source : Chaine
- destination : Chaine
- clef : Chaine
+ EncodeVigenere(Chaine laClef)
+ setSourceText(Chaine unTexte) :
+ getCryptedText() : Chaine
- Encrypt() :
- Modulo(Entier x, Entier y) : Entier
DecodeCesar
- source : Chaine
- destination : Chaine
- valeur : entier
+ DecodeCesar(entier uneValeur)
+ setSourceText(Chaine unTexte) :
+ getCryptedText() : Chaine
- Encrypt() :
- Modulo(Entier x, Entier y) : Entier
Interface Cryptage
+ setSourceText(Chaine unTexte) :
+ getCryptedText() : Chaine
EncodeCesar
- source : Chaine
- destination : Chaine
- valeur : entier
+ EncodeCesar(entier uneValeur)
+ setSourceText(Chaine unTexte) :
+ getCryptedText() : Chaine
- Encrypt() :
- Modulo(Entier x, Entier y) : Entier
F IG . 1 – Schéma UML des différents
éléments du programme
5
Téléchargement