C에서 Caesar의 암호 구현

Jinku Hu 2023년10월12일
  1. C에서 상수 문자열을 처리하기위한 Caesar Cipher 구현
  2. C에서 사용자 제공 문자열을 처리하기 위해 Caesar Cipher 구현
C에서 Caesar의 암호 구현

이 기사에서는 C에서 Caesar의 암호를 구현하는 방법에 대한 여러 방법을 보여줍니다.

C에서 상수 문자열을 처리하기위한 Caesar Cipher 구현

Caesar 암호는 합리적인 비밀이 아닌 지적 호기심을 위해 사용해서는 안되는 가장 단순한 암호화 체계 중 하나입니다. Caesar는 기본적으로 주어진 위치 수를 사용하는 알파벳 회전 기술입니다. 텍스트와 위치 5가 주어지면 암호화 된 버전에는 오른쪽으로 5 자리 이동 한 문자가 포함됩니다. 모든 경우에 동일한 결과를 제공하는 반대 회전이 있으므로 회전 방향이 엄격하게 지정되지는 않습니다.

다음 예에서는 하드 코딩 된string리터럴을 암호화하는 방법을 보여줍니다. 회전 위치는 사용자 입력에서 가져 와서 숫자가 [1,26] 간격에 있는지 확인합니다.이 예는 영문 알파벳에만 특화되어 있습니다. 다음으로, 우리는 문자가 알파벳이 아닌 값에 대해 검사되고 주어진 위치로만 이동되는while루프를 실행합니다. 이 코드는 ASCII 인코딩에서a를 나타내는97값을 사용했기 때문에 소문자 만 처리 할 수 ​​있습니다. 또한 인코딩 된 값을 char 단위로 콘솔에 직접 출력합니다.

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

C에서 사용자 제공 문자열을 처리하기 위해 Caesar Cipher 구현

또는 이전 코드 샘플을 다시 구현하여 사용자 입력에서 텍스트와 회전 위치를 모두 가져 와서 확인하고 주어진 문자열을 암호화 할 수 있습니다. 이전 예제와 달리이 버전에는 일반 텍스트에 대한 동적 메모리를 할당하기위한 두 개의fgets호출과malloc이 포함되어 있습니다. 이 구현은 소문자 문자열도 처리하므로 혼합 문자열을 올바르게 암호화 할 수 없습니다.

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