1. 密码学是什么
不是研究怎麼設安全的密碼
● 不是教你怎麼破解別人 Facebook
● 你不會因為知道密碼學在幹嘛就變成天才駭客
● 很多數學
○ 我是說,真的很多
○ 不過我並沒有打算講很多數學理論
○ 我自己數學也不好 QQ
● 如果已經沒興趣了,可以趕快離開我不會介意
而是:
古典密碼學
○ 資料保密、傳遞
○ 密碼破譯
● 現代密碼學
○ 古典密碼學的所有東西
○ 資料完整性驗證(Data integrity)
○ 資料的不可否認性( Non-repudiation)
○ 雜湊函數(Hash)
○ 亂數
○ 隱寫術(Steganography)
2. 常见词解释:
- 加密 Encrypt:指將明文經過某種程序轉換成密文,該程序稱為加密
- 解密 Decrypt:指將密文經過某種程序轉換成明文,該程序稱為解密
- 明文 Plaintext:加密前的訊息
- 密文 Cipertext:加密後的訊息
- 演算法 Algorithm:解決複雜問題的程序
- 密碼學演算法:做與密碼學相關程序(如加密、解密、簽章...)的演算法
- 金鑰 / 密鑰 Key:加解密時所使用的「鑰匙」
3. 柯克霍夫原则
● 即使演算法完全洩漏,只要金鑰沒有洩漏,密文就是安全的
● Claude Shannon: "the enemy knows the system"
● Bruce Schneier: 任何以隱藏設計作為防護(Security through obscurity)的保安
系統必然會失敗
● Kerckhoffs's principle 不是說密碼學演算法都必須公開,而是要確保即使公開也
不會傷害安全性
*古典密码学
恺撒密码学
撒密码(英语:Caesar cipher),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系。
加密(向左偏移三格):hitcon -> efqzlk
● 解密(向右偏移三格):efqzlk -> hitcon
攻擊:暴力破解太簡單,也才 26 種可能
● 據說凱薩當年就是用往左偏移三個字母來加密的
○ 阿不過,他的敵人大多不識字
单一字元替代密码
和凱薩密碼一樣是字母一對一代換,但沒有規律
● 換字表(密鑰):
a -> h
b -> e
c -> q
d -> k
...
● 加密:dcba -> kqeh
● 解密:kqeh -> dcba
● 其實也不一定要換成另一個字母(e.g. 豬圈密碼)
攻擊:字頻分析(Frequency analysis)
最常出現的字母:e, t, a, o, i
最常出現的單字:the, to, of, and
维吉尼亚密码
基本上就是一系列的凱薩密碼
明文:platelet is great
密鑰:hitcon(重複填補到明文長度)
密文:wttvsylb bu uelim
● 字頻分析不能用了 QQ
● 沒關係,還是有方法可以破解
卡西斯基试验
- 现代密码学的基本概念
- 对称加密
加解密用同一个key
编码不是加密,密码学要把所有文字转成数字才能运算,有时可能会需要二进制。
XOR
攻击:
已知明文與密文時可以直接回推 Key (明文⊕密文 = 金鑰)
● 遇到一長串 Null (0x00) 時會直接寫出 Key
而這在二進制檔案中是很常見的事情
● 如果 Key 長度短於 Plaintext,那基本上就是變種的維吉尼亞密碼
○ 卡西斯基試驗
○ Index of coincidence
● 如果 Key 長度等於 Plaintext,又 Key 完全隨機且不重用(即 One Time Pads)
是被證實無法破解的(暴力破解也不可行)
AEC(Rijindael)
美國國家標準局 NIST 於 1997 年開始徵選下一代的對稱式加密系統
○ 稱為 Advanced Encryption Standard,簡稱 AES
○ 要求實作程式碼必須公開(不允許 Security by obscurity)
○ 必須無償給所有人使用
○ 除安全性外要考慮效能、記憶體使用量、是否易於實作等
○ 由全世界所有專家一起研究與評比
● 最後由比利時密碼學家 Joan Daemen 和 Vincent Rijmen 設計的 Rijndael 獲勝
● 金鑰長度(Key sizes):128, 192 or 256 bits
● 區塊長度(Block sizes):128 bits
○ 換而言之,AES 規定一次只能加密 128 bits
● 嚴格來說,AES(規範) 是 Rijndael(演算法) 的 subset
串流加密 vs 区块加密
金鑰分配問題
Alice 如何安全的把金鑰送給 Bob?
● 事先約定
○ Alice 把金鑰寫在紙條上,偷偷拿給 Bob
● 金鑰管理
● 非對稱式加密系統
○ 有兩把金鑰,用於加密的可以公開給別人,用於解密的要私藏
● Diffie-Hellman key exchange
○ 可以靠著溝通創㐀出共有金鑰而讓竊聽者無法得知該金鑰
非对称加密
加解密使用不同的key
RSA常见非对称加密系统
- 最常见非对称加密系统
- 基于大数质因数分解困难
大数质因数分解原理
密码学用于资料与身份验证
散列函数(hash):1. 验证data的完整性 2. 不取得明文得情况下验证资料得正确性
讯息验证码(MAC): 1. 消息验证 2. 验证完整性 3. 可验证身份 4. 常用HMAC(如:http/https的TLS协议使用)、CBC-MAC
数位签章(Digital Signature): 1. 类似于纸上签名,证明认可资料 2. 拥有私钥的人可以签章,其他人可验章 3. 通常hash后签章 4. 基于非对称式加密系统的应用 5. 具有不可否认性
has VS MAC VS Digital Signature
鉴权 certificate authority:如何确保大家的公钥一致呢?
● 負責身份驗證並發放、管理、註銷憑證的
權威機構
● 大家都信任這個機構發放的簽章
乱数(Random number)
使用乱数的时机:1. 生成金轮 2. 生成Nonce 3. 生成IV
由seed搭配演算法产生乱数(具有确定性):
PRNG:伪乱数生产器
CSPRNG:密码学安全伪乱数生产器
TRNG:真乱数生产器
几个关键点:
● Seed 很重要
● key = srand(time(NULL))
● 如果已知 PRNG 與大略的生成時間 Orz
● 請使用 /dev/urandom 和 CryptGenRandom
● 演算法不要亂來,請用 NIST 系列的(DUAL_EC_DRBG 除外)