Professional Documents
Culture Documents
數學虐我千百遍,我待數學如初戀
台灣好厲害 – 楊明軒
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 流程圖
金鑰 加密
左部分 右部分
金鑰 加密
重複做 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)
2. ShiftRows
固定長度明文 固定長度密文
金鑰 加密 金鑰 解密
固定長度密文 固定長度明文
簡介 Block Cipher
第一組資料 第二組資料
128 bits 剩下的 72 bits + 56 bits 填充
反正就是要等於 128 bits
金鑰 加密 金鑰 解密
加密 解密
• 相同的明文加密會得到相同的密文
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
加密 解密
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)
密文
原本的 OFB 加密
練習 – AIS3 Final 2015 Crypto 2 (2)
密文
原本的 OFB 加密
練習 – AIS3 Final 2015 Crypto 2 (3)
加密 解密
練習 - 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
舉例:
假設
• 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 工具
h = '37268335dd6931045bdcdf92623ff819a64244b53d0e746d438797349d4da578'
key_len = 4
msg = b"test"
data = b"admin"
new_hash, append_data = hashpump(h, msg, data, key_len)
結果
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)
• 公鑰加密,只能用私鑰解密
• 私鑰加密,只能用公鑰解密
• 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 和 互為對方的乘法反元素
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
因為我們知道時鐘 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
產生金鑰:
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
舉例: 給你 c = 8 , n = 33 , e = 13 ,求 m = ?
Modulus 是 n ,且用十六進制表示,這裡可以看到
n = 0x0c4ac5822c39b762339c5f9a509794c2bf9035aaab2d57194b1d056b
讀取金鑰內容 - pycrypto
In [8]: key.n
Out[8]: 1294506718235478161592096722917508216492977651068363875076991157611
In [9]: key.e
Out[9]: 65537
基本 RSA 攻擊 - 4 STEPS
解密
一個可以幫你做質因數分解的線上網站
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
基本概念: 解題流程:
假設你知道存在兩個公鑰 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
因為
假設今天存在兩個公鑰:
• 公鑰1: (N, e1) 會存在 s1 和 s2,符合底下:
• 公鑰2: (N, e2)
我用兩把公鑰對同一個明文作加密:
• 公鑰1 加密得到: C1 而因為:
• 公鑰2 加密得到: C2
假設
則
𝑒1 = 3 & 𝑠1 = 2
𝑒2 = 5 & 𝑠2 = −1
詳細的簡化消去流程
練習 - YANG_RSA-4 (1)
練習 - YANG_RSA-4 (2)
練習 - YANG_RSA-4 (3)
import gmpy2
連分數_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)
這也是目前找原根的方式
用 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)
所以可以說 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
由左到右掃過去
如何算 [d]P
再將 X 和 Y 相加: 3P
由左到右掃過去
如何算 [d]P
將 Y 做兩倍: 6P
由左到右掃過去
如何算 [d]P
先做 Y 的兩倍: 12P
由左到右掃過去
如何算 [d]P
再將 X 和 Y 相加: 13P
由左到右掃過去
質數體的公式
練習 - Simplest_ECC
THANK YOU!
Any Questions?
台灣好厲駭Summer Camp資安暑訓營
密碼學