Caesars Chiffre in C implementieren

Jinku Hu 12 Oktober 2023
  1. Implementieren der Cäsar-Chiffre zur Verarbeitung einer konstanten Zeichenkette in C
  2. Implementieren der Caesar-Chiffre zur Verarbeitung der vom Benutzer bereitgestellten Zeichenkette in C
Caesars Chiffre in C implementieren

Dieser Artikel demonstriert mehrere Methoden, wie die Cäsar-Chiffre in C implementiert werden kann.

Implementieren der Cäsar-Chiffre zur Verarbeitung einer konstanten Zeichenkette in C

Die Caesar-Chiffre ist eines der einfachsten Verschlüsselungsschemata, das nicht für eine vernünftige Geheimhaltung, sondern nur aus intellektueller Neugierde verwendet werden muss. Caesar ist im Wesentlichen ein Alphabet-Rotationsverfahren mit der gegebenen Anzahl von Positionen. Gegeben der Text und Position 5, wird die verschlüsselte Version die Zeichen enthalten, die um 5 Stellen nach rechts verschoben sind. Beachten Sie, dass die Drehrichtung nicht streng festgelegt ist, da es in jedem Fall eine entgegengesetzte Drehung gibt, die das gleiche Ergebnis liefert.

Im folgenden Beispiel wird gezeigt, wie das hartkodierte Literal string verschlüsselt wird. Die Rotationsposition wird der Benutzereingabe entnommen und überprüft, ob die Zahl in einem Intervall von [1,26] liegt, da dieses Beispiel nur auf das englische Alphabet spezialisiert ist. Als nächstes führen wir die while-Schleife aus, in der ein Zeichen auf nicht-alphabetische Werte geprüft wird und erst dann mit den angegebenen Stellen verschoben wird. Dieser Code kann nur Kleinbuchstaben verarbeiten, da wir den Wert 97 verwendet haben, der das a in der ASCII-Kodierung darstellt. Außerdem geben wir die kodierten Werte Zeichen für Zeichen direkt auf der Konsole aus.

#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);
}

Implementieren der Caesar-Chiffre zur Verarbeitung der vom Benutzer bereitgestellten Zeichenkette in C

Alternativ können wir das vorherige Codebeispiel neu implementieren, um sowohl den Text als auch die Drehposition aus der Benutzereingabe zu übernehmen, sie zu verifizieren und die angegebene Zeichenkette zu verschlüsseln. Im Gegensatz zum vorherigen Beispiel enthält diese Version zwei fgets-Aufrufe und malloc, um dynamischen Speicher für den Klartext zu allokieren. Diese Implementierung befasst sich auch mit klein geschriebenen Zeichenketten und wäre nicht in der Lage, eine gemischte Zeichenkette korrekt zu verschlüsseln.

#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);
}
Autor: 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