# 世界第一簡單密碼學筆記
## 古典加密系統:
### 凱撒加密
將字母向前或向後順移得出密文
### 替代密碼法
凱薩加密的複雜化,有分為:
1. 簡單替代法:
將字母一對一的對應到其他字母
```flow
st=>start: 明文
op=>operation: 變換規則
e=>end: 密文
st->op->e
```
2. 多字母密碼法:
將明文區分成數個區塊,區塊內的文字以特定規則 $\sigma$ 做替換
ex:
MOMOTARA
$\sigma$ = 1->5 2->5 3->3 4->1
1. MOMO -> OTPP
2. TRAR -> VFUP
因為不知道推遲幾個數,每個字元都必須算過 26 次,若明文長度為 n ,則金鑰數為 $26^n$
3. 置換密碼法:
將明文區分為數個區塊,區塊內的文字以特定規則 $\sigma$ 交換順序
因為無論改變,密文上的字都是由明文改變順序而來,因此金鑰長度為 $n!$
(n = characters per block)
#### 解讀條件
1. 知道加密的演算法
2. 明文具備的統計資料
3. 大量的加密的範本
#### 絕對安全的密碼
1. 使用一次性密碼本(不具再現性):
ex. Vernam Cipher:
* 絕對解不出來
* 通訊效率非常差
3. 計算量非常之龐大的密碼
## 共通金鑰(對稱金鑰):
### XOR 計算
明文 ^ 金鑰 = 密文
密文 ^ 金鑰 = 明文
ex. 3人聯繫需要3把金鑰(每個對應另外兩個)
ex. 4人聯繫需要6把金鑰(每個對應另外三個)
formula:
$n = \frac{(n-1)\,n}{2}$
### 特徵:
1. 需要小心保管、配送
2. 加解密計算量小,適用於大量資料傳遞
3. 需要管理多數金鑰,不適用於不特定人數
### 分類:
1. stream:
* 每個 bit 逐一加密
* 計算簡單
* 可以嘗試每個金鑰破解之
* 金鑰以偽隨機亂數產生
* RC4, SEAL
3. block:
* 明文分成區塊,每個區塊做加密,不足則以 padding 填充
* 會出現相同明文產生相同密文的情況
* 可以用 CBC 模式防禦,將前一個 block 加密結果和下一個區塊明文做 加密
* 還有 OFB, CFB 等等
* 若各個區塊用不同金鑰加密則稱之為 ECB (electric code block)
### DES 密碼
data encryption standard
#### 密文輸出流程:
1. 明文以 64 bit 為單位為 block
2. 以 $IP$ 對每個 block 做初始置換
3. 分為 L0, R0
4. 使用加密金鑰 $K$ 的非線性函數 $f$ 對 R0 做置換排序
> $K$ 每個回合都會不一樣
6. 用 R0 和 L0 做 XOR 運算得出來的結果為新的 R1 , R0 變為 L1
7. 以此類推做個 15次
8. 對 R16, L16 做重組
9. 再一次 $IP$ 對每個 block 做置換
> 裡面運用到對合原理: a->b->a ,做兩次轉換就會得到原始值
>
#### 每回合金鑰 K 的形成:
1. 將一個初使共通金鑰 $K$ 扣掉用做驗證的 8 bit
2. 剩下的 56 bit 分成 C0, D0
3. C0, D0 分別左移 LS1 得到 C1, D1
4. C1, D1 合起來除去 8 bit 並排列 ,所得即為金鑰 $K1$
5. 重複 3, 4 即為各回合的金鑰
#### 非線性函數 $f$:
1. 輸入左邊的 32bit 跟金鑰做結合擴充為 48 bit ,稱之為 $E$
2. 金鑰與 $E$ 做 XOR
3. 運算結果以 6bit 為一組,透過 S-BOX 將 6 bit 變換為 4 bit
4. 所有 4 bit 重新合併成 32 bit
5. 透過 P-BOX 將 32bit 重新排列,所得即為 $f$ 的輸出
#### 弱點
* S-box 沒有標準,實作上容易出現漏洞
* 金鑰長度短,長度短則處理時間長且容易被解讀
* 暴力破解
* 利用輸入的差距 == 輸出差距( XOR 特性)找金鑰
* S-BOX 排列成線性,以機率推測輸出
為了解決弱點,提出 3-DES ,利用 encrypt -> decrypt -> encrypt ,藉以增加金鑰長度,但問題的本質沒解決XD
#### 取代
AES (advanced encryption standard) 採用 Rijndael 演算法
## 公開金鑰密碼(非對稱金鑰加密系統):
這種系統的密碼金鑰會有兩個,公開金鑰用來加密,秘密金鑰用來解密
ex: 商店 A 發布公開金鑰給任何想要跟商店通訊的客戶,客戶的明文用公開金鑰加密後傳送到 A , A 再用秘密金鑰解密
若有 1000 個人要互相通話,則每個人需要一個公開金鑰給想跟你對話的人,一個秘密金鑰用來解密,因此總共需要 1000*2 個金鑰,遠遠少於共通金鑰加密的金鑰數
### 加密技巧:
* 質因數分解問題:
* RSA
* Rabin 密碼
* 離散對數問題:
* ElGamal 密碼
* 橢圓曲線密碼
* DSA 認證
兩種技巧都用了單向函數的原理:
單向計算可以知道答案,反向逆推卻很難,但若是持有金鑰反向逆推就可以解密
模數用於密碼的優點:
其餘數不可能大於等於除數,換言之,範圍是可以掌控的
* 費馬小定理:
$n$ is prime
$a \in Z, a \perp n$
$a^{n-1} \equiv ({mod\ n})$
用來檢驗數 $n$ 是否為質數
* 歐拉定理:
$n \in N$
$a \in Z, a \perp n$
$a^{ \varphi (n)} \equiv (mod\ n)$
若 $n$ 為質數,則 $\varphi(n) = n-1$ 也就是費馬小定理
假設:
$N = pq$
$p,q\ is\ prime$
則
1~pq 中屬於 p 的倍數有: $1,p,2p,3p,4p....qp$ q 個
1~pq 中屬於 q 的倍數有: $1,q,2q,3q,4q....qp$ p 個
故
$\varphi(N) = pq - q-p + 1$
$\varphi(N) = (p-1)(q-1)$
$\varphi(N) = \varphi(p)\varphi(q)$
$a^{p-1} \equiv 1 (mod\ p)$
$a^{q-1} \equiv 1 (mod\ q)$
令 $(p-1)(q-1)$ 的最小公倍數為 $L$
$a^L \equiv 1 (mod\ pq)$
$a^L \equiv 1 (mod\ N)$
又
$(p-1)(q-1) = LG$
$G$為$(p-1)(q-1)$的最大公因數
RSA 加密:
$P$ 為明文
$C$ 為密文
$C = P^e(mod\ N)$ $e$ 為公開金鑰 1 且 $N$ 為公開金鑰 2
RSA 解密:
$P = C^d(mod\ N)$ $d$ 為秘密金鑰且 $N$ 為公開金鑰 2
假設知道 $e\ C\ N$則可以解讀密文,但代數字很費時間,若計算 $\varphi(N)$ 應該可以由歐拉定理算出來,但 $N$ 必須作質因數分解,而 $N$ 為極大值時幾乎不可能作到
RSA 金鑰生成法:
1. 任選擇兩個相當大的相異質數 $p$, $q$
2. 求歐拉函數 $\varphi(N)\ =\ (p-1)(q-1)$
3. 求 $(p-1)(q-1)$ 的最小公倍數 $L$
4. 選擇與與 $L$ 互質且小於 $L$ 的任意正整數 $e$
5. 對於任意正整數 $e$ 求出滿足下式的正整數 $d$:
$ed=1(mod\ L)$
$d<\varphi(N)$
$d>p\ \&\ d>q$
其中 $N$ 為公開金鑰之一,$e$亦為公開金鑰但必須符合 $P^e>N$
$d$ 則為解密金鑰