In questa lezione implementeremo un algoritmo per il cifrario di Cesare in C.
Il cifrario di Giulio Cesare è un facile esempio di crittografia a sostituzione, cioè dove ciascun elemento del testo è trasformato in un altro elemento.
All’epoca di Giulio Cesare era un algoritmo efficace e veniva usato per inviare le sue corrispondenze.
Quindi si sceglieva una chiave numerica ed in base a questa chiave ogni lettera veniva sostituita dalla lettera indicata dalla chiave.
Facciamo quindi un esempio:
Alfabeto non cifrato: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z.
Assegniamo alla chiave numerica il valore 5.
L’alfabeto cifrato diventa così: F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, A, B, C, D, E.
Il cifrario si realizza dunque in modo circolare, quando si arriva alla Z si riparte dalla A.
L’algoritmo quindi risulta molto semplice e proprio per questo è una tecnica che può essere facilmente violata. Infatti si può andare facilmente a tentativi, in quanto le possibili chiavi sono 26.
Si è cercato di superare questi limiti assegnando a ciascuna lettera del testo in chiaro una lettera scelta a caso. Così abbiamo ben 26! possibili chiavi. Ma rimaneva sempre un punto debole in quanto ogni lettera veniva sostituita sempre dalla stessa lettera.
Algoritmo per il cifrario di Cesare in C
Ecco dunque l’algoritmo sul cifrario di Cesare in linguaggio C che prende in input un testo scritto in maiuscolo e senza spazi e restituisce il messaggio cifrato.
Quindi leggiamo la lunghezza del testo inserito:
while(testo[n]!= '\0') //finchè non arriviamo alla fine del testo
n++;
Dunque, con un ciclo for, convertiamo ciascun carattere aggiungendo la chiave inserita a ciascuna lettera facendo attenzione che, quando si arriva alla posizione Z – la chiave, dobbiamo iniziare nuovamente dalla lettera A e dobbiamo aggiungere la posizione della chiave meno le posizioni che rimanevano per arrivare alla lettera Z.
testoc[i]=’A’+c-(‘Z’-testo[i])-1;
Dopo, allo stesso modo, decifriamo il testo per ottenere ciò che avevamo inserito in input.
#include<stdio.h>
#define MAX 100
int main(){
int i,n,c;
char testo[MAX],testoc[MAX],testod[MAX];
printf("Inserisci la frase in maiuscolo e senza spazi: ");
gets(testo);
if(testo[i]>='A' && testo[i]<='Z') {
do{
printf("Chiave: ");
scanf("%d",&c);
}while(c<0 || c>26);
while(testo[n]!= '\0')
n++;
for(i=0;i<n;i++)
if(testo[i]<'Z'-c)
testoc[i]=testo[i]+c;
else
testoc[i]='A'+c-('Z'-testo[i])-1;
testoc[n] = '\0';
printf("Testo criptato : %s\n",testoc);
for(i=0;i<n;i++)
if(testoc[i]<'A'+c)
testod[i] = 'Z'-(c-(testoc[i]-'A')-1);
else
testod[i] = testoc[i] - c;
testod[n] = '\0';
printf("Testo decriptato: %s\n",testod);
}
else
printf("Errore il testo deve essere maiuscolo e senza spazi vuoti\n");
}
Nella prossima lezione svilupperemo l’algoritmo sul cifrario di Cesare, leggendo il testo da un file.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna
Ricerca elementi in una matrice