Cifrario di Cesare in C

Il cifrario di Cesare, detto anche cifrario a scorrimento o a sostituzione, è uno dei più semplici e più antichi algoritmi di crittografia della storia. Il nome, come facile da intuire, deriva da Giulio Cesare che utilizzava questo algoritmo per cifrare messaggi importanti.

Il funzionamento è molto semplice: si sostituisce ogni lettera del testo da cifrare con una nuova lettera che si trova a un certo numero di posizioni dalla lettera originaria. La dimensione di questo spostamento viene detta chiave, ad esempio Cesare utilizzava una chiave di 3, il che significa che A diventa D, B diventa E e così via. Una volta raggiunta la fine dell’alfabeto si ricomincia dall’inizio, cioè X diventa A, Y diventa B e Z diventa C.

Nota: è facile da osservare che l’algoritmo può utilizzare al massimo 26 chiavi per cifrare il testo, il che significa che con semplici metodi di brute force si può accedere al testo originale.

Esempio

Consideriamo la stringa “helloworld” e una chiave da 4, se applichiamo il cifrario di cesare la stringa diventa “lippsasvph”. Questo perché:

h si trova in posizione 7 -> 7+4 = 11 = l
e si trova in posizione 4 -> 4+4 = 8 = i
l si trova in posizione 11 -> 11+4 = 15 = p
o si trova in posizione 14 -> 14+4 = 18 = s
w si trova in posizione 22 -> 22+4 = 26 -> 0 = a
r si trova in posizione 17 -> 17+4 = 21 = v
d si trova in posizione 3 -> 3+4 = 7 = h

Implementazione del cifrario di Cesare in C

Per implementare l’algoritmo abbiamo innanzitutto bisogno di: definire una costante “N” per indicare il numero massimo di caratteri accettabili, dichiarare due variabili intere, una per salvare la dimensione della chiave e l’altra utilizzata come metodo di controllo e due vettori di dimensione N, uno contenente il messaggio da cifrare e l’altro il messaggio cifrato.

Dopodiché chiediamo all’utente di inserire il testo da cifrare e usiamo il ciclo while per controllare che i singoli caratteri inseriti siano effettivamente delle lettere, altrimenti chiediamo all’utente di inserire un nuovo messaggio. La variabile check viene dichiarata a zero prima del ciclo while e viene assegnata ad uno soltanto se il testo inserito va bene, terminando di conseguenza il while.

Dopo aver ricevuto in input la dimensione della chiave, possiamo criptare il messaggio usando un ciclo for per scorrere il testo in chiaro e sostituire ogni lettera con una nuova lettera distante quanto assegnato alla variabile chiave. Per fare ciò utilizziamo la seguente parte di codice:


  
msg_criptato[i] = ((msg[i] - 'a' + chiave) % 26) + 'a';

A questo punto non rimane che stampare a schermo il messaggio criptato.

  
#include <stdio.h>
#include <string.h>
#define N 100

int main(){
	int chiave, check;
    char msg[N], msg_criptato[N];

    printf("Inserisci il messaggio da cifrare: ");
    scanf("%s", msg);

    check = 0;
	while(check == 0){
        for(int i=0; i < strlen(msg); i++){
            if((msg[i]>='a' && msg[i]<='z') || (msg[i]>='A' && msg[i]<='Z'))
            check = 1;
            else{
                check = 0;
                printf("Errore! Puoi inserire solo lettere!\n");
                printf("Riprova: ");
                scanf("%s", msg);
            }
        }
    }
    
    printf("Chiave da utilizzare: ");
    scanf("%d", &chiave);
    
    
    for(int i=0; i<strlen(msg); i++){
        if(msg[i] >= 'a' && msg[i] <= 'z'){
            msg_criptato[i] = ((msg[i] - 'a' + chiave) % 26) + 'a';
        } else if(msg[i] >= 'A' && msg[i] <= 'Z'){
            msg_criptato[i] = ((msg[i] - 'A' + chiave) % 26) + 'A';
        } else {
            printf("Errore!\n");
        }
    }
    
    printf("Messaggio in chiaro: %s\n", msg);
    printf("Messaggio criptato: %s\n", msg_criptato);

	return 0;
}

Indice pagine linguaggio C: