Solution de s-celles pour ROT13

intro crypto

5 décembre 2024

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 :

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 :

  1. function rot13(c::Char) :

    • Fonction prenant un seul caractère (Char) en entrée
    • Le ::Char force le type du paramètre
  2. 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
  3. 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

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 :

  1. 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
  2. = map(rot13, str) :

    • map applique la fonction rot13 (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 :

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).

image

D’autres implémentations du ROT13 dans différents langages sont disponibles sur https://rosettacode.org/wiki/Rot-13