首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言經典練習:凱撒密碼 (位移加密) 實現與解析

     編輯:C 語言問答

題目還原

將 "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;
}

關鍵點解析

  1. 模 26 運算:(c - 'A' + shift) % 26 確保 'Z' 位移後正確循環到 'D'。負位移解密時用 (c - 'A' - shift + 26) % 26 避免負數。
  2. ctype.h 函數:isupper, islower, isalpha 判斷字符類別,比手動比對 ASCII 碼更可移植 (支援 Locale)。
  3. 原地修改 vs 新緩衝區:範例為原地修改 (簡單);實際專案建議輸出到獨立緩衝區,保留明文。
  4. 安全性警示:凱撒密碼屬替換密碼,僅 25 種鍵值,極易被暴力破解或頻率分析破解,**絕不可用於真實加密需求**。

進階變體:維吉尼亞密碼

使用關鍵字決定每字母的位移量 (如 KEY → 10, 4, 24 循環),破解難度大幅提升,但仍屬古典密碼,現代需用 AES/ChaCha20 等對稱加密。

總結

本練習熟悉了字符運算、模運算循環、字串遍歷、標準庫函數應用。理解「位移加密」本質是有限域上的加法群運算,是現代密碼學 (如 Diffie-Hellman, ECC) 直觀的入門類比。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved