Implementar Cifra de César em C

Jinku Hu 12 outubro 2023
  1. Implementar Cifra Caesar para Processar String Constante em C
  2. Implementar Caesar Cipher para processar string fornecida pelo usuário em C
Implementar Cifra de César em C

Este artigo irá demonstrar vários métodos sobre como implementar a cifra de César em C.

Implementar Cifra Caesar para Processar String Constante em C

A cifra de César é um dos esquemas de criptografia mais simples que não deve ser usado para nenhum segredo razoável, mas apenas por curiosidade intelectual. César é essencialmente uma técnica de rotação do alfabeto com um determinado número de posições. Dados o texto e a posição 5, a versão criptografada conterá os caracteres deslocados 5 casas para a direita. Observe que a direção de rotação não é estritamente especificada, pois todos os casos têm sua rotação oposta que dá o mesmo resultado.

No exemplo a seguir, demonstramos como criptografar o literal string embutido em código. A posição de rotação é obtida da entrada do usuário e verificada se o número está em um intervalo de [1,26], já que este exemplo é especializado apenas para o alfabeto inglês. Em seguida, executamos o loop while onde um caractere é verificado em busca de valores não alfabéticos e só então é deslocado com os lugares dados. Este código só pode processar caracteres minúsculos, pois empregamos o valor 97 que representa o a na codificação ASCII. Além disso, enviamos diretamente os valores codificados char por char para o 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);
}

Implementar Caesar Cipher para processar string fornecida pelo usuário em C

Como alternativa, podemos reimplementar o exemplo de código anterior para obter o texto e a posição de rotação da entrada do usuário, verificá-los e criptografar a string fornecida. Em contraste com o exemplo anterior, esta versão inclui duas chamadas fgets e malloc para alocar memória dinâmica para o texto não criptografado. Essa implementação também lida com strings em minúsculas e não seria capaz de criptografar uma string mista corretamente.

#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