在 C 語言中實現凱撒密碼

Jinku Hu 2023年10月12日
  1. 在 C 語言中實現凱撒密碼處理常量字串的方法
  2. 在 C 語言中實現凱撒密碼來處理使用者提供的字串
在 C 語言中實現凱撒密碼

本文將演示關於如何在 C 語言中實現凱撒密碼的多種方法。

在 C 語言中實現凱撒密碼處理常量字串的方法

凱撒密碼是一種最簡單的加密方案,不能用於任何產品級的保密,而只是滿足我們知識上的好奇心。凱撒本質上是具有給定位置數量的字母旋轉技術。給定文字和位置 5,加密版本將包含右移 5 位的字元。請注意,旋轉方向不是嚴格指定的,因為每種情況下都有其相反的旋轉,從而得到相同的結果。

在下面的例子中,我們演示瞭如何加密硬編碼的 string 文字。旋轉位置取自使用者輸入,並檢查數字是否在 [1,26]的區間內,因為這個例子只針對英文字母。接下來,我們執行 while 迴圈,在這個迴圈中,一個字元被檢查是否有非字母值,然後才用給定的位置進行移位。這段程式碼只能處理小寫字母,因為我們採用了代表 ASCII 編碼中 a97 值。同時,我們直接將編碼後的值逐個字元輸出到控制檯。

#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 語言中實現凱撒密碼來處理使用者提供的字串

另外,我們也可以重新實現之前的程式碼示例,從使用者輸入的文字和旋轉位置中獲取文字和旋轉位置,驗證它們,並對給定的字串進行加密。與前一個例子相比,這個版本包括兩個 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

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook