Stringhe e caratteri ASCII
Data una stringa Python, esempio x=”Ciao”, potete accedere alla sua rappresentazione interna in codice ASCII, tramite le due funzioni: chr() e ord(), la prima trasforma il carattere nell’intero corrispondente e la seconda fa il viceversa (da intero a carattere).
>>> x = "Ciao" >>> chr(X[0]) 67 >>> chr(ord(x[0])) 'C'
Modificate l’esempio visto nella Lezione V, dove si leggono le righe di un file che contiene numeri e si fanno statistiche. Invece, il file deve contenere un messaggio di testo, segreto, da spedire. Una volta letta una linea, si provvede a trasformare i caratteri in numeri. Poi si applica il Cifrario sotto indicato.
Cifrario di Cesare
Il cifrario consiste in uno scostamento dell’alfabeto con cui si scrivono i caratteri di un fattore fissato $$k$$ che farà da chiave. Ad esempio, se $$k = 3$$, si avrà uno scostamento in avanti di $$3$$, quindi $$a \rightarrow d, b \rightarrow e$$ etc.
Scrivere una funzione Python che dato come argomento una stringa, che contiene una riga del messaggio da cifrare, e la chiave $$k$$, crea e restituisce un altra stringa che contiene il messaggio cifrato.
Usare la funzione sopra per scrivere un programma che legge da input il valore di k, e il messaggio da cifrare, e stampa il messaggio cifrato. Attenzione, il programma deve funzionare sia leggendo da console, sia leggendo tramite redirezione come nell’esempio delle statistiche sui numeri.
Dettagli Importanti:
- Dobbiamo stabilire una serie di ‘regole’ da rispettare riguardo all’alfabeto che stiamo usando o l’attività di crittazione/decrittazione/crittoanalisi diventa complicata:
- I messaggi devono essere scritti da tutti usando lo stesso set di caratteri:
Non tutti i caratteri vanno convertiti – i caratteri validi del messaggio sono quelli dell’alfabeto inglese: ABCDEFGHIJKLMNOPQRSTUVWXYZ. Non usate caratteri accentati. (Quindi ricordatevi che lavorando in modulo, il successore di Z è A). Tutti gli altri caratteri della vostra stringa, se presenti, vanno mantenuti (segni di interpunzione, numeri, apostrofi, virgole, punti, spazi tra le parole etc). Rispettate tutti questa specifica. Attenzione i caratteri da a…z devono essere convertiti in maiuscolo. - La funzione Python:
str.upper(stringa)
converte string in maiscolo. la funzione
str.isalpha(x)
vale True se il carattere x è nell’intervallo A…Z (per un carattere già convertito in maiuscolo), altrimenti vale false, la stessa funzione in C si trova in
ctypes.h
ma lavora sui singoli caratteri. Per convertire in maiuscolo in C usate toupper() sui singoli caratteri.
- La scelta sopra naturalmente porta a semplificare ulteriormente la fase di attacco. Ma se siete furbi non troppo. 😉 Per rimediare facciamo cosi:
- Attenzione, la comunicazione tra gruppi è bidirezionale, questo implica che potete scegliere se:
- Usare una sola chiave.
- Usare una chiave per i messaggi da A -> B, e una diversa per le risposte B -> A, i gruppi attaccanti non possono sapere (non devono chiedere) se state usando una o due chiavi, devono scoprirlo, quindi se avete scambiato una sola chiave, e ne volete usare un altra potete farlo, ma solo se vi scambiate in segreto la nuova chiave DI PERSONA.
Altri dettagli potrebbero seguire se ritenuto necessario dal docente. Buon Lavoro.