# 密碼學學習筆記即實作
## 1.古典密碼學
### 1-1.簡介
密碼學是一門研究如何保護信息安全的學科,主要包含加密技術、解密技術、訊息驗證及金鑰管理等領域。密碼學的目標是確保機密性、完整性、身份驗證和不可否認性。
### 1-2凱薩密碼
* 將字母一固定為依加密
* 優點
* 簡單易實作:只需固定位移量即可加密
* 運算速度快:加密和解密只需進行位移計算
* 缺點
* 極易破解:僅有 25 種可能的密鑰,可以暴力破解。
* 易受頻率分析攻擊:由於字母的相對順序不變,攻擊者可以透過常見字母頻率
### 1-3維吉尼亞密碼.
#### 1-3-1.維吉尼亞密碼
* 利用關鍵字進行多表替換,加強安全性
* 優點
* 適用於較長文本:使用關鍵字來變化加密方式,增強安全性
* 缺點
* 如果關鍵字過短,仍然容易被破解 : 透過卡西斯基檢驗找到重複模式後可以破解。
* 需要記住關鍵字:比起單一位移,需記住更長的密鑰
#### 1-3-2.補充-卡西斯基檢驗
##### 破解原理
1.尋找密文中重複的字母序列
* 例如密文:RIJVS UYVJN RIJVS,發現 RIJVS 重複出現。
2.記錄這些重複字串的間距
* 例如,RIJVS 出現在密文的第 1 和 11 個位置,間距為 10。
* 假設還有其他重複字串,間距可能是 5, 10, 15...。
3.找出這些間距的 最大公因數 (GCD)
* 如果這些間距的最大公因數為 5,那麼關鍵字長度很可能是 5。
4.將密文拆分為多組單獨的凱撒密碼進行破解
* 一旦知道關鍵字長度,將密文分成 5 組,然後對每組單獨執行**頻率分析攻擊**,破解凱撒密碼。
### 1-4.單表代換密碼
* 單表代換密碼是固定對應關係的替換密碼,每個字母都被唯一對應到另一個字母。不同於凱撒密碼的固定位移,單表代換的對應關係可以是任意排列,因此比凱撒密碼更難破解。
* 優點
* 增加混淆性:攻擊者無法輕易知道加密規則。
* 缺點
* 仍然受頻率分析攻擊影響:每個字母的對應關係固定,因此可以根據字母出現頻率進行破解。
* 密鑰需要儲存與管理:如果對應表洩漏,加密內容將不再安全。
### 1-5.結論
古典密碼學已不再安全,但它是現代密碼學的起點,為今日的資訊安全技術奠定了堅實的基礎。
## 2.現代密碼學
### 2-1.AES對稱加密演算法
#### 2-1-1.簡介
是一種對稱加密演算法,它被廣泛應用於保護資料的安全性。AES 實作指的是如何利用 AES 演算法來加密和解密資料。由於 AES 使用相同的金鑰進行加密和解密,因此它屬於對稱加密的一種。
#### 2-1-2.AES數學推導
##### 2-1-2-1.有限域**GF(2^8)運算**
AES主要基於**有限域GF(2^8)**,即256個元素組成的代數結構,這裡的加法和乘法都是**模2**運算
(1) **加法(XOR運算)**
加法定義為**逐位XOR**:
$$a+b= a \oplus b$$
範例:
$$(1101\ 0110)_2 \oplus (1011\ 0011)_2 =(0110\ 0101)_2$$
(2) **乘法(有限域GF(2^8)下的乘法)**
乘法需要一個不可約多項式$P(x)=x^8+x^4+x^3+x+1$來進行模運算
範例:
$$(0x57 \times 0x83) \mod P(x)$$
計算方式
1.轉換成多項式相乘
2.以$P(x)$為模,對結果進行模運算
這個運算是AES**S-Box、MixColumns**變換的基礎
#### 2-1-3.AES算法
有四種操作,分別是金鑰加密(Add Round Key)、位元組代換(SubByte)、行位移(Shift Rows)、列混淆(Mix Column)
明文和金鑰都是128位的(密鑰也可以192位256位,下面都已128為主),16個字節由上到下由左到右排成4*4
總共進行10輪處理,只有最後一輪少了一次MixColumn
##### 2-1-3-1.流程圖

##### 2-1-3-2.**SubBytes(S-Box變換)**
這步驟使用**GF(2^8)** 的逆元和**仿射變換**,來增加 AES 的非線性度,防禦線性攻擊。
(1)**計算GF(2^8)逆元**
如果輸入字節$\alpha$,則找出:
$$\alpha^{-1} \mod P(x)$$
例如:
$$0X53^{-1}=0xCA\quad \text(在GF(2^8)中)$$
(2)仿設變換
將逆元的位元$x$進行以下變換:
$$y_i = x_i \oplus x_{(i+4) \mod 8} \oplus x_{(i+5) \mod 8} \oplus x_{(i+6) \mod 8} \oplus x_{(i+7) \mod 8} \oplus c_i$$
其中$c_i$是固定的二進制向量。
S_box

來源Wiki:https://en.wikipedia.org/wiki/Rijndael_S-box
INV_S_box

來源Wiki:https://en.wikipedia.org/wiki/Rijndael_S-box
##### 2-1-3-3.ShiftRows(行位移)
在 AES 中,ShiftRows 是對明文狀態矩陣進行處理的一個步驟。狀態矩陣的大小為 4x4,每一行進行不同的位移。假設我們的狀態矩陣為:
$$
\text{state} = \begin{bmatrix}
s_{00} & s_{01} & s_{02} & s_{03} \\
s_{10} & s_{11} & s_{12} & s_{13} \\
s_{20} & s_{21} & s_{22} & s_{23} \\
s_{30} & s_{31} & s_{32} & s_{33} \\
\end{bmatrix}
$$
在AES中,對於**ShiftRows**操作,會依照如下規則對行進行位移:
* 第一行(Row 0)不變
* 第二行(Row 1)左移一位
* 第三行(Row 2)左移兩位
* 第四行(Row 3)左移三位
這個過程的數學表達如下:
$$
\text{After ShifhtRows} = \begin{bmatrix}
s_{00} & s_{01} & s_{02} & s_{03} \\
s_{11} & s_{12} & s_{13} & s_{10} \\
s_{22} & s_{23} & s_{20} & s_{21} \\
s_{33} & s_{30} & s_{31} & s_{32} \\
\end{bmatrix}
$$
InvShiftRows就是移回去(還原)
##### 2-1-3-4.MixClumns(列混合)
這步驟透過**GF(2^8)矩陣乘法**來提供擴散性,矩陣為
\
\begin{bmatrix}
2 & 1 & 1 & 3 \\
3 & 2 & 1 & 1 \\
1 & 3 & 2 & 1 \\
1 & 1 & 3 & 2
\end{bmatrix}
\
行向量**s**變換後為:
$$s'=M \cdot s$$
其中的乘法是**GF(2^8)乘法**,如:
$$2 \times x = x \ll 1 \mod P(x)$$
這確保小的輸入變化會擴散到整個區塊。
##### 2-1-3-5.**密鑰擴展**
使用**輪常數Rcon**,並透過XOR產生新的子密鑰:
$$w[i] = w[i-4] \oplus T(w[i-1])$$
其中$T(x)$包含**S-Box變換+Rcon**
##### 2-1-3-6.AddRoundKey(輪密鑰加)
AddRoundKey 步驟是將當前的狀態矩陣與 輪密鑰(Round Key)進行 XOR 操作。每一輪的密鑰是通過密鑰擴展從原始密鑰生成的,密鑰大小也是 128 位(16 字節)。假設我們有以下狀態矩陣:
$$
\text{state} = \begin{bmatrix}
s_{00} & s_{01} & s_{02} & s_{03} \\
s_{10} & s_{11} & s_{12} & s_{13} \\
s_{20} & s_{21} & s_{22} & s_{23} \\
s_{30} & s_{31} & s_{32} & s_{33} \\
\end{bmatrix}
$$
而輪密鑰(Round Key)也有相同大小:
$$
\text{Round Key} = \begin{bmatrix}
k_{00} & k_{01} & k_{02} & k_{03} \\
k_{10} & k_{11} & k_{12} & k_{13} \\
k_{20} & k_{21} & k_{22} & k_{23} \\
k_{30} & k_{31} & k_{32} & k_{33} \\
\end{bmatrix}
$$
**AddRoundKey**的操作是對每個位置進行**XOR**操作,即:
$$ State_{new} = State \oplus Round Key$$
這會對每一個元素進行**XOR**。舉例如下:
$$
\text{State}_{\text{new}} =
\begin{bmatrix}
s_{00} \oplus k_{00} & s_{01} \oplus k_{01} & s_{02} \oplus k_{02} & s_{03} \oplus k_{03} \\
s_{10} \oplus k_{10} & s_{11} \oplus k_{11} & s_{12} \oplus k_{12} & s_{13} \oplus k_{13} \\
s_{20} \oplus k_{20} & s_{21} \oplus k_{21} & s_{22} \oplus k_{22} & s_{23} \oplus k_{23} \\
s_{30} \oplus k_{30} & s_{31} \oplus k_{31} & s_{32} \oplus k_{32} & s_{33} \oplus k_{33} \\
\end{bmatrix}
$$
##### 2-1-3-7.密鑰生成

來源:https://www.slideserve.com/keegan/chapter-5#google_vignette
$其中W_0=K_0和K_1和K_2和K_3連起來(是四分之一長的密鑰,而W_0和W_1和W_2和W_3$是原始的密鑰),g函式是實作中的KeyScheduleCore
##### 2-1-3-8.ECB
在加密時,明文的長度通常會超過 128 位(AES 區塊的大小)。而 ECB模式 是處理這個問題最簡單的一種方式。除了 ECB,還有其他模式如 CBC、CTR、CFB 和 OFB,也可以解決長明文的加密問題,但它們在處理方式和安全性上有所不同。
ECB 模式的工作原理非常簡單,它將明文每 128 位切分成一個區塊,並對每個區塊單獨進行加密。這樣處理的最大問題是:相同的明文區塊會被加密為相同的密文區塊,這樣會暴露出明文的某些模式或結構,從而削弱了加密的安全性。
##### 2-1-3-9.pkcs7_padding
在加密時,明文大小通常不會是加密演算法所需區塊大小的整數倍。例如,AES 的區塊大小是 16 字節,所以如果明文的大小不是 16 的倍數,就需要進行填充。而 PKCS7 padding 的填充方式很簡單,假設現在差一個字節就能成為 16 的倍數,那就填充 0x01,如果差兩個字節,就填充兩個 0x02,以此類推。當差 15 個字節時,就填充 15 個 0x0f。比較特別的是,如果明文的長度本來就已經是 16 的倍數,則需要填充 16 個 0x10。
這樣的填充方式是必要的,因為在去除填充時,需要依據最後一個字節的數值來判定需要刪除多少個填充字節。例如,如果最後一個字節是 0x04,那麼可以知道倒數 4 個字節都是填充字節,應該將其刪除。因此,填充 0x10 也是必要的,這樣才能在去除填充時正確地恢復原來的數據。
### 2-2.RSA非對稱加密
#### 2-2-1.介紹&基本原理
RSA 是一種**非對稱加密**演算法,與傳統的**對稱加密**不同,在RSA中 **加密與解密使用的是不同的密鑰**。具體來說,RSA由 **公鑰(public key)** 和**私鑰(private key)** 組成,其中:
* **公鑰** 用於加密訊息,而**私鑰** 用於解密訊息。
* 由於數學上的設計,**用公鑰加密的訊息,只有對應的私鑰才能解密**。
此外,在**數位簽章(digital signature)** 的應用中,這個過程可以反過來,即**由私鑰進行加密,而公鑰負責解密**,以驗證訊息是否來自真實的發送者,且未被篡改。
在 **對稱式加密** 中,發送方與接收方需要共享同一把密鑰,因此密鑰的 **傳輸過程** 可能存在風險。然而,**RSA能夠避免這個問題**,因為通訊雙方不需要交換私鑰——**只要公開公鑰,私鑰保持秘密,就能確保安全性**。(在不考慮時間攻擊等額外威脅的情況下)
#### 2-2-2.擴展歐幾里得
##### 2-2-2-1.歐幾里得算法(輾轉相除法)
就是普通的輾轉相除法
$$gcd(a,b)=gcd(b,a%b)$$
$$gcd(a,0)=a$$
##### 2-2-2-2.擴展歐幾里得
擴展歐幾里得算法是用來求只知$a、b$下$ax+by=gcd(a,b)$的$x、y$
$ax+by=gcd(a,b)$$
$\ \ \ \ \ \ \ \ \ \ \ \ \ =gcd(b,a\ mod \ b)$
$\ \ \ \ \ \ \ \ \ \ \ \ \ =gcd(b,a-\lfloor\frac{a}{b} \rfloor b$
$\ \ \ \ \ \ \ \ \ \ \ \ \ =bx^{\prime}+(a-\lfloor\frac{a}{b} \rfloor b)y^{\prime}$
$\ \ \ \ \ \ \ \ \ \ \ \ \ =ay^{\prime}+b(x^{\prime}-\lfloor\frac{a}{b} \rfloor y^{\prime})$
得$x=y^{\prime}$、$y=x^{\prime}-\lfloor\frac{a}{b} \rfloor y^{\prime}$
所以只要先求出$x^{\prime}$和$y^{\prime}$就好了
因為$gcd(a,0)=a$,遞迴到$gcd(a,0)$時$y^{\prime}=1$,$x^{\prime}=0$
代入公式就可以得到前一層遞迴的$x$,$y$了
#### 2-2-3.算模逆元
使用擴展歐幾里得找到一組$x、y$滿足$ax+by=1=\gcd(a,b)時,$可得出$ax \equiv 1 \pmod b,x$也就是$a$的模反元素
#### 2-2-4.密鑰生成
1.**選擇兩個大指數**
設**p**和**q**為兩個大指數,定義:
$$
N=p \times q
$$
N被稱為RSA模數
2.**計算歐拉函數**
$$\varphi(N)=(p-1)(q-1)$$
歐拉函數$\varphi(N)$表示小於**N**且與**N**互質的數的個數
3.**選擇公開指數e**
選擇一個整數e,使得:
$$1 < e < \varphi(N), \quad \gcd(e, \varphi(N)) = 1$$
這保證了e在模$\varphi(N)$下可逆,即存在唯一的模反元素。
4.**計算私鑰d**
$$d \equiv e^{-1} \pmod{\varphi(N)}$$
即:
$$d \times e \equiv 1 \pmod{\varphi(N)}$$
d是在e模$\varphi(N)$下的逆元,通常使用擴展歐幾里得算法計算
#### 2-2-5.**加密與解密公式**
**加密:**
$$
c \equiv m^e \mod N
$$
**解密:**
$$
m' \equiv c^d \mod N
$$
代入 $c = m^e$:
$$
m' \equiv (m^e)^d \mod N
$$
因為 $e \times d \equiv 1 \mod \varphi(N)$,所以存在某個整數 $k$ 使得:
$$
e \times d = 1 + k \varphi(N)
$$
因此:
$$
m' \equiv m^{1 + k \varphi(N)} \mod N
$$
#### 2-2-6.**證明:$m^{1 + k \varphi(N)} \equiv m \pmod{N}$**
##### 2-2-6-1.證明(1)
我們已經知道:
$$
m' \equiv m^{1 + k \varphi(N)} \mod N
$$
其中 \( m' \) 是解密後的訊息,\( m \) 是原始訊息,$\varphi(N)$ 是 \( N \) 的歐拉函數值。
根據 RSA 的性質,我們有以下公式:
$$
e \times d \equiv 1 \mod \varphi(N)
$$
這表示 $e \times d$ 當除以 $\varphi(N)$ 時,會留下餘數 1,因此:
$$
m^{e \times d} \equiv m \mod N
$$
接下來,將 $e \times d = 1 + k \varphi(N)$代入上式,我們得到:
$$
m^{e \times d} = m^{1 + k \varphi(N)}
$$
因此:
$$
m^{1 + k \varphi(N)} \equiv m \mod N
$$
這樣就證明了 $m^{1 + k \varphi(N)} \equiv m \mod N$。這是根據模運算的性質,特別是利用$e \times d \equiv 1 \mod \varphi(N)$ 得出的結論。
##### 2-2-6-2.證明(2)
**(1) \(m\) 與 \(N\) 互質的情況**
根據歐拉定理:
$$
m^{\varphi(N)} \equiv 1 \pmod{N}
$$
因此,
$$
m^{1+k\varphi(N)} \equiv m \cdot \left(m^{\varphi(N)}\right)^k \equiv m \cdot 1^k \equiv m \pmod{N}
$$
這證明了解密過程能夠還原明文。
**(2) \(m\) 與 \(N\) 不互質的情況**
如果 \(m\) 是 \(p\) 或 \(q\) 的倍數,則分別考慮模 \(p\) 和模 \(q\) 的情況:
$$
m^{\varphi(p)} \equiv 1 \pmod{p} \quad \text{與} \quad m^{\varphi(q)} \equiv 1 \pmod{q}
$$
同樣可得:
$$
m^{1+k\varphi(N)} \equiv m \pmod{p} \quad \text{與} \quad m^{1+k\varphi(N)} \equiv m \pmod{q}
$$
根據中國餘數定理 (CRT),我們可以推出:
$$
m^{1+k\varphi(N)} \equiv m \pmod{N}
$$
這樣就證明了在兩種情況下都有
$$
m^{1+k\varphi(N)} \equiv m \pmod{N},
$$
從而確保 RSA 解密能正確還原明文。
來源皆參考[Wiki](https://zh.wikipedia.org/zh-tw/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95)
#### 2-2-7.RSA 的安全性分析
RSA 的安全性基於 **質因數分解問題**,即將大數 \( n = p \times q \) 分解為兩個質因數 \( p \) 和 \( q \)。目前,分解大數 \( n \) 是非常困難的,特別是當 \( n \) 足夠大時,這使得破解 RSA 變得不現實。
##### 2-2-7-1.**安全性依賴於 \( n \) 的大小**
RSA 公鑰的模數 \( n \) 必須足夠大,通常選擇 **2048 位** 以上的 \( n \) 來保證安全性。這樣的大小對現有的計算能力來說,分解 \( n \) 幾乎是不可能的。
##### 2-2-7-2**量子計算威脅**
量子計算機可能會對 RSA 安全性構成威脅,因為量子計算可以用 Shor 算法高效解決質因數分解問題,但目前這種技術尚未成熟。
總結來說,RSA 的安全性基於質因數分解的困難性,若 \( n \) 足夠大,破解 RSA 幾乎不可能。
#### 2-2-8應用
1.HTTPS協議就是用RSA傳輸數據
2.數位簽名
3.安全電子郵件
4.身分認證
5.VPN
### 3.加密傳訊息聊天程式
#### 3-1.簡介
這個程式正是我在學習完 AES 和 RSA 加密技術後的應用實作,旨在結合兩種加密算法的優勢——利用 AES 的高速加密與 RSA 的密鑰保護機制,打造一個簡單而安全的本地傳訊息系統。
#### 3-2.流程圖

[來源](https://wumansgy.github.io/2018/10/19/DES-AES-RSA%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB/)
#### 3-3.本地運行結果

#### 3-4.實作code
```py=
```py=
from Crypto.PublicKey import RSA
from Crypto.Cipher import AES,PKCS1_OAEP
import socket
import threading
import base64
import os
#產生RSA密鑰
def generate_RSA_key():
key=RSA.generate(2048) # 產生 2048-bit RSA 密鑰
private_key=key.export_key()
public_key=key.publickey().export_key()
return private_key, public_key
#AES 加密
def encrypt_message_AES(key, plaintext):
cipher=AES.new(key,AES.MODE_EAX)
ciphertext, tag=cipher.encrypt_and_digest(plaintext.encode())
return base64.b64encode(cipher.nonce+tag+ciphertext).decode()
#AES 解密
def decrypt_message_AES(key,encrypted_text):
raw=base64.b64decode(encrypted_text)
nonce,tag,ciphertext=raw[:16],raw[16:32],raw[32:]
cipher=AES.new(key, AES.MODE_EAX, nonce=nonce)
return cipher.decrypt_and_verify(ciphertext, tag).decode()
# RSA 加密
def encrypt_aes_key_rsa(public_key, aes_key):
recipient_key = RSA.import_key(public_key)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
encrypted_key = cipher_rsa.encrypt(aes_key)
return base64.b64encode(encrypted_key).decode()
# RSA 解密
def decrypt_aes_key_rsa(private_key, encrypted_key):
private_rsa = RSA.import_key(private_key)
cipher_rsa = PKCS1_OAEP.new(private_rsa)
return cipher_rsa.decrypt(base64.b64decode(encrypted_key))
# Server 端(接收並解密訊息)
def server():
private_key, public_key = generate_RSA_key() # 產生 RSA 金鑰
aes_key = os.urandom(16) # 產生 AES 密鑰
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen(1)
print("[SERVER] 等待連線...")
conn, addr = server_socket.accept()
print(f"[SERVER] 來自 {addr} 的連線")
conn.send(public_key) # 傳送公鑰
encrypted_aes_key = conn.recv(1024).decode()
aes_key = decrypt_aes_key_rsa(private_key, encrypted_aes_key) # 解密 AES 密鑰
print("[SERVER] AES 金鑰已解密!")
while True:
encrypted_msg = conn.recv(1024).decode()
if not encrypted_msg:
break
print(f"[SERVER] 接收到加密訊息: {encrypted_msg}")
decrypted_msg = decrypt_message_AES(aes_key, encrypted_msg) # AES 解密訊息
print(f"[SERVER] 客戶端: {decrypted_msg}")
response = input("[SERVER] 輸入回覆: ")
conn.send(encrypt_message_AES(aes_key, response).encode()) # 回覆訊息並加密
# Client 端(加密並發送訊息)
def client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 65432))
public_key = client_socket.recv(1024) # 接收 Server 公鑰
aes_key = os.urandom(16) # 產生 AES 金鑰
encrypted_aes_key = encrypt_aes_key_rsa(public_key, aes_key)
client_socket.send(encrypted_aes_key.encode()) # 發送加密後的 AES 金鑰
print("[CLIENT] 已加密 AES 金鑰並傳送!")
while True:
msg = input("[CLIENT] 輸入訊息: ")
encrypted_msg = encrypt_message_AES(aes_key, msg) # AES 加密訊息
print(f"[CLIENT] 加密後的訊息: {encrypted_msg}")
client_socket.send(encrypted_msg.encode())
response = client_socket.recv(1024).decode()
print(f"[CLIENT] 伺服器: {decrypt_message_AES(aes_key, response)}") # 解密回覆訊息
# 啟動伺服器或客戶端
if __name__ == "__main__":
choice = input("啟動伺服器 (s) 或 客戶端 (c)?").strip().lower()
if choice == 's':
server()
elif choice == 'c':
client()
else:
print("請選擇 's' 或 'c'")
```
## 3.困難
### 3-1.理論理解的挑戰
在學習現代密碼學時,我遇到了不少理論上的挑戰,特別是在理解 AES中的 XOR 加法。
* **XOR加法**:雖然我知道在**GF(2⁸)**中,加法等同於**XOR**(即位元逐位相加,不產生進位),但這種與日常算術中加法完全不同的運算方式讓我感到十分抽象和不直觀。
* 為了釐清這一點,我不得不反覆閱讀講義、查閱文獻,並進一步將**XOR**與傳統加法做對比,才能逐步理解其在有限域中的特殊意義。
### 3-2.RSA正確性證明的困難
學習 RSA 的正確性證明時,我花費了大量時間來推導其數學過程,尤其是在以下幾個關鍵部分:
* **模反元素**:求解 d 使得 e×d≡1 (modφ(n)) 的過程,需要使用**擴展歐幾里得算法**,這部分數學推導對我來說充滿挑戰。
* **歐拉定理與中國餘數定理**:在證明$m^{1+k\varphi(n)}\equiv m (mod(n))$時,我需要理解這些定理如何相互結合,這促使我反覆練習並比對不同資料,最終才逐步掌握。
### 3-3. 實作過程中的困難
在實作 AES 演算法時,我首次嘗試用程式碼實現 多項式乘法 及模運算(使用模不可約多項式$x^8+x^4+x^3+x+1$:
* AES 乘法:這部分需要將 位運算 與數學運算結合,用於模擬 GF(2⁸) 中的乘法。由於這種方法較為簡潔但又極具抽象性,導致我在編寫程式時常因觀念不順暢而卡頓,出現錯誤。
* 我通過查找**網路上不同的教程**和參考**開源實作**,逐步調整並完善自己的程式碼。
### 3-4. 解決方法與學習策略
面對這些挑戰,我採用了多種方法來解決問題,主要包括:
* 查找資料:我積極瀏覽網絡、閱讀技術博客與學術文章,尋找針對 XOR 加法、多項式乘法 等關鍵概念的詳細解釋。
* 詢問 ChatGPT:將具體疑問提交給 ChatGPT,讓他針對我的問題提供最適合的解答,這對我釐清觀念、理解原理起到了關鍵作用。
* 反覆實作與測試:在程式實作過程中,我多次調試、反覆測試程式,通過實踐逐步鞏固所學知識,並從錯誤中學習如何更正邏輯與算法細節。
## 4.心得
在學習密碼學的過程中,我深刻體會到古典密碼學與現代密碼學之間的根本區別。從最早的凱撒密碼到現代建立在質數分解難題上的 RSA,每一項技術都展現出密碼學隨著計算能力進步而不斷演變的特性。
### 4-1**理論與實踐並重**
這段學習經歷讓我認識到,單靠**理論知識**是不足以掌握密碼學的;只有透過**實踐和反覆思考**,才能將那些抽象的概念轉化為具體可行的實作方案。每當我在某個概念上遇到瓶頸——無論是 AES 中的 XOR 加法、多項式乘法,或是 RSA 的正確性證明——我都會不斷探索各種資源,並與 ChatGPT 討論細節,最終逐步突破困難。
### 4-2.**持續探索的重要性**
在密碼學的學習旅程中,我逐漸認識到,**持續探索**並不僅僅意味著重複練習或查找資料,而是一種對未知保持好奇心、勇於挑戰並不斷突破自我極限的精神。這種持續探索的過程,使我不僅僅停留在表面理解上,而是真正掌握了每個演算法背後的數學原理與運作邏輯。每當我遇到瓶頸時,總會激勵我去尋找新的資源,閱讀不同專家的講解,並通過與 ChatGPT 的交流,獲得更多元、深入的觀點。這不僅鞏固了我的知識體系,更培養了我在面對複雜問題時的**獨立思考**與**創新解決能力**。在這個過程中,我逐步體會到,只有不斷地**探索**與**實驗**,才能真正從失敗中學習,進而將抽象的理論轉化為具體可行的實作方案。這種精神不僅適用於密碼學,也成為我學習其他技術領域的重要法則。我堅信,無論面對多大的挑戰,只要保持對知識的熱情和對未知的探索精神,就能不斷突破自我,獲得長足進步。
## 5.參考資料
- [AES加密是什麼?AES-256原理、流程與應用](https://uptogo.com.tw/%E7%A7%91%E6%8A%80/%E8%BB%9F%E9%AB%94%E5%92%8Capp/%E6%AA%94%E6%A1%88%E6%A0%BC%E5%BC%8F/aes%E5%8A%A0%E5%AF%86/)
- [古典密碼學](https://aikawa0617.medium.com/%E5%AF%86%E7%A2%BC%E5%AD%B8-%E4%B8%80-%E5%8F%A4%E5%85%B8%E5%AF%86%E7%A2%BC%E5%AD%B8-455e43038241)
- [RSAwiki](https://zh.wikipedia.org/zh-tw/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95)
- [密碼學AES](https://codingman.cc/cryptography-aes/)