Implementar Cifra de César em C
- Implementar Cifra Caesar para Processar String Constante em C
- Implementar Caesar Cipher para processar string fornecida pelo usuário 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);
}
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