Exécuter le code
Enregistrez le code sous le nom caesar.php et lancez-le dans le terminal. Aucun serveur web n’est nécessaire pour cela :
php caesar.phpSi le chiffre lui-même est nouveau pour vous, le guide l’explique sans code.
Comment fonctionne le code
str_split découpe le texte en octets, et ctype_alpha repère les lettres de A à Z. ord() donne le numéro d’une lettre : 66 pour B et 98 pour b. En retirant 65 ou 97, on obtient son rang dans l’alphabet, de 0 à 25.
Une fois le décalage ajouté, le modulo revient au début de l’alphabet : avec un décalage de 3, le Z tombe sur le C. chr() repasse ensuite du nombre à la lettre.
Les espaces, la ponctuation et les chiffres passent par la branche else sans changer. Même chose pour les lettres accentuées : en UTF-8, é occupe deux octets, et aucun des deux n’est une lettre pour ctype_alpha.
Déchiffrer en PHP
Inutile d’écrire une seconde fonction. Déchiffrer revient à décaler dans l’autre sens : il suffit de passer un nombre négatif.
echo caesar('Erqmrxu à wrxv !', -3), "\n";// Bonjour à tous !D’où le + 26 supplémentaire dans la formule. En PHP, % conserve le signe du nombre de gauche : -3 % 26 vaut -3, et ce rang n’existe pas. En ajoutant 26 puis en reprenant le modulo, on obtient 23, et le A revient au X. PHP fournit d’ailleurs str_rot13(), mais cette fonction ne connaît que le décalage de 13.
Un formulaire web
Placez ce code sous la fonction, enregistrez le fichier et lancez le serveur intégré avec php -S localhost:8000 caesar.php. Ouvrez ensuite cette adresse dans un navigateur.
<?php$text = $_POST['text'] ?? '';$shift = (int) ($_POST['shift'] ?? 3);$result = $text === '' ? '' : caesar($text, $shift);?><form method="post"> <textarea name="text"><?= htmlspecialchars($text) ?></textarea> <input name="shift" type="number" value="<?= $shift ?>"> <button>Chiffrer</button></form><p><?= htmlspecialchars($result) ?></p>Les deux sorties passent par htmlspecialchars, car le texte vient du visiteur. Sans cela, n’importe qui pourrait glisser un script dans votre page.
Un script en ligne de commande
Remplacez les deux dernières lignes de caesar.php par ce code pour recevoir le décalage et le texte en arguments :
if ($argc !== 3) { exit("Usage : php caesar.php <décalage> <texte>\n");} echo caesar($argv[2], (int) $argv[1]), "\n"; // php caesar.php 3 "Bonjour"// ErqmrxuUn endpoint JSON avec Laravel
Dans un projet Laravel, placez la fonction dans un helper ou une classe dédiée et ajoutez cette route à routes/api.php. Laravel valide les données et renvoie le tableau en JSON.
use Illuminate\Http\Request;use Illuminate\Support\Facades\Route; Route::post('/caesar', function (Request $request) { $data = $request->validate([ 'text' => 'required|string|max:1000', 'shift' => 'required|integer|between:-25,25', ]); return ['result' => caesar($data['text'], (int) $data['shift'])];});En cas de données invalides, le framework répond lui-même par une erreur : la fonction ne reçoit donc que des valeurs propres. S’il vous faut simplement un endpoint qui marche, notre API REST gratuite tourne déjà.
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 :
function crack(string $text): void{ for ($shift = 1; $shift < 26; $shift++) { echo $shift, ' ', caesar($text, -$shift), "\n"; }} 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 une chaîne et utilisez les fonctions mb_, qui comptent des caractères et non des octets. Ici, l’alphabet comprend aussi les chiffres :
const ALPHABET = 'abcdefghijklmnopqrstuvwxyz0123456789'; function caesarAlphabet(string $text, int $shift): string{ $size = mb_strlen(ALPHABET); $result = ''; foreach (mb_str_split($text) as $c) { $lower = mb_strtolower($c); $position = mb_strpos(ALPHABET, $lower); if ($position === false) { $result .= $c; } else { $index = (($position + $shift) % $size + $size) % $size; $next = mb_substr(ALPHABET, $index, 1); $result .= $c === $lower ? $next : mb_strtoupper($next); } } return $result;} echo caesarAlphabet('Salle 101', 3), "\n";// Vdooh 434Le retour au début dépend désormais de mb_strlen, 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
Lisez tout le fichier avec file_get_contents et écrivez le résultat avec file_put_contents. La première renvoie false en cas d’échec, d’où le test.
$text = file_get_contents('message.txt'); if ($text === false) { exit("Impossible de lire message.txt\n");} file_put_contents('encrypted.txt', caesar($text, 3));Le même chiffre sous forme de classe
Une classe devient utile si vous réutilisez souvent la même clé. Une classe readonly, disponible depuis PHP 8.2, empêche le décalage de changer une fois défini :
final readonly class CaesarCipher{ public function __construct(private int $shift = 3) { } public function encrypt(string $text): string { return caesar($text, $this->shift); } public function decrypt(string $text): string { return caesar($text, -$this->shift); }} echo (new CaesarCipher(5))->encrypt('Bonjour à tous !'), "\n";// Gtsotzw à ytzx !Tester votre code
Les réglages de production désactivent en général assert : activez-le donc pour les tests avec php -d zend.assertions=1 -d assert.exception=1 caesar.php. Si tout va bien, le programme affiche OK. Dans un vrai projet, les mêmes vérifications trouvent leur place dans PHPUnit ou Pest.
assert(caesar('ABC', 3) === 'DEF');assert(caesar('xyz', 3) === 'abc');assert(caesar('Hello, World!', 5) === 'Mjqqt, Btwqi!');assert(caesar(caesar('PHP', 7), -7) === 'PHP');assert(caesar('A', -27) === 'Z');assert(caesar('é', 3) === 'é');echo "OK\n";Erreurs fréquentes
La plus courante reste % avec un décalage négatif, comme on l’a vu. Vient ensuite l’affichage du résultat sans htmlspecialchars. Par ailleurs, strlen et $text[0] travaillent sur des octets : en UTF-8, ils coupent les lettres accentuées en deux. Pour des caractères entiers, utilisez les fonctions mb_.
Questions fréquentes
Quelle version de PHP faut-il ?
La fonction principale tourne à partir de PHP 7, et la classe readonly demande PHP 8.2. Nous avons exécuté le code de cette page sous PHP 8.4.
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, PHP offre un chiffrement moderne avec l’extension sodium, et les mots de passe passent par password_hash().
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.