Implementa il codice di Cesare in C
- Implementa Caesar Cipher per elaborare la stringa costante in C
- Implementa Caesar Cipher per elaborare la stringa fornita dall’utente in C
Questo articolo mostrerà più metodi su come implementare la cifratura di Cesare in C.
Implementa Caesar Cipher per elaborare la stringa costante in C
Il cifrario di Cesare è uno dei più semplici schemi di crittografia che non deve essere utilizzato per una ragionevole segretezza, ma piuttosto solo per curiosità intellettuale. Cesare è essenzialmente una tecnica di rotazione alfabetica con un dato numero di posizioni. Dato il testo e la posizione 5, la versione crittografata conterrà i caratteri spostati a destra di 5 posizioni. Si noti che la direzione di rotazione non è strettamente specificata poiché ogni caso ha la sua rotazione opposta che dà lo stesso risultato.
Nell’esempio seguente, dimostriamo come crittografare la stringa
letterale hardcoded. La posizione di rotazione è presa dall’input dell’utente e controlla se il numero è in un intervallo di [1,26], poiché questo esempio è specializzato solo per l’alfabeto inglese. Successivamente, eseguiamo il cicli while
in cui un carattere viene controllato per i valori non alfabetici e solo allora viene spostato con le posizioni date. Questo codice può elaborare solo caratteri minuscoli poiché abbiamo utilizzato il valore 97
che rappresenta la a
nella codifica ASCII. Inoltre, inviamo direttamente alla console i valori codificati carattere per carattere.
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *str = "arbitrary string to encode";
int main(void) {
int shift;
char num[16];
printf("Choose shift number [1-26]: ");
fflush(stdout);
if (fgets(num, 16, stdin) == NULL) exit(EXIT_FAILURE);
shift = (int)strtol(num, NULL, 0);
if (shift < 1 || shift > 26) {
fprintf(stderr, "Shift number is out of range");
exit(EXIT_FAILURE);
}
while (*str) {
if (!isspace(*str) || !isblank(*str))
printf("%c", (((*str - 97) + shift) % 26) + 97);
else
printf("%c", *str);
str += 1;
}
exit(EXIT_SUCCESS);
}
Implementa Caesar Cipher per elaborare la stringa fornita dall’utente in C
In alternativa, possiamo reimplementare l’esempio di codice precedente per prendere sia il testo che la posizione di rotazione dall’input dell’utente, verificarli e crittografare la stringa data. In contrasto con l’esempio precedente, questa versione include due chiamate fgets
e malloc
per allocare memoria dinamica per il testo in chiaro. Questa implementazione si occupa anche di stringhe minuscole e non sarebbe in grado di crittografare correttamente una stringa mista.
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { MAX_LEN = 1024 };
int main(void) {
size_t len;
int shift;
char *text;
char num[16];
text = malloc(MAX_LEN);
if (text == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Input text to be encrypted (lowercase): ");
fflush(stdout);
if (fgets(text, MAX_LEN, stdin) == NULL) exit(EXIT_FAILURE);
len = strlen(text);
if (text[len - 1] == '\n') text[len - 1] = '\0';
len -= 1;
printf("Choose shift number [1-26]: ");
fflush(stdout);
if (fgets(num, 16, stdin) == NULL) exit(EXIT_FAILURE);
shift = (int)strtol(num, NULL, 0);
if (shift < 1 || shift > 26) {
fprintf(stderr, "Shift number is out of range");
exit(EXIT_FAILURE);
}
for (int i = 0; i < len; ++i) {
if (!isspace(text[i]) || !isblank(text[i]))
printf("%c", (((text[i] - 97) + shift) % 26) + 97);
else
printf("%c", text[i]);
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook