Articolo originale: How to code the Caesar Cipher: an introduction to basic encryption
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.
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.