Implementar el cifrado de César en C

Jinku Hu 12 octubre 2023
  1. Implementar el cifrado Caesar para procesar cadenas constantes en C
  2. Implementar el cifrado Caesar para procesar la cadena proporcionada por el usuario en C
Implementar el cifrado de César en C

Este artículo demostrará varios métodos sobre cómo implementar el cifrado de César en C.

Implementar el cifrado Caesar para procesar cadenas constantes en C

El cifrado César es uno de los esquemas de cifrado más simples que no debe usarse para ningún secreto razonable, sino solo por curiosidad intelectual. César es esencialmente una técnica de rotación alfabética con el número dado de posiciones. Dado el texto y la posición 5, la versión cifrada contendrá los caracteres desplazados a la derecha en 5 lugares. Tenga en cuenta que la dirección de rotación no se especifica estrictamente ya que cada caso tiene su rotación opuesta que da el mismo resultado.

En el siguiente ejemplo, demostramos cómo cifrar el literal string codificado de forma rígida. La posición de rotación se toma de la entrada del usuario y se verifica si el número está en un intervalo de [1,26], ya que este ejemplo está especializado solo para el alfabeto inglés. A continuación, ejecutamos el bucle while en el que se comprueba un carácter en busca de valores no alfabéticos y solo entonces se desplaza con los lugares dados. Este código solo puede procesar caracteres en minúscula ya que empleamos el valor 97 que representa la a en la codificación ASCII. Además, enviamos directamente los valores codificados char por char a la consola.

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

Implementar el cifrado Caesar para procesar la cadena proporcionada por el usuario en C

Alternativamente, podemos volver a implementar la muestra de código anterior para tomar tanto el texto como la posición de rotación de la entrada del usuario, verificarlos y cifrar la cadena dada. A diferencia del ejemplo anterior, esta versión incluye dos llamadas fgets y malloc para asignar memoria dinámica para el texto sin cifrar. Esta implementación también se ocupa de cadenas en minúsculas y no podría cifrar una cadena mixta correctamente.

#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