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.

Banner Pubblicitario

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:

Banner pubblicitario
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

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C