Mettre en œuvre le Cipher de César en C

Jinku Hu 12 octobre 2023
  1. Implémenter le Chiffre de César pour traiter la chaîne de caractères constante en C
  2. Implémenter le code César pour traiter les chaînes fournies par l’utilisateur en C
Mettre en œuvre le Cipher de César en C

Cet article présente plusieurs méthodes pour mettre en œuvre le chiffre de César en C.

Implémenter le Chiffre de César pour traiter la chaîne de caractères constante en C

Le code César est l’un des systèmes de cryptage les plus simples qui ne doit pas être utilisé pour un secret raisonnable mais plutôt par simple curiosité intellectuelle. Le César est essentiellement une technique de rotation de l’alphabet avec le nombre de positions donné. Compte tenu du texte et de la position 5, la version cryptée contiendra les caractères décalés de 5 places vers la droite. Notez que le sens de rotation n’est pas strictement spécifié car chaque cas a sa rotation opposée qui donne le même résultat.

Dans l’exemple suivant, nous montrons comment crypter la chaîne littérale codée en dur. La position de rotation est prise à partir de la saisie de l’utilisateur et on vérifie si le nombre est dans un intervalle de [1,26], car cet exemple est spécialisé pour l’alphabet anglais uniquement. Ensuite, nous exécutons la boucle while où un caractère est vérifié pour les valeurs non alphabétiques et seulement ensuite est décalé avec les endroits donnés. Ce code ne peut traiter que les caractères minuscules car nous avons utilisé la valeur 97 représentant le a dans l’encodage ASCII. De plus, nous fournissons directement les valeurs codées, caractère par caractère, à la console.

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

Implémenter le code César pour traiter les chaînes fournies par l’utilisateur en C

Nous pouvons aussi réimplémenter l’échantillon de code précédent pour prendre la position du texte et de la rotation à partir de la saisie de l’utilisateur, les vérifier et crypter la chaîne donnée. Contrairement à l’exemple précédent, cette version inclut deux appels fgets et malloc pour allouer de la mémoire dynamique pour le texte en clair. Cette implémentation traite également les chaînes en minuscules et ne serait pas capable de chiffrer correctement une chaîne mixte.

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