S.P.Q.R.: Script Per Quisquilie Riservate

Ovvero: Il Cifrario di Cesare

Per la serie: “Reazioni a scoppio ritardato“, ecco uno scriptino fesso fesso che mi è venuto in mente dopo aver letto questo post di Bit3Lux (al secolo Luigi Iannoccaro, accerchiatelo / followatelo / socialnetworkizzatelo come preferite) di qualche mese fa. Il buon Bit3Lux, a sua volta, aveva avuto la stessa ideuzza “tanto per…” del titolone qui sopra, che ha condiviso nello spirito “Open Source – Free Software – Volemose bbene che er codice è bbello quanno è libbero!“.

Cesare_quoque_bash

Cesare avrebbe usato Linux, se solo fosse riuscito ad installare il language pack in latino!

Sappiate dunque che qui si fa la storia (letteralmente) della crittografia! Cito da Wikipedia:

Il cifrario di Cesare è uno dei più antichi algoritmi crittografici di cui si abbia traccia storica. È un cifrario a sostituzione monoalfabetica in cui ogni lettera del testo in chiaro è sostituita nel testo cifrato dalla lettera che si trova un certo numero di posizioni dopo nell’alfabeto. Questi tipi di cifrari sono detti anche cifrari a sostituzione o cifrari a scorrimento a causa del loro modo di operare: la sostituzione avviene lettera per lettera, scorrendo il testo dall’inizio alla fine.

Cesare ovviamente non aveva computer a disposizione (o forse sì? “Noi di Voyager pensiamo di sì!“) ed era ragionevolmente certo della tontoloneria dei suoi nemici, tanto che usava (così pare…) sempre la stessa chiave di cifratura, ovvero sempre lo stesso “scorrimento” di 3 posti. Ora, se qualcuno ha mai avuto difficoltà a scuola con il latino, immagino come debba sentirsi al pensiero del latino cifrato! Ma non divaghiamo… Probabilmente per lui l’espressione “Attacco Brute Force” aveva tutt’altro significato, dunque si preoccupava più di guardarsi le spalle che di rendere la vita difficile agli hacker gallici.

Bit3Lux, che vuol essere “historically correct“, ha quindi giustamente usato questo valore “hard coded” nello script. Io che in Storia, modestamente, sono sempre stato negato (in compenso andavo molto bene in latino!), non potevo che fregarmene del sor Giulio – ma non di Bit3Lux! Ed ecco che ho pensato di rendere più flessibile lo script, nonché approcciare la sostituzione delle lettere in modo diverso. Insomma, anziché fare il sapientino “Ah, Bit3Lux potevi fare così“, “Ah, Bit3Lux potevi fare cosà“, mi sono rimboccato le… tastiere ed ho creato lo script a modo mio. Spero che Bit3Lux apprezzi (lo script e le mancate lagne). Bando alle ciance, codice:

#!/bin/bash
alfa="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
shift=${1:-3}
len=${#alfa}
chiave=${alfa:$shift:$len}${alfa:0:$shift}
read -N 1 -p "[C]ifrare o [D]ecifrare? " azione
echo
[[ ${azione^} == "C" ]] && pref="" || pref="de"
read -p "Testo da ${pref}cifrare: " testo
echo "Il testo \"$testo\" sarà ${pref}cifrato secondo il seguente schema:
$alfa -> $chiave"
[[ ${azione^} == "C" ]] && echo "$testo" | sed -e 's/.*/\U/' -e "y/$alfa/$chiave/" || echo "$testo" | sed -e 's/.*/\U/' -e "y/$chiave/$alfa/"
exit 0

Disclaimer sapientini: ovviamente lo script non è completo e rifinito, nel senso che non ho inserito codice per gestire errori e input fuori standard. Inoltre non mi sono preoccupato di abbellire l’output. A dirla tutta, anzi, quello che vedete è già un miglioramento (per decenza) della prima stesura che, fondamentalmente, si occupava solo di sputare fuori il risultato della (de)codifica. E poi bla bla bla e ancora bla bla bla invece che bla bla bla esattamente. Potrebbe non funzionare correttamente in alcuni casi? Probabilmente sì, non saprei dire quali. E sì, non mi andava neppure di usare gli if..then..else..fi per rendere il tutto più leggibile.

Vediamo gli elementi salienti:

  1. alfa: il set di lettere originale – niente da vedere, mi serve così tuttattaccato perché dopo vi spiego;
  2. shift: il valore dello scorrimento, default al 3 cesariano se si esegue lo script senza passare argomenti;
  3. len: lunghezza del set in uso, poteva essere anche dichiarato come valore costante (= 26) ma ho preferito lasciarlo così nel caso in cui si voglia estendere/ridurre il set di lettere da cifrare (flessibilità!!!) ad esempio includendo la minuscole;
  4. chiave: il set di lettere risultante dallo scorrimento;
  5. virgolette come se non ci fosse un domani.

Qui sotto l’esempio dei due set di caratteri nel caso in cui lo scorrimento sia 7: in pratica si prendono i primi 7 caratteri del set originario e si spostano in fondo per creare la chiave di (de)crittazione.

SET ORIGINARIO             → SET SHIFTATO PER CIFRATURA
ABCDEFGHIJKLMNOPQRSTUVWXYZ → HIJKLMNOPQRSTUVWXYZABCDEFG
^^^^^^^↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓^^^^^^^
1234567↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓1234567
       8- - - - - - - ->26 → 8- - - - - - - ->26

Il resto è storia 😉 ovvero si sceglie (variabile “azione“) se Cifrare o Decifrare, subito dopo si immette il segretissimo messaggio (variabile “testo“) per le province oltre il Rubicone e BUM! Fatto. Lo script si avvale di una delle mille funzioni di sed, ovvero la sostituzione di singoli caratteri (flag “y“) analogamente a quanto fa tr, che è stata invece la scelta di Bit3Lux. Per questa funzione, sed ha appunto bisogno delle sequenze tuttattaccate di caratteri corrispondenti nella sostituzione (A → H, B → I, C → J, etc.). Per esteso l’operazione richiesta a sed si leggerebbe “y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/HIJKLMNOPQRSTUVWXYZABCDEFG".

Notare anche che, per semplicità, il testo si converte tutto in maiuscolo. Prego la Regia di mostrare in sovrimpressione l’immancabile screenshot.

cifrario_cesare

“Ahò, ‘sto programma me piace ‘na cifra!”

Nella sua semplicità ed incompletezza, lo script evita alcuni problemi classici della manipolazione del testo, ovvero i famigerati caratteri “speciali” (spazi, segni di interpunzione, etc.) perché, banalmente, li ignora. Per essere più precisi, ciò che non è incluso nei set di caratteri originale e shiftato non viene convertito: largo dunque a spazi, punti, virgole, punti esclamativi e due punti in stile fratelli Caponi (“che siamo noi” <- cliccate qui e non ve ne pentirete!).

cifrario_cesare_2

“Sì, grazie, ghggb bx!”

Ora ovviamente mi sono esposto anch’io alle bordate dei sapientini che penseranno: “Ah ma potevi usare questo!“, “Ah ma potevi prevedere l’input da quello!“, “Ah ma…” — Oooh! Ma non c’avete un cacchio da fare? Aria! Raus! Pussate via! Fatevi il vostro script e smettetela di lamentarvi!

Devo dirvi altro? Mi pare di no, dunque VDOXWL GD PDQ IURP PDUV!

Informazioni su Man from Mars

https://extendedreality.wordpress.com/

  1. Scugnizzo

    Attenzione. Nel post di Bit3Lux si afferma, erroneamente, che con K=3 la C andrebbe sostituita con la G invece che con la F 😉

    Mi piace

  2. Ralph Magpie

    Python no eh?!

    Mi piace

Dimmi che ne pensi o fai "Ciao ciao!" con la manina // Share your thoughts or just say "Hello!"

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: