補充教材:凱薩密碼 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. 課堂作業
將文字檔案加密成加密文字檔案, 再將加密的文字檔案解密
作業要求
- 使用檔案處理
加分條件
- 使用函數獨立封裝