將 "China" 加密為 "Glmre":規則為每個字母向後位移 4 位 (A→E, B→F, ..., Z→D 循環)。
// 大寫字母
char encrypt_upper(char c, int shift) {
if (c >= 'A' && c <= 'Z')
return 'A' + (c - 'A' + shift) % 26;
return c; // 非字母不變
}
// 小寫字母
char encrypt_lower(char c, int shift) {
if (c >= 'a' && c <= 'z')
return 'a' + (c - 'a' + shift) % 26;
return c;
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SHIFT 4
char caesar_shift(char c, int shift) {
if (isupper(c)) return 'A' + (c - 'A' + shift) % 26;
if (islower(c)) return 'a' + (c - 'a' + shift) % 26;
return c; // 數字、標點、空格保持不變
}
void encrypt_string(char *str, int shift) {
for (int i = 0; str[i]; i++) {
str[i] = caesar_shift(str[i], shift);
}
}
int main() {
char text[1000];
printf("請輸入明文: ");
fgets(text, sizeof(text), stdin);
text[strcspn(text, "\n")] = '\0'; // 去除換行
printf("原文: %s\n", text);
encrypt_string(text, SHIFT);
printf("密文 (位移%d): %s\n", SHIFT, text);
// 解密演示 (位移 -SHIFT 或 26-SHIFT)
encrypt_string(text, 26 - SHIFT);
printf("解密: %s\n", text);
return 0;
}
(c - 'A' + shift) % 26 確保 'Z' 位移後正確循環到 'D'。負位移解密時用 (c - 'A' - shift + 26) % 26 避免負數。ctype.h 函數:isupper, islower, isalpha 判斷字符類別,比手動比對 ASCII 碼更可移植 (支援 Locale)。使用關鍵字決定每字母的位移量 (如 KEY → 10, 4, 24 循環),破解難度大幅提升,但仍屬古典密碼,現代需用 AES/ChaCha20 等對稱加密。
本練習熟悉了字符運算、模運算循環、字串遍歷、標準庫函數應用。理解「位移加密」本質是有限域上的加法群運算,是現代密碼學 (如 Diffie-Hellman, ECC) 直觀的入門類比。