Votre collègue semble ignorer 😉 que
rot13(rot13(message_clair)) = message_clair
Plus d’informations sur ROT13 : https://fr.wikipedia.org/wiki/ROT13
Utilisons Julia pour trouver le flag.
Téléchargez et installez Julia via https://julialang.org/downloads/
En fait vous obtiendrez juliaup
qui est un gestionnaire d’installations Julia qui permet de :
- Installer plusieurs versions de Julia
- Basculer facilement entre ces versions
- Mettre à jour automatiquement
- Gérer les canaux (stable/nightly)
Installation :
# Windows (PowerShell)
winget install julia -s msstore
# macOS
brew install juliaup
# Linux
curl -fsSL https://install.julialang.org | sh
Usage basique :
juliaup status # voir versions installées
juliaup add 1.9.3 # installer version spécifique
juliaup default 1.9.3 # définir version par défaut
Démarrez Julia via
julia
L’invite de Julia apparaît.
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.11.1 (2024-10-16)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia>
Nous allons installer un notebook réactif Pluto.jl pour nous initier au langage.
A l’invite julia>
tapez ]
L’invite devient alors (@v1.11) pkg>
C’est le “package manager REPL” ou “Pkg REPL mode”. On y accède en tapant ]
dans le REPL Julia.
Cela permet d’installer de nouveaux packages. Installons Pluto.jl en tapant à la suite du prompt add Pluto
puis Entrée.
(@v1.11) pkg> add Pluto
Pluto s’installe…
Sortons du mode package manager via un appui sur la touche retour arrière (⌫) et lançons Pluto.
julia> using Pluto; Pluto.run()
[ Info: Loading...
┌ Info:
└ Opening http://localhost:1234/?secret=FqOwfXYZ in your default browser... ~ have fun!
┌ Info:
│ Press Ctrl+C in this terminal to stop Pluto
Le navigateur web doit permettre d’accéder à l’interface de Pluto. Si besoin utilisez sa documentation.
Nous allons définir 4 cellules dans Pluto avec
function rot13(c::Char)
shft = islowercase(c) ? 'a' : 'A'
isletter(c) ? c = shft + (c - shft + 13) % 26 : c
end
Analysons chaque élément en détail :
-
function rot13(c::Char)
:- Fonction prenant un seul caractère (
Char
) en entrée - Le
::Char
force le type du paramètre
- Fonction prenant un seul caractère (
-
shft = islowercase(c) ? 'a' : 'A'
:islowercase(c)
teste si le caractère est minuscule- Opérateur ternaire
? :
: si vrai → ‘a’, si faux → ‘A’ shft
servira de point de référence dans l’alphabet
-
isletter(c) ? c = shft + (c - shft + 13) % 26 : c
:- Test si c’est une lettre avec
isletter(c)
- Si c’est une lettre :
c - shft
: convertit en position 0-25 dans l’alphabet+ 13
: décale de 13 positions (ROT13)% 26
: assure que ça reste dans l’alphabet (0-25)shft +
: reconvertit en caractère ASCII
- Si ce n’est pas une lettre : renvoie le caractère tel quel
- Test si c’est une lettre avec
En résumé : cette fonction applique ROT13 à un seul caractère en préservant sa casse et en laissant les non-lettres inchangées.
encoded = """GBQB yvfgr :
- Cnva (2 onthrggrf)
- Ynvg (1 yvger)
- Pbevnaqer (fhegbhg cnf, p'rfg cnf oba)
- 4 onanarf, 4 cbzzrf, 4 benatrf
- Cbhyrg (4 svyrgf qr cbhyrg)
- 1 synt : SPFP{rq24p7sq86p2s0515366}
- Câgrf (1xt)
- Evm (fnp qr 18xt)
- Abheve zba qvabfnher"""
Cette cellule définit le message chiffré.
rot13(str::AbstractString) = map(rot13, str)
Cette cellule définit une méthode alternative de rot13
qui fonctionne sur des chaînes de caractère :
-
rot13(str::AbstractString)
:- Une nouvelle version de rot13 qui accepte n’importe quel type de chaîne
AbstractString
est la super-classe de tous les types de chaînes en Julia
-
= map(rot13, str)
:map
applique la fonctionrot13
(celle pour les Char définie précédemment)- À chaque caractère de la chaîne
str
C’est un exemple de “multiple dispatch” en Julia :
- Une version pour les caractères (Char)
- Une version pour les chaînes (String)
- Utilise la première pour construire la seconde
En une ligne, on étend la fonctionnalité des caractères aux chaînes entières !
rot13(encoded)
Cette cellule va appliquer la fonction rot13
au message chiffré afin de le déchiffrer.
Remarque : L’ordre des cellules dans le notebook n’a aucune importance. L’ordre d’exécution des cellules est géré via un graphe orienté acyclique (DAG = Directed Acyclic Graph).
D’autres implémentations du ROT13 dans différents langages sont disponibles sur https://rosettacode.org/wiki/Rot-13