# 密碼學教學大綱
## 1. 密碼學是什麼 ?
### (1) 密碼學歷史 (靖絹) 10min
| 古典 | 現代 |
|:-------------------- | ---- |
| 資訊的保密書寫和傳遞 | 資訊完整性驗證(訊息驗證碼)資訊發布的不可抵賴性(數位簽章)、資訊安全問題|
| 創造力與技巧 | 大量相關理論 |
| 替換式密碼:凱薩密碼、維吉尼亞密碼 置換式密碼:籬笆密碼法、密碼棒| 對稱加密:DES、AES(區塊加密法) XOR(串流加密法)非對稱加密: RSA |
柯克霍夫原則(Kerckhoffs’ principle)
這個原則首先由奧古斯特·柯克霍夫(Auguste Kerckhoffs)提出, 強調即使密碼系統的任何細節已為人悉知,只要密鑰(key)未洩漏,它也應是安全的
Alice 和 Bob 最早出現 1978 年 2 月發表的《A Method of Obtaining Digital Signatures and Public-Key Cryptosystems》中,論文作者就是發明 RSA 密碼體制而獲得 ACM 圖靈獎的 Rivest、Shamir、Adleman。這篇論文中作者首次使用了 Alice 和 Bob 來描述方案
* 避免使用枯燥無味的 A 和 B
* 英文首字母仍然維持 A 和 B 不變
* 分別爲女性名字和男性名字,這樣在論文後面的部分中就可以使用英語的她(she)和他(he)分別指代
Eve竊聽者
Mallory 惡意攻擊者
### (2) 加密 (咏萱) 10min
encryption decryption cracking
#### a. 何為密鑰, 明文, 密文
##### 密鑰:密鑰是一種参數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的参數。密鑰分為對稱密鑰與非對稱密鑰。
##### 明文:明文,是指没有加密的文字(或者字符串),一般人都能看懂的意思,属于密码学术语。 在通信系统中它可能是比特流,如文本、位图、数字化的语音或者数字化的视频图像等。一般可以简单地认为明文是有意义的字符或比特集,或通过某种公开的编码标准就能获得的消息。经过某个加密算法进行作用,将作用后的文字称为密文。对密文来说,若想得到明文,就应通过与加密算法对应的解密算法进行解密,恢复出明文。
##### 密文:加了密的文字,與明文相對
#### b. 對稱加密
##### 這類演算法在加密和解密時使用相同的密鑰,或是使用兩個可以簡單地相互推算的密鑰。
Alice要傳給Bob一個明文m,用了私鑰e加密m成密文c,把c和e傳給Bob之後Bob再用e去解密c來還原成m
#### c. 非對稱加密 (公開金鑰加密)
##### 它需要兩個金鑰,一個是公開密鑰,另一個是私有密鑰;公鑰用作加密,私鑰則用作解密。使用公鑰把明文加密後所得的密文,只能用相對應的私鑰才能解密並得到原本的明文,最初用來加密的公鑰不能用作解密。由於加密和解密需要兩個不同的密鑰,故被稱為非對稱加密
Alice要傳給Bob一個明文m,Bob先產生出私鑰d跟公鑰e,把e傳給Alice之後Alice用e去加密m成密文c,把c傳給Bob後Bob用d去解密c來還原成m
2
## 2. 古典密碼 (unity 安安) 30min
### (1) 凱薩密碼
概念很簡單,就是把字母位移固定的量
選擇1個數字,作為字母的偏移量-> 範圍1~25
加密-> 加上偏移量
解密-> 減掉偏移量
=====================================================
E:明文 ( 加密前的文章 )
D:密文 ( 加密後的文章 )
K:金鑰、偏移量 ( 範圍 0 ~ 25 )
加密:D = ( E + K ) mod 26
解密:E = ( D - K + 26 ) mod 26
#### 特殊變體-> ROT13
加密:D = ( E + 13 ) mod 26
解密:E = ( D + 13 ) mod 26
-> 更好破解
### (2) 維吉尼亞密碼
破解-> 卡西斯基試驗
### (3) 替換式密碼 (雜)
#### a. 簡易替換密碼 ex:凱薩
#### b. 諧音替換法
#### c. 多表替換加密
#### =現代密碼=
#### d. 機械替換加密 ex:恩尼格馬密碼機
#### e. otp 一次性密碼本
### (4)置換式密碼
#### a. 籬笆密碼法
#### b. 密碼棒
# 練習時間 : picoctf...
## 3. 現代密碼 (宇辰 柏旭) 30min
## 對稱
### (1) xor-> 互斥或密碼
(先教and,or是甚麼)
https://home.gamer.com.tw/creationDetail.php?sn=2949476
文字序列的每個字元可以通過與給定的金鑰進行按位元互斥或運算來加密。如果要解密,只需要將加密後的結果與金鑰再次進行按位元互斥或運算即可。
### (2) padding
許多經典密碼會將明文排列成特定的形狀(如:正方形、長方形等),而如果明文不能完全符合形狀,就需要添加字母來填滿形狀。 用無意義的字母來填充則更可以阻礙一些密碼分析。
#### PKCS7:缺 N bytes 就用 N 帶入
○ 缺 1 bytes 就用 0x01 填滿
○ 缺 2 bytes 就用 0x02 填滿
○ 不要和 CBC Mode 一起使用(Padding Oracle Attacks)
#### ANSI X.923:最後一個 byte 填寫有多少空缺,用 null bytes 填滿其餘空位
○ DD DD DD DD 00 00 00 04
#### ZeroPadding:就全部用 null byte 填滿
#### 區塊加密法工作模式 -> ECB, CBC
#### padding oracle attack 密文填塞攻擊 (xor運用)
## 非對稱
### (3) RSA (難)
典型的非對稱加密法
1.找兩大質數p,q
2.n = p * q
3.Φ(n) = (p-1) * (q-1) //Φ(n) 為小於n且與n互值的數的數量
4.任取公鑰e 符合 1 < e < Φ(n) 且與 Φ(n)互值
找到私鑰d 使 ed ≡ 1 (mod Φ(n))
加密: m ^ e % n = c
解密: c ^ d % n = m
破解:
需要傳遞:n,c,e
解密需要:n,c,d
e求d需要Φ(x)
求Φ(x)需要p,q
求pq需要對n做質因數分解
#### RSA的padding
https://cloud.tencent.com/developer/article/1499219
## 4. 應用 10min
### (1) hash
https://blog.m157q.tw/posts/2017/12/25/differences-between-encryption-and-hashing/
#### one way hash (單向雜湊)
將長度不固定的資料映射為固定長度的字串,如 MD5, SHA
### (2) mac
#### HMAC (hash)
#### GCM,CCM(塊密碼)
### (3) 數位簽章
##### 比特幣相關資料
要談起幣特幣,得先從從公共帳本開始說起:
假設:你和你的朋友有頻繁的金錢往來,例如:吃晚餐時,有時候錢會找不開,由一個人代墊,所以你們寫了一個公共帳本,來紀錄交易資訊,例如:A 欠 B 10元, B 欠 C 30元,並且個帳本是公開的,你們約好到月底,大家對記錄無意義的話就一起合計金額,如果你花的錢大於支付的錢,你就要向公家繳錢,反之,你可以向公家取錢。這時出現了一個問題,由於每個人都能新增紀錄,我們該如何確保帳本內的資訊正確無誤呢?
Q1:怎麼確保帳本的正確性?(EX:我們怎麼避免Bob在帳本偷偷記下Alice欠他100元)
ANS:利用密碼學中的數位簽章技術
乍聽之下,數位簽章跟手寫簽名一樣,你可能會想數位簽章要怎麼儲存,是不是電腦複製下來就可以到處亂用,這樣要怎麼防止偽造簽名?
要實現數位簽章,每個人都要生成一對公共密鑰(PUBLIC KEY)和私人密鑰(SECRET KEY),每個密鑰都是一串位元。在日常生活中,簽署所有文件我們所使用的簽名是一致的,然而電子簽名強一些,他會隨著簽署的內容變動,基本上他會是一組256位的0與1組成的,因此任何一個輕微的變動都會導致數字看上去完全不同。
更準確地來說,產生這樣的簽名我們需要一個函數,以簽署內容和你的私鑰作為參數。私人密鑰確保了只有你本人才能產生這個電子簽名,這個簽名同時取決於簽署內容,這意味著別人意味著其他人不能簡單地複製這個簽名,並在其他內容上偽造另一個簽名。
與此同時還有一個驗證函數用於驗證簽名是否真實,而這個函數還需要公共密鑰,它的作用是告訴我們這個簽名是否是由一個私鑰加密,並有一個與之配對的公鑰用於驗證,它保證了如果你不知道私鑰,你幾乎不可能找到一個正確的簽名。
### (4) 亂數生成器
#### seed是什麼?
#### 偽隨機性
https://jason-chen-1992.weebly.com/home/-random-number-generation