Académique Documents
Professionnel Documents
Culture Documents
Premier exemple
Second exemple
Temps
d’exécution 21 21 22 25 28 30 41 911
En ms
Données de décodage
1 package tp.crypto.codageTransposition;
2
3 import java.io.BufferedReader;
8
9 public class CodageTransposition {
10 public static void main(String[] args) {
11
12 codage("message.txt", 15); // message.txt est le fichier texte où se trouve le
texte à coder
13 long start = System.currentTimeMillis();
14 decodage("code.txt", 15); // code.txt est le fichier texte où est mis le code
obtenue
15 long end = System.currentTimeMillis();
16
17 System.out.println("Le temps de codage de ce message avec la clef 5 est " + (end -
start) + " ms");
18
19 }
20
21 public static void codage(String messageACoder, int clef) {
22
23 try (BufferedReader br = new BufferedReader(new FileReader(messageACoder));
24 BufferedWriter bw = new BufferedWriter(new FileWriter("code.txt"))) {
25
26 String ligne;
27 while ((ligne = br.readLine()) != null) { // on recupere ligne après ligne dans
le fichier
28
29 // -----------------------calcul du nombre de ligne de la matrice en
fonction du
30 // nombre de caractère de la
31 // ligne et de la clef
32
33 int nbreDeLigneMatrice = nbreLigneMatrice(ligne.length(), clef);
34
35 char[] ligneTab = ligne.trim().toCharArray(); // effacement des espaces
36 char[][] matrice = new char[nbreDeLigneMatrice][clef];
37
38 int i = 0, j = 0, k = 0;
39 while (i < nbreDeLigneMatrice) { // on parcourt le tableau en ligne
40 j = 0;
41 while (j < clef && k < ligneTab.length) { // on ne s'arrête de copier
dans la ligne que si
42
43 // l'on a tout lu la ligne récupérée ou alors si l'on est en fin de
44 // ligne du tableau
45
46 if (ligneTab[k] == ' ') // quand on retrouve l'espace, on le
remplace par le carré
47
48 matrice[i][j] = (char) 164; // 164 represente le carré en code
ASCII
49
50 else // dans le caas contraire,on recopie normalement des
caractères
51
52 matrice[i][j] = ligneTab[k];
53
54 j++;
55 k++;
56 }
57 i++;
Page 1
CodageTransposition.java
58 }
59
60 //-------------------------------------------------------------------------
------
61 // Completion des cases vides par des carre
62 for (int cpt = j; cpt < clef; cpt++) {
63 matrice[nbreDeLigneMatrice - 1][cpt] = (char) 164; // 164 represente le
carre dans le code ASCII
64 }
65
66 // Lecture de la matrice et reconstitution du code de la ligne dans un
String
67 //ceci se faisant en lisant la matrice colone par colone
68
69 String message = "";
70 for (int p = 0; p < clef; p++) {
71 for (int q = 0; q < nbreDeLigneMatrice; q++) {
72 message += matrice[q][p];
73 }
74
75 }
76
77 // Ecriture de la ligne codée dans le fichier de reponse
78 bw.write(message);
79 bw.newLine();
80
81 }
82 } catch (IOException e) {
83 e.printStackTrace();
84 }
85
86 }
87
88 public static void decodage(String messageADeCoder, int clef) {
89
90 try (BufferedReader br = new BufferedReader(new FileReader(messageADeCoder));
91 BufferedWriter bw = new BufferedWriter(new FileWriter("messageclair.txt")))
{
92
93 String code; // ligne du fichier codé
94 String texteClair = "";
95
96 while ((code = br.readLine()) != null) { //-----------lecture en ligne du
fichier
97
98 texteClair = decrypte(code, clef); //decodage de la ligne lue
99
100 bw.write(texteClair); //ecriture de la ligne décodée dans le fichier
contenant le texte clair
101 bw.newLine();
102 }
103
104 } catch (IOException e) {
105 e.printStackTrace();
106 }
107
108 }
109
110 /**
111 * @param tailleMessage
112 * @param clef
113 * @return Retourne le nombre de ligne de la matrice de codage
Page 2
CodageTransposition.java
114 */
115
116 //-------------------------------------------------------------------------------------
--------------------
117
118 /*
119 * cette donction permet de déterminer le nombre de ligne de la matrice de taille clef
120 * pouvant contenir un certain nombre de caratères appelé tailleMessage
121 *
122 */
123 private static int nbreLigneMatrice(int tailleMessage, int clef) {
124 if (tailleMessage % clef == 0) {//si la clef est multiple de la taille du message,
on fait une division entière
125 return tailleMessage / clef;
126 } else { //dans le cas contraire on ajoute une ligne de plus au quotient ce qui
permettre de contenir le reste de
127 //caractères et des espaces
128 return (tailleMessage / clef) + 1;
129 }
130 }
131
132 //-------------------------------------------------------------------------------------
-----------------------
133
134 /*
135 * Cette fontion decrypte permet de décrypter une ligne
136 */
137 public static String decrypte(String code, int cle) {
138 int taille = ((code.length()) / cle), longueur; //longueur stocke le nombre de
ligne
139 //------------------------------------------calcul du nombre de ligne
140 String texteClair = new String("");
141 if (((code.length()) % taille) == 0) {
142 longueur = (code.length()) / taille;
143 } else {
144 longueur = (code.length()) / taille + 1;
145 }
146
147 //-----------------------------------------------------------------
148
149
150 char[][] tab = new char[longueur][taille];
151 int i = 0, j = 0, k = 0;
152 while (i < longueur) { // insertion du message dans le tableau
153 j = 0;
154
155 while (j < taille && k < code.length()) {
156 if ((int) (code.charAt(k)) == 164) { //les espaces sont remis à leur
place
157 tab[i][j] = ' ';
158
159 j++;
160 k++;
161 } else {
162 tab[i][j] = code.charAt(k);
163 j++;
164 k++;
165 }
166 }
167 i++; //on avance la ligne
168
169 }
Page 3
CodageTransposition.java
170
171 // ---------lecture de la matrice dans l'ordre inverse(en colone) dans le but de
d chiffrer
172 // le message
173
174 for (i = 0; i < taille; i++) {
175 for (j = 0; j < longueur; j++) {
176 texteClair += tab[j][i];
177 }
178 }
179
180 return texteClair.trim();
181
182 }
183
184 }
185
Page 4