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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *