Implementa il codice di Cesare in C

Jinku Hu 12 ottobre 2023
  1. Implementa Caesar Cipher per elaborare la stringa costante in C
  2. Implementa Caesar Cipher per elaborare la stringa fornita dall’utente in C
Implementa il codice di Cesare 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);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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