Articolo originale: How to code the Caesar Cipher: an introduction to basic encryption di freeCodeCamp.org

Tradotto e adattato da: Dario Di Cillo

Il cifrario di Cesare è una famosa attuazione della crittografia risalente ai suoi primordi. Prende una frase e la riorganizza, basandosi su una chiave che viene adoperata sull'alfabeto. Ad esempio, considera la chiave 3 e la frase

Mi piace indossare i cappelli.

Quando la frase viene codificata usando la chiave 3, diventa:

Pl sldfh lqgrvvduh l fdsshool.

In questo modo, è difficile leggere il messaggio, che può passare inosservato.

Mentre questo è un esempio di codifica m0lto semplice, è un progetto perfetto su cui far pratica per chi sta imparando a programmare.

Comprendere il cifrario

Per implementare questo codice, almeno in Java, avrai bisogno di riflettere a fondo su ciò che è stato fatto. Quindi, vediamo quali sono i passaggi fondamentali da considerare per questo codice.

Step 1: identifica il carattere nella frase.

Step 2: trova la posizione del carattere nell'alfabeto.

Step 3: identifica la somma di posizione del carattere + posizione della chiave nell'alfabeto.

Note* se la posizione del carattere + chiave > 26, torna indietro e ricomincia a contare da 1.

Step 4: costruisci una nuova frase usando i nuovi caratteri al posto di quelli originali.

Step 5: ripeti fino a raggiungere la lunghezza della frase (loop for).

Step 6: restituisci il risultato.

ADVERTISEMENT

Codificare il cifrario

Questi sono dei buoni step da seguire, ma dovremmo pensare a cosa ci serve fare in termini di codice.

Step 0: crea una funzione che accetta un messaggio e una chiave.

Qualcosa del genere:

public String Encrypt(String message, int key) {

}

Step 1: identifica il carattere nella frase.

Per farlo, avremo bisogno di stabilire un alfabeto a cui fare riferimento.

Crea una variabile alphabet che contiene le 26 lettere dell'alfabeto.

String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String alphabet2 = alphabet.toLowerCase();

Step 2: trova la posizione del carattere nell'alfabeto.

Poi crea un loop for che itera su ogni carattere del messaggio. Sarà più semplice svolgere quest'operazione se creiamo uno StringBuilder.

StringBuilder encrypted = new StringBuilder(message);
for (int q = 0; q < encrypted.length(); q++) {
    char currchar = encrypted.charAt(q);
    int index = alphabet.indexOf(currchar);
}

A questo punto, dovremmo assicurarci che la posizione corrisponda a una lettera.

if (index != -1) {}

Step 3:  identifica la somma di posizione del carattere + posizione della chiave nell'alfabeto.

Se è una lettera, allora dobbiamo trovare la posizione nell'alfabeto modificato, Non abbiamo ancora creato una variabile per l'alfabeto modificato, quindi dovremmo farlo adesso.

Step 4: costruisci una nuova frase usando i nuovi caratteri al posto di quelli originali.

Una volta trovato il valore nell'alfabeto modificato, dovremmo impostarlo sulla stessa posizione nello StringBuilder che abbiamo creato.

public String Encryption(String input, int key) {
        StringBuilder encrypted = new StringBuilder(input);
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String alphabet2 = alphabet.toLowerCase();
        String keyedalphabet = alphabet.substring(key) + alphabet.substring(0, key);
        for (int q = 0; q < encrypted.length(); q++) {
            char currChar = encrypted.charAt(q);
            int index = alphabet.indexOf(currChar);
            if (index != -1) {
                char newChar = keyedalphabet.charAt(index);
                encrypted.setCharAt(q, newChar);
            }

Step 5: ripeti fino a raggiungere la lunghezza della frase (loop for).

Ora, abbiamo controllato se il carattere è maiuscolo, ma dobbiamo controllare anche se è minuscolo. Per farlo, dobbiamo accedere a alphabet2 che abbiamo creato precedentemente.

index = alphabet2.indexOf(currChar);
if (index != -1) {
    String keyedalphabet2 = keyedalphabet.toLowerCase();
    char newChar = keyedalphabet2.charAt(index);
    encrypted.setCharAt(q, newChar);
}

Step 6: restituisci il risultato.

Una volta completato il loop for, tutto ciò che ci resta da fare è restituire la stringa.

public String Encryption(String input, int key) {
    StringBuilder encrypted = new StringBuilder(input);
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String alphabet2 = alphabet.toLowerCase();
    String keyedalphabet = alphabet.substring(key) + alphabet.Asubstring(0, key);
    for (int q = 0; q < encrypted.length(); q++) {
        char currChar = encrypted.charAt(q);
        int index = alphabet.indexOf(currChar);
        if (index != -1) {
            char newChar = keyedalphabet.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
        index = alphabet2.indexOf(currChar);
        if (index != -1) {
            String keyedalphabet2 = keyedalphabet.toLowerCase();
            char newChar = keyedalphabet2.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
    }
    return encrypted
}

Step 7: Debug.

Un momento! Così non funzionerà! encrypted non è una stringa, ma uno StringBuilder e questa funzione richiede specificatamente che venga restituita una stringa.

Fortunatamente, esiste una funzione molto semplice per rimediare a  questa svista.

public String Encryption(String input, int key) {
    StringBuilder encrypted = new StringBuilder(input);
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String alphabet2 = alphabet.toLowerCase();
    String keyedalphabet = alphabet.substring(key) + alphabet.substring(0, key);
    for (int q = 0; q < encrypted.length(); q++) {
        char currChar = encrypted.charAt(q);
        int index = alphabet.indexOf(currChar);
        if (index != -1) {
            char newChar = keyedalphabet.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
        index = alphabet2.indexOf(currChar);
        if (index != -1) {
            String keyedalphabet2 = keyedalphabet.toLowerCase();
            char newChar = keyedalphabet2.charAt(index);
            encrypted.setCharAt(q, newChar);
        }
    }
    return encrypted.toString();
}

Ecco come puoi ottenere la versione codificata della tua frase originale. Prova tu stesso!

Grazie per aver letto quest'articolo.