Algoritmi per la cifratura/decifratura di un messaggio. Sviluppare una coppia di
algoritmi, implementati come function, per crittografare e decrittografare un
messaggio. L’algoritmo si basa sulla cosiddetta cifratura polialfabetica, che consiste
nel trasformare il messaggio in un testo di lunghezza uguale a quella del messaggio,
detto il “testo cifrato”, utilizzando un altro testo (prefissato), detto “il testo delle
lettere chiave”. Ogni lettera del messaggio viene trasformate in una lettera del testo
cifrato nel seguente modo: la lettera del messaggio viene sostituita dalla lettera
dell’alfabeto successiva, se la corrispondente lettera chiave (nel testo delle lettere
chiave) è B, da quella due volte successiva se la lettera chiave è C, da quella 3 volte
successiva se la lettera chiave è D e così via; se la lettera chiave è A, la lettera del
messaggio non viene modificata. L’alfabeto deve essere considerato come circolare,
nel senso che la lettera successiva alla lettera Z è la lettera A. Per esempio, se il
messaggio è THEPRESIDENT allora se il testo delle parole chiave è
CODECODECODE allora il messaggio cifrato è VVHTTSVMFSQX; si osservi che
in generale il testo delle lettere chiave si ottiene a partire da una parola chiave
ripetuta più volte (CODE nel caso in esame). La corrispondenza: lettera del
messaggio - lettera del testo cifrato - lettera chiave è evidente scrivendo i tre testi nel
seguente modo (alfabeto:ABCDEFGHIJKLMNOPQRSTYVWXYZ)
chiave C |O|D|E|C|O|D|E |C |O |D| E|
messaggio T |H|E|P|R|E|S| I | D |E |N| T|
testo cifrato V |V|H|T|T|S|V|M| F |S |Q| X|
Il main legge da tastiera il messaggio da crittografare (l’equivalente di
THEPRESIDENT nell’esempio), legge da tastiera la parola chiave (l’equivalente
di CODE nell’esempio; osservate che non è necessario leggere tutto il testo delle
parole chiavi, perché questo può essere ottenuto a partire dalla parola chiave),
chiama la function di cifratura (passando come parametro il messaggio e la
parola chiave), che restituisce il teso cifrato, visualizza il testo cifrato, chiama la
function di decifratura, passando come parametro il testo cifrato e la parola
chiave, visualizza il messaggio decifrato, che deve coincidere con il messaggio di
partenza. Usare solo lettere maiuscole e non usare la spaziatura. Usare le stringhe
per rappresentare tutti i tipi di testo e le function in string (serve solo la
strlen). E’ utile sapere che in C, è possibile sommare “sommare i caratteri”
sfruttando il fatto che il codice ASCII rappresenta i caratteri come interi e che a
lettere consecutive corrispondono interi consecutivi (consiglio: determinate qual è
la rappresentazione ASCII di A e poi “sottraetela” dalla rappresentazione di ogni
lettera per sapere qual è la “posizione” di ogni lettera nell’alfabeto.). Fare una
versione alternativa del main, in cui la parola chiave è una 5-stringa generata a
caso, usando la function rand(), il cui prototipo è in <stdlib.h>, per
generare gli interi casuali. Si ricorda che, se numero_casuale è dichiarata di
tipo int, allora la chiamata numero_casuale=rand()%(n+1); genera un
numero casuale intero (distribuzione uniforme) nell’insieme (0,1,2,..n). Usare
sempre la srand() per rendere automatica la scelta iniziale del seed della
sequenza di numeri casuali. Nella Relazione si deve riportare l’analisi della
complessità di tempo dell’algoritmo (operazione dominante: confronto)