C 言語でシーザー暗号を実装する

胡金庫 2023年10月12日
  1. C 言語で定数文字列を処理するシーザー暗号を実装する
  2. ユーザが提供した文字列を処理するためのシーザー暗号を C 言語に実装する
C 言語でシーザー暗号を実装する

この記事では、C 言語でシーザーの暗号を実装する方法について、複数の方法を示します。

C 言語で定数文字列を処理するシーザー暗号を実装する

シーザー暗号は最も単純な暗号化方式の一つであり、いかなる合理的な秘密保持のために使用してはならないものではなく、単なる知的好奇心のために使用してはならないものです。シーザーは基本的に、与えられた位置の数だけアルファベットを回転させる技術です。テキストと 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 言語に実装する

あるいは、前のコードサンプルを再実装して、ユーザ入力からテキストと回転位置の両方を取得し、それらを検証し、与えられた文字列を暗号化することもできます。前の例とは対照的に、このバージョンでは、クリアテキスト用の動的メモリを確保するために、2つの 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);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook