Compiler et exécuter
Enregistrez le programme sous le nom CaesarCipher.java : le nom du fichier doit correspondre à celui de la classe. Lancez ensuite ces deux commandes dans le même dossier :
javac CaesarCipher.javajava CaesarCipherLa première compile le code, la seconde l’exécute et affiche le texte chiffré. Si le chiffre lui-même est nouveau pour vous, le guide l’explique sans code.
Comment fonctionne le code
En Java, un char est aussi un nombre, et l’on peut donc calculer directement avec lui : 'B' - 'A' vaut 1, le rang de la lettre dans l’alphabet. Une fois le décalage ajouté, Math.floorMod maintient le résultat entre 0 et 25 : avec un décalage de 3, le Z tombe sur le C.
base + index donne un int, d’où la conversion (char). Un StringBuilder rassemble le résultat, car ajouter à un String dans une boucle crée chaque fois un nouvel objet.
Les espaces, la ponctuation et les chiffres passent par la branche else sans changer. Le test c < 128 est là parce que Character.isLetter accepte aussi les lettres accentuées : sans lui, é devient j avec un décalage de 3, et impossible ensuite de retrouver le é d’origine.
Déchiffrer en Java
Inutile d’écrire une seconde méthode. Déchiffrer revient à décaler dans l’autre sens : il suffit de passer un nombre négatif.
System.out.println(caesar("Erqmrxu à wrxv !", -3));// Bonjour à tous !Voilà pourquoi le code emploie Math.floorMod. Le % de Java conserve le signe du nombre de gauche : -3 % 26 vaut -3, ce qui n’est même pas une lettre. Math.floorMod(-3, 26) vaut 23, et le A revient au X. Dans la version Python, l’opérateur % se comporte déjà ainsi.
Lire la saisie avec Scanner
Beaucoup d’exercices demandent un programme qui lit le texte et le décalage au clavier. Placez l’import tout en haut du fichier et remplacez main par ce code :
import java.util.Scanner; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Texte : "); String text = scanner.nextLine(); System.out.print("Décalage : "); int shift = scanner.nextInt(); System.out.println(caesar(text, shift));}Lisez d’abord le texte. nextInt() laisse la fin de ligne en attente, si bien qu’un nextLine() placé après renverrait une chaîne vide.
Casser le code par force brute
Avec 26 lettres, il n’y a que 25 décalages à essayer, et une courte boucle suffit pour lire un message sans la clé. Cherchez dans la sortie la ligne qui a du sens :
public static void crack(String text) { for (int shift = 1; shift < 26; shift++) { System.out.println(shift + " " + caesar(text, -shift)); }} public static void main(String[] args) { crack("Erqmrxu à wrxv !"); // 1 Dqplqwt à vqwu ! // 2 Cpokpvs à upvt ! // 3 Bonjour à tous ! // ...}L’article sur l’attaque par force brute va plus loin, et le casseur en ligne fait la même chose dans votre navigateur.
Autres alphabets et chiffres
Pour décaler autre chose que A à Z, gardez l’alphabet dans un String et cherchez chaque caractère avec indexOf(). Ici, l’alphabet comprend aussi les chiffres :
static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789"; public static String caesarAlphabet(String text, int shift) { StringBuilder result = new StringBuilder(); for (char c : text.toCharArray()) { int position = ALPHABET.indexOf(Character.toLowerCase(c)); if (position == -1) { result.append(c); } else { int index = Math.floorMod(position + shift, ALPHABET.length()); char next = ALPHABET.charAt(index); result.append(Character.isUpperCase(c) ? Character.toUpperCase(next) : next); } } return result.toString();} public static void main(String[] args) { System.out.println(caesarAlphabet("Salle 101", 3)); // Vdooh 434}Le retour au début dépend désormais de ALPHABET.length(), et il suffit de modifier la chaîne pour y ajouter é, è ou ç. Notre outil de chiffre de César propose aussi des alphabets tout prêts pour comparer les résultats.
Chiffrer un fichier texte
Files.readString et Files.writeString lisent et écrivent un fichier entier en une ligne, en UTF-8 par défaut, ce qui préserve les accents. Elles peuvent échouer : main doit donc déclarer throws IOException.
import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path; public static void main(String[] args) throws IOException { String text = Files.readString(Path.of("message.txt")); Files.writeString(Path.of("encrypted.txt"), caesar(text, 3));}Tester votre code
Placez ces lignes dans main pour repérer les bugs habituels. Java ignore assert tant que vous ne l’activez pas : lancez donc le programme avec java -ea CaesarCipher. Si tout va bien, il affiche OK.
assert caesar("ABC", 3).equals("DEF");assert caesar("xyz", 3).equals("abc");assert caesar("Hello, World!", 5).equals("Mjqqt, Btwqi!");assert caesar(caesar("Java", 7), -7).equals("Java");assert caesar("A", 26).equals("A");assert caesar("é", 3).equals("é");System.out.println("OK");Erreurs fréquentes
La plus courante reste % avec un décalage négatif, comme on l’a vu. Autre oubli classique, la conversion : result.append(base + index) ajoute le nombre 75 là où vous vouliez la lettre K. Et comparez les chaînes de vos tests avec equals(), car == vérifie seulement s’il s’agit du même objet.
Questions fréquentes
Quelle version de Java faut-il ?
Le programme principal fonctionne à partir de Java 8. L’exemple avec un fichier demande Java 11, qui a introduit Files.readString. Nous avons compilé et exécuté le code de cette page avec Java 21.
Puis-je protéger de vraies données avec ce code ?
Non. La boucle ci-dessus le casse en quelques secondes. Gardez-le pour apprendre et pour les énigmes. Pour de vraies données, Java fournit un chiffrement moderne comme AES dans le paquet javax.crypto.
Comment vérifier mon résultat ?
Saisissez le même texte et le même décalage dans notre outil de chiffre de César et comparez. Vous pouvez aussi appeler l’API REST gratuite depuis vos tests.