---
# System prepended metadata

title: cryptography 圖文解析
tags: ["information\_security", cryptography]

---

# cryptography  

# 目錄  
1. [ECB](#ECB)  
2. [CBC](#CBC)  
3. [CFB](#CFB)  
4. [OFB](#OFB)  
5. [CTR](#CTR)  
6. [RSA](#RSA)  
7. [OAEP](#OAEP)  
8. [參考資料以及繪圖軟體](#參考資料以及繪圖軟體)

## ECB  
說明 : 明文、密文為 1 對 1  

**加密(Encrypt) :**  
![](https://hackmd.io/_uploads/Byo0SYHwR.png)  


**解密(Decrypt) :**  
![image](https://hackmd.io/_uploads/HyabLtBvR.png)  


* block 是個別加密  
* 會被重送攻擊  
* block 可以被調位置  
* **安全等級低** : 因為密文同等同於明文也是相同訊息  

### **補充** -- 重送攻擊 :  
中間人攻擊的低階版本  
主要是在不同區塊產生分叉之後，因為分開之後 2 方都還擁有分開之前的資料
所以可以在 2 邊做一樣的交易，但因為分開之後各自經營的客戶與交易並不會相互交換訊息，所以可以在 B 處拿到東西並且用一樣的憑證在 C 處拿到東西  

![](https://hackmd.io/_uploads/BJ0Sq0nah.png)  

另一個簡單的舉例 : Alice 想向 Bob 證明自己的身分所以提供了密碼，但 Eve 竊聽了對話並保留了密碼，之後 Eve（冒充 Alice）連接到 Bob，Eve 可以傳送從 Bob 接受的最後一個對談中讀取的 Alice 的密碼讓 Eve 得到存取權限。  
![](https://hackmd.io/_uploads/rkRIs0hah.png)  


## CBC  
說明 : 在 ECB 加密的基礎上增加 XOR 運算  

**加密(Encrypt) :**  
![](https://hackmd.io/_uploads/HJpkJcrPA.png)  


**解密(Decrypt) :**  
![](https://hackmd.io/_uploads/rkbvy5HPC.png)  


* 一定要上一個 block 加密完成才能加密下一個 block  
* 當某一個 block 的 bit 出錯時，只會影響該 block 以及下一個 block  
* 如果 block 被丟失時，則會讓後續所有的 block 都被影響  

### 補充 -- 初始化向量 :  
電腦隨機生成相同大小的密文區塊  


## CFB  
說明 : 不同順序的 CBC 加密  

**加密(Encrypt) :**  
![image](https://hackmd.io/_uploads/ryVnxg69A.png)  

**解密(Decrypt) :**  
![image](https://hackmd.io/_uploads/B1UCexaq0.png)  



### 補充 -- CFB 的缺陷  
如果想要指定直接加密第 x 個明文，需要從頭開始加密  


## OFB  
說明 : 彌補 CFB 加密的缺陷，只需要重複加密 (x - 1) 次初始化向量  

**加密(Encrypt) :**  
![image](https://hackmd.io/_uploads/HJUGblT9A.png)  

**解密(Decrypt) :**  
![image](https://hackmd.io/_uploads/HkPXZeT9C.png)  




## CTR  
說明 : 節省 OFB 加密的運算效率，讓加密過程不需重複 (x - 1) 次加密，改成使用 counter(計數器) 取代初始化向量  

**加密(Encrypt) :**  

![image](https://hackmd.io/_uploads/H1LdVd8ygl.png)  


**解密(Decrypt) :**  

![image](https://hackmd.io/_uploads/SkoDPuU1le.png)  

* 可同步加密解密  
* 丟失任一 block 均不會影響其他 block  

### 補充 -- CTR 小重點  
不可忽略區塊加密  


## RSA  
說明 : 目前常見的加密方法，運用質因數運算  

![](https://hackmd.io/_uploads/r1k_oY2T3.png)  

### 解密流程  
運用蒙哥馬利複除法  
以下以 $R = 100$ 為例，$R、N$ 互值  
小註解 : $\because N < R \Rightarrow T < N^2 < R^2$  
1. 收到 $c = 16$ 已知 $N = 33, d = 3$  
2. $N^{\prime} = -N^{-1} \bmod R = 3$  
3. $R \cdot c \ \bmod N = 1600 \bmod 33 = 16$  
4. $T_1 = (R \cdot c \ \bmod N)^2 = 256$  
5. $x_1 = N^{\prime} \cdot T_1 \ \bmod R = (T_1 \ \bmod R) \cdot N^{\prime} \ \bmod R = (56) \times 3 \ \bmod 100 =68$  
6. $R \cdot c^2 \ \bmod N = R^{-1} \cdot T_1 \ \bmod N = \cfrac{T_1 + x_1 N}{R} = \cfrac{256+68 \times 33}{100} = 25$  
7. $T_2 = (R \cdot c^2 \ \bmod N)(R \cdot c \ \bmod N) = 25 \times 16 = 400$  
8. $x_2 = N^{\prime} \cdot T_2 \ \bmod R = 0$  
9. $R \cdot c^3 \ \bmod N = R^{-1} \cdot T_2 \ \bmod N = \cfrac{T_2 + x_2 \cdot N}{R} = 4$  
10. $x = N^{\prime}(R \cdot c^3 \ \bmod N) \ \bmod R = 12$  
11. $m = c^3 \ \bmod N = R^{-1}(R \cdot c^3 \ \bmod N) \ \bmod N = \cfrac{(R \cdot c^3 \ \bmod N) + x \cdot N}{R} = 4$  

* 各名詞解釋  
	- $c$ : 密文  
	- $N$ : RSA 公鑰中的模數  
	- $d$ : RSA 私鑰中的解密指數  
	- $R$ : 模數 $N$ 的倍數，用於處理模運算  
	- $m$ : 明文  

### 補充--更詳盡的資料  
https://hackmd.io/@Koios/RSA  

## OAEP  
說明 : 一般來說會結合 RSA 加密  

![](https://hackmd.io/_uploads/SJbeIRnT3.png)  

* $n$ 是 RSA 加密中的位數  
* $k_0、k_1$ 是協議中的固定整數  
* $m$ 是 $n - k_0 - k_1$ 位長的明文訊息  
* $G、H$ 為隨機預言(oracle)  
* $\oplus$ 是 XOR  

### 運作流程(加密)  
1. 用 $k_1$ 位長的 $0$ 使消息填滿到 $n-k_0$ 位的長度  
2. 隨機生成 $k_0$ 位長的 $r$ 串  
3. 用 $G$ 將 $k_0$ 位長的 $r$ 擴展到 $n-k_0$ 位長  
4. $x = m000......0 \oplus G(r)$  
5. $H$ 將 $n-k_0$ 位長的 $x$ 縮至 $k_0$ 位長  
6. $y = r \oplus H(x)$  
7. $x, y 為輸出$  
之後可以運用 RSA 加密編碼的消息，利用 OAEP 避免 RSA 加密後的確定性  

### 解密流程  
1. 恢復 $r$ 為 $y \oplus H(x)$  
2. 恢復消息 $m000......0$ 為 $x \oplus G(r)$  


## 參考資料以及繪圖軟體  
* draw.io  
* https://hackmd.io/@Koios/RSA  
* 重放攻擊 : https://zh.wikipedia.org/zh-tw/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB  