Back
Clang & Wasm 教學

補充教材:凱薩密碼 Caesar Cipher

凱薩的祕密:古羅馬的加密遊戲


1. 凱薩密碼的由來

凱薩的祕密:古羅馬的加密遊戲

很久很久以前,在古羅馬的輝煌年代,有一位名叫尤利烏斯・凱薩 (Julius Caesar) 的大將軍。他不僅擁有無與倫比的軍事才能,還是一位擅長策略與謀略的大師。而在戰場上,除了士兵和武器,他還有一個隱藏的秘密武器——凱薩密碼。

🏺 秘密從哪裡開始? 在戰爭中,傳遞命令是一件極其危險的事。萬一命令被敵軍截獲,那整場戰役可能就會落入陷阱。於是凱薩想出一個聰明的方法,他把每封信的字母都往後移動幾個位置。

比如說,他告訴士兵們:「如果我們把 'A' 變成 'D','B' 變成 'E',那麼 'HELLO' 就會變成 'KHOOR',敵人看到了也無法理解。」 這就是後來被稱為**凱薩密碼(Caesar Cipher)**的加密方法。

🔐 解碼的鑰匙 (Key) 是什麼?

其實這個密碼的鑰匙,就是他移動字母的位數。 如果你知道「往後移動3個字母」,那你就能從 KHOOR 解出原來的 HELLO。 不過當時的人們對這種變換毫無概念,所以這種簡單的加密方法,已經足以保護軍事機密。

  • 每個字母都會根據「金鑰」(key)位移,例如:

    • 原文:HELLO
    • 金鑰:3
    • 加密後:KHOOR
  • 若超過 Z,會繞回 A(循環結構)。

🧠 聰明的對手,破解了嗎?

當然,沒有一種鑰匙可以永遠無懈可擊。隨著時間的推移,人們發現只要嘗試所有可能的移動次數(總共只有25種),就可以輕易破解這種密碼。

不過在兩千年前,資訊的速度遠比不上戰馬的奔跑。在那個年代,凱薩密碼簡單、有效,而且能即時保護重要情報,已經是一項革命性的技術。

🌍 凱薩密碼的影響

你知道嗎?凱薩密碼不只是歷史上的趣事,它還是今天很多加密技術的祖先。 雖然現代的加密方式已經複雜得多,但從凱薩開始,人類就踏上了「保護訊息」這條路。今天我們用來上網、轉帳、傳訊息的加密技術,某種程度上,都能追溯到那位戴著月桂冠的大將軍。


2. ASCII、字元與基本操作

C 語言中,字元實際上是整數型態(char),可以進行數學運算:

#include <stdio.h>

int main() {
    char c = 'A';
    printf("字元:%c,ASCII:%d\n", c, c); // A → 65
    return 0;
}

ASCII 表格

以下是 完整 ASCII 表格(0–127),每個字元附上中文說明。此為 C 語言常用的 7-bit ASCII 編碼,包含控制字元、數字、英文字母及標點符號。


📘 ASCII 對照表(0–127)

十進位 字元 中文說明
0 NUL (\0) 空字元 (Null)
1 SOH 標題開始 (Start of Heading)
2 STX 正文開始 (Start of Text)
3 ETX 正文結束 (End of Text)
4 EOT 傳輸終止 (End of Transmission)
5 ENQ 詢問 (Enquiry)
6 ACK 接收確認 (Acknowledge)
7 BEL 鈴聲 (Bell)
8 BS 退格 (Backspace)
9 TAB 水平定位 (Tab)
10 LF 換行 (Line Feed)
11 VT 垂直定位 (Vertical Tab)
12 FF 換頁 (Form Feed)
13 CR 歸位 (Carriage Return)
14 SO 移出 (Shift Out)
15 SI 移入 (Shift In)
16–31 Ctrl 控制字元(保留)
32 空格 (Space)
33 ! 驚嘆號
34 " 雙引號
35 # 井號
36 $ 美元符號
37 % 百分比
38 & 和號
39 ' 單引號
40 ( 左括號
41 ) 右括號
42 * 星號
43 + 加號
44 , 逗號
45 - 減號
46 . 句點
47 / 斜線
48 0 數字 0
49 1 數字 1
50 2 數字 2
51 3 數字 3
52 4 數字 4
53 5 數字 5
54 6 數字 6
55 7 數字 7
56 8 數字 8
57 9 數字 9
58 : 冒號
59 ; 分號
60 < 小於號
61 = 等號
62 > 大於號
63 ? 問號
64 @ 小老鼠(電子郵件符號)
65 A 英文字母 A
66 B 英文字母 B
67 C 英文字母 C
68 D 英文字母 D
69 E 英文字母 E
70 F 英文字母 F
71 G 英文字母 G
72 H 英文字母 H
73 I 英文字母 I
74 J 英文字母 J
75 K 英文字母 K
76 L 英文字母 L
77 M 英文字母 M
78 N 英文字母 N
79 O 英文字母 O
80 P 英文字母 P
81 Q 英文字母 Q
82 R 英文字母 R
83 S 英文字母 S
84 T 英文字母 T
85 U 英文字母 U
86 V 英文字母 V
87 W 英文字母 W
88 X 英文字母 X
89 Y 英文字母 Y
90 Z 英文字母 Z
91 [ 左中括號
92 \ 反斜線
93 ] 右中括號
94 ^ 脫字符號(caret)
95 _ 底線
96 ` 重音符(grave accent)
97 a 小寫 a
98 b 小寫 b
99 c 小寫 c
100 d 小寫 d
101 e 小寫 e
102 f 小寫 f
103 g 小寫 g
104 h 小寫 h
105 i 小寫 i
106 j 小寫 j
107 k 小寫 k
108 l 小寫 l
109 m 小寫 m
110 n 小寫 n
111 o 小寫 o
112 p 小寫 p
113 q 小寫 q
114 r 小寫 r
115 s 小寫 s
116 t 小寫 t
117 u 小寫 u
118 v 小寫 v
119 w 小寫 w
120 x 小寫 x
121 y 小寫 y
122 z 小寫 z
123 { 左大括號
124 | 垂直線
125 } 右大括號
126 ~ 波浪號
127 DEL 刪除 (Delete)

ASCII 列出 26 個大寫英文

for (char c = 'A'; c <= 'Z'; c++) {
    printf("%c: %d\n", c, c);
}

3. 用凱薩密碼加解密 ASCII 的大小寫英文字母實作

處理英文字母的加密

void encrypt(char *encr, char *text, int key) {
    int i;
    if (key > 0) {
        key = key % 26;
    }
    else if (key < 0) {
        key = 26 - ((-key) % 26);
    }

    for (i = 0; text[i] != '\0'; i++) {
        char c = text[i];
        if (c >= 'A' && c <= 'Z') {
            // 處理大寫部份
            encr[i] = (c - 'A' + key) % 26 + 'A';
        } 
        else if (c >= 'a' && c <= 'z') {
            // 處理小寫部份
            encr[i] = (c - 'a' + key) % 26 + 'a';
        }
        else {
            // 其餘字不管,例如空白
            encr[i] = c;
        }
    }
    encr[i] = '\0';
}

📌 反向加密 = 解密

void decrypt(char *text, int key) {
    encrypt(text, -key); // 巧妙反推
}

測試的程式

int main() {
    // Write C code here
    char a[] = "Test hello.com";
    char b[100];
    char c[100];
    printf("%s\n", a);
    encrypt(b, a, -35);
    printf("%s\n", b);
    decrypt(c, b, -35);
    printf("%s\n", c);
    return 0;
}

4. 課堂作業

將文字檔案加密成加密文字檔案, 再將加密的文字檔案解密

作業要求

  1. 使用檔案處理

加分條件

  1. 使用函數獨立封裝
SNPQ © 2025