You are on page 1of 112

Summer Camp 密碼學

數學虐我千百遍,我待數學如初戀

台灣好厲害 – 楊明軒
Whoami

• 台科資管所碩一
• 楊明軒
• 略懂: Crypto / Pwn
對稱式加密法
1
Length Extension Attack , LEA
2
CONTENTS
非對稱式加密法
3
Q&A
4
本日課程相關

http://140.110.112.28
http://140.110.112.30/
https://tlk.io/campcrypto
https://tinyurl.com/ydyq4w52
https://tinyurl.com/y92b3d2b
對稱式加密法
DES 、 AES
簡介 對稱式加密法

• DES
• AES
簡介 Data Encryption Standard, DES
明文64bits 流程圖

• 實際只用 56 bits 攪一攪


• 有 8 bits 做校驗
左邊32bits 右邊32bits
• 意即輸入和輸出的資料都是 64 bits
一個回合

金鑰 加密

左部分 右部分

金鑰 加密

重複做 16 個回合
DES 問題

• 讓加密和解密是相同的
Ek1 Ek2
0x0101010101010101 0x011F011F010E010E and 0x1F011F010E010E01
0xFEFEFEFEFEFEFEFE 0x01E001E001F101F1 and 0xE001E001F101F101
4 把Weak key
0xE0E0E0E0F1F1F1F1 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
0x1F1F1F1F0E0E0E0E 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
0x0000000000000000 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1
0xFFFFFFFFFFFFFFFF 不考慮校驗位,
0xE1E1E1E1F0F0F0F0 這四把也是Weak key
0x1E1E1E1E0F0F0F0F 上面這六組是 Semi-weak key

Ek1(Ek2(m)) = m
使用上面的Weak key ,加密兩次等於沒加密
E(E(m)) = m
DES 弱金鑰練習 - SharifCTF 8 2018 - DES

明文 加密-> 密文

0x0101010101010101
0xFEFEFEFEFEFEFEFE
0xE0E0E0E0F1F1F1F1
0x1F1F1F1F0E0E0E0E
DES 弱金鑰練習 - SharifCTF 8 2018 - DES
簡介 Advanced Encryption Standard, (AES)

• 意即輸入和輸出的資料都是 128 bits

• 考 Mode 選用 DES / AES 其實也沒啥差別,差在 bits 不同而已


簡介 Advanced Encryption Standard, (AES)

1. SubBytes 固定的輸入 128 bits 明文 (16 bytes)


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

2. ShiftRows

4 bytes / 3. MixColumns 4 bytes / 3. MixColumns 4 bytes / 3. MixColumns 4 bytes / 3. MixColumns

4. AddRoundKey / 和金鑰做 xor

固定的輸出 128 bits 明文 (16 bytes)


簡介 Block Cipher

固定長度明文 固定長度密文

金鑰 加密 金鑰 解密

固定長度密文 固定長度明文
簡介 Block Cipher

64 bits 明文 64 bits 密文 128 bits 明文 128 bits 密文

DES 金鑰 DES AES AES


金鑰 金鑰 金鑰
加密 解密 解密 解密

64 bits 密文 64 bits 明文 128 bits 密文 128 bits 明文

DES 金鑰長度是 64 bits AES 金鑰長度可以是 128、192、256 bits


以 AES 舉例 – padding

第一組資料 第二組資料
128 bits 剩下的 72 bits + 56 bits 填充
反正就是要等於 128 bits

金鑰 加密 金鑰 解密

128 bits 128 bits

就算輸入是剛好 128 bits ,也會做 padding 填充 128 bits


簡介 操作模式 Mode – 以 AES 舉例

• 𝐸𝑙𝑒𝑐𝑡𝑟𝑜𝑛𝑖𝑐 𝑐𝑜𝑑𝑒𝑏𝑜𝑜𝑘, 𝐸𝐶𝐵


• 𝐶𝑖𝑝ℎ𝑒𝑟 − 𝑏𝑙𝑜𝑐𝑘 𝑐ℎ𝑎𝑖𝑛𝑖𝑛𝑔, 𝐶𝐵𝐶
• 𝐶𝑜𝑢𝑡𝑒𝑟, 𝐶𝑇𝑅
• 𝐶𝑖𝑝ℎ𝑒𝑟 𝑓𝑒𝑒𝑑𝑏𝑎𝑐𝑘, 𝐶𝐹𝐵
• 𝑂𝑢𝑡𝑝𝑢𝑡 𝑓𝑒𝑒𝑑𝑏𝑎𝑐𝑘, 𝑂𝐹𝐵
ECB Mode

加密 解密

• 相同的明文加密會得到相同的密文
ECB Mode – 同明文加密得到同密文

• 相同的明文加密會得到相同的密文
ECB Mode

加密 解密

• 相同的明文加密會得到相同的密文
練習 – ECB Mode

題目網址: https://id0-rsa.pub/problem/26/
練習 – ECB Mode

題目網址: https://id0-rsa.pub/problem/26/
CBC Mode

加密 解密

補充: iv 存在的目的是為了避免同樣的明文有相同的密文產生
本身不用保護,可以公開,但每次使用需不同,不然會有問題
iv 產生的方式需要隨機而無法被人預測
CBC Mode

加密 解密

0110
1001

1001

補充: iv 存在的目的是為了避免同樣的明文有相同的密文產生
本身不用保護,可以公開,但每次使用需不同,不然會有問題
iv 產生的方式需要隨機而無法被人預測
CBC Mode

加密 解密

0111
1001

1000

補充: iv 存在的目的是為了避免同樣的明文有相同的密文產生
本身不用保護,可以公開,但每次使用需不同,不然會有問題
iv 產生的方式需要隨機而無法被人預測
CFB Mode

加密 解密

p2 = aes(key, c1) xor c2


p3 = aes(key, c2) xor c3
p4 = aes(key, c3) xor c4
第 n 組解密依賴第 n – 1 組密文
OFB Mode
加密 解密
練習 – AIS3 Final 2015 Crypto 2 (1)

key = "XXXXXXXXXXXXXXXX"
iv = ''.join(random.choice(string.hexdigits) for _ in range(16))
flag = "ais3{NEVERPHDNEVERPHDNEVERPHD..}" # Not real flag ...

def encrypt(p):
return AES.new(key, AES.MODE_OFB, iv).encrypt(p)

print encrypt(flag).encode("hex")

while True:
p = ''.join(random.choice(string.lowercase) for _ in range(32))
print encrypt(p).encode("hex")
詳細真實程式碼請參考題目檔案
練習 – AIS3 Final 2015 Crypto 2 (2)

固定不變的 AES(iv, key)


這題可把 OFB 看成這樣
明文 xor

密文

原本的 OFB 加密
練習 – AIS3 Final 2015 Crypto 2 (2)

單次連線固 固定不變的 AES(iv, key)


定不變 這題可把 OFB 看成這樣
明文 xor

密文

原本的 OFB 加密
練習 – AIS3 Final 2015 Crypto 2 (3)

首先: 𝐶[0] = 𝑃[0] 𝑥𝑜𝑟 𝐴𝐸𝑆(𝑖𝑣, 𝑘𝑒𝑦)[0]

全部找到代表我們有了 AES(iv ,key) ,因為:


𝐶 = 𝑃 𝑥𝑜𝑟 𝐴𝐸𝑆(𝑖𝑣, 𝑘𝑒𝑦)
𝑃 = 𝐶 𝑥𝑜𝑟 𝐴𝐸𝑆(𝑖𝑣, 𝑘𝑒𝑦)
所以直接將 AES(iv ,key)和 flag 的密文做 xor 即可
練習 – AIS3 Final 2015 Crypto 2 (4)
練習 – AIS3 Final 2015 Crypto 2 (5)
CTR Mode

加密 解密
練習 - OWO_Nonsense-Machine (1)
練習 - OWO_Nonsense-Machine (2)
練習 - OWO_Nonsense-Machine (3)
練習 - OWO_Nonsense-Machine (4)
練習 - OWO_Nonsense-Machine (5)
Length Extension Attack
簡介, 工具, 練習
簡介 Hash function

輸入任意長度的資料 特點: 單向輸出,不可逆

Hash function 有很多種,舉例:


Hash() • md5
• sha1
• sha256
固定長度的輸出
網路下載東西常見用於判斷檔案有無完整、被竄改

Python3 舉例,算 test 的 md5


import hashlib
hashlib.md5(b"test").hexdigest()
# 098f6bcd4621d373cade4e832627b4f6
LEA 基本介紹

舉例:
假設
• key = 123
• msg = “username=user1”
• sha256(“123user”) = A

今天你只知道:
• key 長度是 3
data 是你可以控制的任意訊息 • msg 的內容是“username=user1”
• sha256( key || msg) 的結果是 A

• md5 然後你可以獲得如
• sha1 𝑠ℎ𝑎256(“123𝑢𝑠𝑒𝑟𝑛𝑎𝑚𝑒 = 𝑢𝑠𝑒𝑟1𝑢𝑠𝑒𝑟𝑛𝑎𝑚𝑒 = 𝑎𝑑𝑚𝑖𝑛”)
• sha256 黃色的 username=admin 可以改成任意你想放得值
• sha512
實際算出來應該是𝑠ℎ𝑎256(“123𝑢𝑠𝑒𝑟𝑎𝑛𝑚𝑒 = 𝑢𝑠𝑒𝑟1𝑝𝑎𝑑𝑑𝑖𝑛𝑔𝑢𝑠𝑒𝑟𝑛𝑎𝑚𝑒 = 𝑎𝑑𝑚𝑖𝑛”)
• ... 等
Merkle–Damgård Construction
LEA 工具

from hashpumpy import hashpump

h = '37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578'
key_len = 4
msg = b"test"
data = b"admin"
new_hash, append_data = hashpump(h, msg, data, key_len)

hashpump(hash, msg, append_data, key_length)


程式碼
LEA 工具

結果
LEA 工具

驗證一下
練習 - OWO_Apple Shop (1)
練習 - OWO_Apple Shop (2)
練習 - OWO_Apple Shop (3)
練習 - OWO_Apple Shop (4)
練習 - OWO_Apple Shop (5)
練習 - OWO_Apple Shop (6)

hashpump(hash, msg, append_data, key_length)


練習 - OWO_Apple Shop (7)
練習 - OWO_Apple Shop (8)
非對稱式加密法
RSA 、ElGamal、ECC
簡介 非對稱式加密法

• 公鑰加密,只能用私鑰解密
• 私鑰加密,只能用公鑰解密

• RSA
• ElGamal
• ECC
RSA
基本數學、RSA簡介、攻擊練習
基本數學

三個重要性質:

1. 如果 n 是質數: φ(n) = n – 1
2. 如果 p 和 q 是質數: φ(p * q) = φ(p) * φ(q) = (p - 1) * (q - 1)
3. 如果 p 是質數: φ( ) = -
基本數學

Python 舉例:

模運算的一個性質:

舉例:
基本數學

乘法反元素: 兩個數字相乘 = 1
如果 d 是 e 的模反元素: 舉例:
• e * d ≡ 1 (mod φ(n))
相同意思
• e * d % φ(n) = 1 3 和 互為對方的乘法反元素

求法: 模反元素: 兩個數字相乘後,除以模數的餘數 = 1


舉例:
• 暴力窮舉
• 費馬小定理 假設模數 = 7 ,則 3 和 5 互為對方的模反元素:
• 擴展歐基里德演算法
3*5%7=1
基本數學

Python 3 – 模反元素
如果 d 是 e 的模反元素:
• e * d ≡ 1 (mod φ(n))
相同意思
• e * d % φ(n) = 1
from Crypto.Util.number import inverse

print(inverse(3, 7)) # 5
求法:
import gmpy2
• 暴力窮舉
• 費馬小定理
print(gmpy2.invert(3, 7)) # 5
• 擴展歐基里德演算法
基本數學

/2

11 + ( − 7 𝑚𝑜𝑑 3) 𝑚𝑜𝑑 3 16 ∗ 𝑖𝑛𝑣𝑒𝑟𝑡(2 , 3) 𝑚𝑜𝑑 3

其實可以想像成時鐘, -1 mod 12 = 11 這個 invert 指 2 在模數 3 下的模反元素

因為我們知道時鐘 12 點往回走一格是 11
RSA 基本概念
舉例:
明文 M = 2

產生金鑰:
1. n = p * q 1. 先找兩個質數: p = 3 , q = 11
2. φ(n) = (p – 1) * (q – 1) 1. n = p * q = 33
2. φ(n) = (p - 1) * (q - 1) = 2 * 10 = 20
1. e 需要和 φ(n) 互質 2. 隨便找個 e = 13
1. gcd(13 , 20) = 1
1. e * d mod φ(n) = 1
3. 算出 d = 17
d 是 e 在模數φ(n) 下的模反元素 1. 13 * 17 mod 20 = 1

明文 M 必定小於 N 加密: C = 2 ^ 13 mod 33 = 8


加密: C = mod N 解密: M = 8 ^ 17 mod 33 = 2
解密: M = mod N
RSA 基本概念
舉例:
明文 M = 2

產生金鑰:
1. n = p * q 1. 先找兩個質數: p = 3 , q = 11
2. φ(n) = (p – 1) * (q – 1) 1. n = p * q = 33
2. φ(n) = (p - 1) * (q - 1) = 2 * 10 = 20
1. e 需要和 φ(n) 互質 2. 隨便找個 e = 13
1. gcd(13 , 20) = 1
1. e * d mod φ(n) = 1
3. 算出 d = 17
d 是 e 在模數φ(n) 下的模反元素 1. 13 * 17 mod 20 = 1

Python 有內建函數: 加密:


加密:
解密: 解密:
讀取金鑰內容

舉例: 給你 c = 8 , n = 33 , e = 13 ,求 m = ?

可以嘗試使用 openssl 或 pycrypto 來讀取


讀取金鑰內容 - openssl
$ openssl rsa -pubin -in pub.pem -text 讀取 pub.pem 這把公鑰

Exponent 是 e ,這裡可以看到 e = 65537

Modulus 是 n ,且用十六進制表示,這裡可以看到
n = 0x0c4ac5822c39b762339c5f9a509794c2bf9035aaab2d57194b1d056b
讀取金鑰內容 - pycrypto

from Crypto.PublicKey import RSA


key = RSA.importKey(open(“pub.pem”, “rb”).read()) # 讀取 pub.pem

In [8]: key.n
Out[8]: 1294506718235478161592096722917508216492977651068363875076991157611

In [9]: key.e
Out[9]: 65537
基本 RSA 攻擊 - 4 STEPS

分解 N 求出私鑰 d 有d就可解密 將 m 轉明文

解密

import gmpy2 m = pow(c, d, n)


print(gmpy2.invert(e, φ(n)))
RSA 最基本的攻擊 – 質因數攻擊

反正看到 RSA 題目,如果 n 沒很大都可以試試看


RSA 最基本的攻擊 – 質因數攻擊

一個可以幫你做質因數分解的線上網站

1 2

1. 先輸入你想分解的數字 35
2. 按下 Factorize
3. 看到答案: 35 = 5 * 7
RSA 最基本的攻擊 – 質因數攻擊

一個在自己電腦上跑的工具

如果 p 和 q 差很大,或是 p 和 q 差很小可以用
RSA 最基本的攻擊 – 質因數攻擊

一個整合常見RSA攻擊的工具

Github
練習 - YUBITSEC CTF RSA II 2017
練習 - YANG_RSA-1
練習 - YANG_RSA-2

底下是 Python 3 求解開方根的函數


import gmpy2
gmpy2.iroot(8, 3) # (mpz(2), True)
8 開 3 次方根 = 2
練習 - YANG_RSA-3

基本概念: 解題流程:
假設你知道存在兩個公鑰 N1 和 N2 有以下規則: 1. 算出 p + q = (n2 – n1 – 4) / 2
• N1 = p * q = 3 * 11 2. 有 p + q 就可以算出 φ(n)
• N2 = (p + 2) * (q + 2) = 5 * 13 • φ(N1) = N1 – (p+q) + 1
那我們可以在不分解 N1 和 N2 的情況下得到 φ(n) • φ(N2) = N2 + (p+q) + 1

有 φ(n) 就可以求私鑰,有私鑰就可以解密 ...


Common Modulus Attack

因為
假設今天存在兩個公鑰:
• 公鑰1: (N, e1) 會存在 s1 和 s2,符合底下:
• 公鑰2: (N, e2)
我用兩把公鑰對同一個明文作加密:
• 公鑰1 加密得到: C1 而因為:
• 公鑰2 加密得到: C2

使用 python 求解 s1 & s2 簡化消去可以得到:

假設

𝑒1 = 3 & 𝑠1 = 2
𝑒2 = 5 & 𝑠2 = −1
詳細的簡化消去流程
練習 - YANG_RSA-4 (1)
練習 - YANG_RSA-4 (2)
練習 - YANG_RSA-4 (3)

import gmpy2

def common_modulus_attack(e1, e2, c1, c2, n):


_, s1, s2 = gmpy2.gcdext(e1, e2)
s1 = int(s1)
s2 = int(s2)
if s1 < 0:
s1 *= -1
c1 = int(gmpy2.invert(c1, n))
if s2 < 0:
s2 *= -1
c2 = int(gmpy2.invert(c2, n))
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
return m
Common factor attack
練習 - SECCON2017_Ps and Qs
Wiener Attack – 簡介
簡介連分數

連分數_wiki
Wiener Attack – 原理 (1)

Wiener 證明可以精確蓋到 k 和 d

有 k 和 d 就可以算出 φ(n)

φ(n)

• 有 φ(n) 就可以算出 d
• 有 私鑰 d 就可以解密
Wiener Attack – 原理 (2)
Wiener Attack – 解題 owiener

用法:

import owiener

d = owiener.attack(e, n) GitHub
練習 – Wiener Attack
RSA 後門 (1)
RSA 後門 (1)
RSA 後門 (2)

這裡說的 a 值就是題目給的 backdoor


ElGamal
原根、簡介、已知明文攻擊
基本數學 – 原根

這也是目前找原根的方式

用 Python 求原根:
from sympy.ntheory import primitive_root

primitive_root(13) # 2
原根 - Example

g = 2
p = 13

for i in range(1,13):
print "index = ",i," , result = ",pow(g,i,p)

這裡可以看到當 g = 2 時, index 從 算出的 都不同

所以可以說 2 是 13 的原根
ElGamal 簡單介紹

• 相同明文每次加密都會產生不同密文
• 不同密文可解密回相同的明文

給你 P 和 G 和 𝐺 𝑚𝑜𝑑 𝑃 ,求 x 很難
ElGamal 金鑰產生 & 加解密
已知明文攻擊 / 隨機數重用
已知明文攻擊 / 隨機數重用
練習 - ElGamal_reuse_k
ECC
簡介、純量乘法、質數體、練習
ECC (Elliptic Curve Cryptography) 基本介紹

基本運算:
左邊的運算是兩個點相加

右邊的運算是同個點相加

基本知識:
使用有限體,可以分為三種
• 質數體 (GF(p) )
• 二元體 (GF(2^n) )
• 最佳擴展體 (GF(p^n) )

體指一個集合,並定義兩個數學運算
(加法和乘法)
ECC (Elliptic Curve Cryptography) 基本介紹

套到密碼學中:
私鑰: [d]

公鑰: [d]P
將P加d次
ECC (Elliptic Curve Cryptography) 基本介紹

安全基礎:

已知:
• 橢圓曲線 E
• E 上的一個基點 P
• x倍的P (xP = G)

求:
x 是多少
如何算 [d]P

先設 X 和 Y 都是 1P
1101 1101 1101 1101 1101 1101
X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
如何算 [d]P

先將 Y 做兩倍: 2P

1101 1101 1101 1101 1101 1101


X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
如何算 [d]P

再將 X 和 Y 相加: 3P

1101 1101 1101 1101 1101 1101


X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
如何算 [d]P

將 Y 做兩倍: 6P

1101 1101 1101 1101 1101 1101


X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
如何算 [d]P

先做 Y 的兩倍: 12P

1101 1101 1101 1101 1101 1101


X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
如何算 [d]P

再將 X 和 Y 相加: 13P

1101 1101 1101 1101 1101 1101


X 1P 1P 1P 1P 1P 1P
Y 1P 2P 3P 6P 12P 13P

由左到右掃過去
質數體的公式
練習 - Simplest_ECC
THANK YOU!
Any Questions?

台灣好厲駭Summer Camp資安暑訓營
密碼學

You might also like