Slide 1

Slide 1 text

密碼學漏洞與他們的產地 zuan@chroot.org

Slide 2

Slide 2 text

Who am I - Zuan - chroot讀書會成員 - 什麼都略懂一點,但什麼都不精通 - 愛玩資訊跟電子領域的各種事務 - 興趣是騎腳踏車跟買學生證

Slide 3

Slide 3 text

Content - 非對稱式演算法 - 對稱式演算法 - 雜湊 - 其他

Slide 4

Slide 4 text

這邊有人沒有聽過RSA的嗎? 請舉個手

Slide 5

Slide 5 text

c ≡ ne (mod (N)) n ≡ cd (mod (N)) ed ≡ 1 (mod φ(N))

Slide 6

Slide 6 text

c -> 密文 n -> 明文 (e,N) -> 公鑰 (d,N) -> 私鑰

Slide 7

Slide 7 text

一般為了加速計算,e會取很小 (e=65537 or e=17 or e=3)

Slide 8

Slide 8 text

如果ne < N且e = 3

Slide 9

Slide 9 text

那不是開方根就能解密了?

Slide 10

Slide 10 text

...

Slide 11

Slide 11 text

OK,那如果效能不是問題,我e選大一點 總可以吧?

Slide 12

Slide 12 text

如果要加密0或1

Slide 13

Slide 13 text

0^e = 0 1^e = 1

Slide 14

Slide 14 text

...

Slide 15

Slide 15 text

Encrypt(‘A’) = YCD6WGtUMNDedQ2HjC5KzSVT Encrypt(‘B’) = REfHH3SCzed6jkRhP6JZwytH Encrypt(‘C’) = aSWP4Z6cX2VYWMxwA9bGMKRA Encrypt(‘D’) = sRuHR8t8Vmy3th8Gf2RAVfkz Encrypt(‘E’) = F4ahebRHXUyzzeNgcBzN4r26 Encrypt(t) = aSWP4Z6cX2VYWMxwA9bGMKRA t = ?

Slide 16

Slide 16 text

就說該都猜C

Slide 17

Slide 17 text

一個加密演算法不該有那麼多毛

Slide 18

Slide 18 text

以上這些弱點都可以透過Padding來解決

Slide 19

Slide 19 text

加解密:PKCS #1 v1.5, OAEP 簽章:PKCS #1 v1.5, PSS

Slide 20

Slide 20 text

Plaintext n Padded Plaintext n Ciphertext n OAEP RSA

Slide 21

Slide 21 text

如果自己實作Signature Padding 應依照標準驗證簽章

Slide 22

Slide 22 text

Python RSA出過類似包 CVE-2016-1494

Slide 23

Slide 23 text

[問掛] 有沒有RSA很慢的八卦?

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

2048 bit/op * 768.3 op/s ≈ 200 kB/s 2048 bit/op * 26270.6 op/s ≈ 6.7 MB/s

Slide 26

Slide 26 text

撥接喔?!╯-____-)╯~═╩════╩═

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

加解密(AES): 75~90 MB/s 簽章(SHA2): 30~300 MB/s

Slide 30

Slide 30 text

RSA iPad AES/SHA!

Slide 31

Slide 31 text

RSA Weak Key

Slide 32

Slide 32 text

RSA的Key不是找兩個大質數就夠了

Slide 33

Slide 33 text

CVE-2008-0166

Slide 34

Slide 34 text

亂數產生器不夠亂,某些質數出現機率高

Slide 35

Slide 35 text

=> 直接猜那些質數可破密

Slide 36

Slide 36 text

=> 拿一堆N來GCD也可以破一發 (shared factor)

Slide 37

Slide 37 text

N1 = p1*q1 N2 = p2*q2 若p1 = p2, p1 = GCD(N1,N2)

Slide 38

Slide 38 text

Weiner’s Attack

Slide 39

Slide 39 text

不常見,記得d > ⅓ N¼就好

Slide 40

Slide 40 text

Pollard p-1 Factorization

Slide 41

Slide 41 text

也不常見,建議(p-1)/2也要是質數

Slide 42

Slide 42 text

TL;DR懶人包: 生Key? OpenSSL

Slide 43

Slide 43 text

[問掛] 有沒有RSA很慢的八卦?

Slide 44

Slide 44 text

...

Slide 45

Slide 45 text

你有聽過橢圓曲線嗎?

Slide 46

Slide 46 text

對稱 RSA ECC 80 1024 160 112 2048 224 128 3072 256 192 7680 384

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

總時間上,橢圓曲線遠比同級的RSA快

Slide 49

Slide 49 text

ECDSA 256 bit Public Key: AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyN TYAAABBBCv5hlgEJBGfQfF/4RdBDMv0hiaeNbwqwkyW4n tYsUUroqqFQMROgYSdHr2bqmX0BCX87l95Hynh2nUPxbO vWtg=

Slide 50

Slide 50 text

RSA 2048 bit Public Key: AAAAB3NzaC1yc2EAAAADAQABAAABAQD4XK2ooKXQZFIrz Tlu6sIVOTdnLDcKc1Qn/WvrGCBFRx5jTfKlJflCVb0Bdh PayaYwibMzu87rn6IzfKdc3yEivcRIKJ0Vv/z86jjbK1V 7zlTXyhvp0I2IUgL46HTFQVykn88dcj0CX0vuuITfr+sH jSLG8icBrZHOoiAXYI8xdbZFZ5BZFp5IbeD5QZ2BNotK1 SkMAt1ls2AZD48toBoX0lMiWf7pufdviQw8GIkQo7Jm52 QDFPj2QPUocVLeqCvzreWgu0SSfaIEDUMScM9alS/OBaj rorQI9/eT85H57sv3che8ascbwN48EpQngBwwzylUl0Wm sjYneybGW8xT

Slide 51

Slide 51 text

Key小就是爽啦

Slide 52

Slide 52 text

下次也考慮下ECC系列吧

Slide 53

Slide 53 text

但如果Public端為嵌入式,則可考慮RSA

Slide 54

Slide 54 text

如果用ECDSA一定要記得

Slide 55

Slide 55 text

不要Sony

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

Sony進行PS3的ECDSA簽章時每次k都一樣

Slide 58

Slide 58 text

兩次k一樣的簽章 = 洩漏私鑰

Slide 59

Slide 59 text

RSA有Side Channel問題

Slide 60

Slide 60 text

想想Modular Exponentiation

Slide 61

Slide 61 text

def modexp( base, exp, mod ): out = base if (exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out

Slide 62

Slide 62 text

def modexp( base, exp, mod ): out = base if (exp[0] == 1) else 1 for i in range(1,len(exp)): out = (out * out) % mod; if exp[i] == 1: out = (out * base) % mod return out

Slide 63

Slide 63 text

量測CPU Cache Hit/執行時間/使用功率 可以看出這步有沒有執行

Slide 64

Slide 64 text

執行在同一顆CPU的其他程式或是對CPU 有實體權限的攻擊者有機會破密

Slide 65

Slide 65 text

RSA要避免類似Side channel較麻煩 ECC也有類似問題(Double or add)

Slide 66

Slide 66 text

進幾年HITCON有示範過

Slide 67

Slide 67 text

bit 0 1 2 3 4 ... 0 1 1 1 1 1 ... 1 M^1 M^2 M^4 M^8 M^16 ...

Slide 68

Slide 68 text

如果有這考量,可以用現成的Library, 或是用Ed25519

Slide 69

Slide 69 text

玩夠非對稱式的,來聊聊對稱式的吧

Slide 70

Slide 70 text

用過Stream Cipher吧?

Slide 71

Slide 71 text

RC4, OFB/CTR Mode的Block Cipher, Salsa20, ChaCha20

Slide 72

Slide 72 text

Stream Cipher的IV/Nounce每次加密一定 要不一樣,否則加密多少,就能解密多少

Slide 73

Slide 73 text

Win32/Dircrypt.A

Slide 74

Slide 74 text

如果有使用某些舊的Block Cipher, 需要注意Weak Key

Slide 75

Slide 75 text

尤其是Blowfish

Slide 76

Slide 76 text

AES沒這煩惱,把把都是好Key

Slide 77

Slide 77 text

Block Cipher跟RSA一樣不能單用

Slide 78

Slide 78 text

要搭配Cipher Mode of Operation

Slide 79

Slide 79 text

看維基百科秒懂

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

那不然要用什麼?

Slide 82

Slide 82 text

大多人會推薦CBC

Slide 83

Slide 83 text

Source: Wikipedia

Slide 84

Slide 84 text

但是CBC有Padding Oracle問題

Slide 85

Slide 85 text

解密時如果Padding不對,不能讓對方知道

Slide 86

Slide 86 text

if not VerifyPadding( … ): // ERROR return if not VerifyHMAC( … ): // ERROR return

Slide 87

Slide 87 text

除了CBC以外,還有什麼可以用?

Slide 88

Slide 88 text

看看Google用什麼吧

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

[問掛] 有沒有GCM的八卦

Slide 92

Slide 92 text

GCM其實很好用

Slide 93

Slide 93 text

內帶驗證,且效能高

Slide 94

Slide 94 text

考慮拿GCM取代CBC+HMAC

Slide 95

Slide 95 text

Hash

Slide 96

Slide 96 text

還在用md5的舉手

Slide 97

Slide 97 text

md5跟sha1都已經過時 讓他們安息吧

Slide 98

Slide 98 text

大家密碼都怎麼存?

Slide 99

Slide 99 text

a) 明碼 b) md5 c) sha1 d) sha256/sha512 e) md5+salt f) sha1+salt g) sha256/sha512+salt

Slide 100

Slide 100 text

salt可以避免Rainbow Table

Slide 101

Slide 101 text

不要再猜了,答案是以上階非

Slide 102

Slide 102 text

Source: https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073

Slide 103

Slide 103 text

hash的設計都是在安全的狀況下盡量快

Slide 104

Slide 104 text

所以要用另一類專門的函數 -- KDF

Slide 105

Slide 105 text

Key Derivation Function

Slide 106

Slide 106 text

設計就是要慢

Slide 107

Slide 107 text

Source: https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073

Slide 108

Slide 108 text

考慮使用PBKDF2, scrypt, bcrypt

Slide 109

Slide 109 text

內建Salt, 可調運算強度

Slide 110

Slide 110 text

純Hash不應該拿來做驗證

Slide 111

Slide 111 text

不少Hash有Length Extension的 bug feature

Slide 112

Slide 112 text

給H(A), 不知道A, 可以求H(A+B)

Slide 113

Slide 113 text

H(secret || msg) 不安全

Slide 114

Slide 114 text

如果有驗證需求,請用HMAC

Slide 115

Slide 115 text

HMAC = H( K1 || H(K2 || M) )

Slide 116

Slide 116 text

其他

Slide 117

Slide 117 text

亂數?

Slide 118

Slide 118 text

rand()

Slide 119

Slide 119 text

當然不是

Slide 120

Slide 120 text

如果需要少量的亂數(生Key) 就跟系統拿Entropy

Slide 121

Slide 121 text

*nix: /dev/random Win: RtlGenRandom()

Slide 122

Slide 122 text

/dev/random是稀有資源

Slide 123

Slide 123 text

urandom沒有快到哪裡去

Slide 124

Slide 124 text

需要大量亂數? 用entropy去seed PRNG

Slide 125

Slide 125 text

Hash_DBRG, CTR_DBRG

Slide 126

Slide 126 text

不要Dual_EC_DBRG

Slide 127

Slide 127 text

封包大小有Side Channel問題

Slide 128

Slide 128 text

透過ssh tunnel上網

Slide 129

Slide 129 text

Google 台科大官網

Slide 130

Slide 130 text

不難看出誰是誰

Slide 131

Slide 131 text

GFW就是這樣抓VPN的

Slide 132

Slide 132 text

若要避免,可以用obfs4/ScrambleSuit

Slide 133

Slide 133 text

語音也有一樣問題

Slide 134

Slide 134 text

No content

Slide 135

Slide 135 text

HTTPS很好用

Slide 136

Slide 136 text

但是它其實會洩漏Server的Domain

Slide 137

Slide 137 text

No content

Slide 138

Slide 138 text

最後,東西用完記得收

Slide 139

Slide 139 text

No content

Slide 140

Slide 140 text

有些勒索軟體可以用刪除復原/硬碟救援 工具還原

Slide 141

Slide 141 text

因為他們檔案用完沒有Shred

Slide 142

Slide 142 text

*nix: shred win: sdelete

Slide 143

Slide 143 text

記憶體也可能殘留,用完記得複寫再釋放

Slide 144

Slide 144 text

結論

Slide 145

Slide 145 text

能用現成整套的,就用

Slide 146

Slide 146 text

HTTPS/TLS, SSH, GnuPG

Slide 147

Slide 147 text

如果需要單獨使用密碼學的元素 請用現成Library

Slide 148

Slide 148 text

Crypto++, CryptoJS, libsodium… etc

Slide 149

Slide 149 text

END 謝謝大家

Slide 150

Slide 150 text

小抄/懶人包 1. 非對稱加密相關問題與建議 1a. 非對稱式加密應該搭配對稱式加密使用。 1b. RSA不能直接用,需要搭配專門的 Padding Scheme。 1c. RSA存在Weak Key。(Pollard p-1 Factorization, Shared Factor, Weiner)。 1d. 可以考慮ECC系列演算法,因為安全性下,需要較少運算。 1e. RSA跟ECC都存在Timing/Power Side Channel,如果要避免, 可以考慮Ed25519。 1f. ECDSA每次簽章的k必須隨機不重複。(PS3因此被破解) 1g. 簽章驗證應該依照標準檢測所有參數。 (ie. CVE-2016-1494) 2. 對稱演算法相關問題與建議 2a. Stream Cipher必須有Nounce,且必須每次不一樣。 2b. 部份Blocker Cipher有Weak Key。(例如Blowfish)。 2c. Block Cipher應注意Cipher Mode,不該單純用ECB。 2d. Block Cipher的Padding Oracle問題。 2e. Block Cipher Mode建議使用GCM模式,因為性能較優異且帶有驗證功能。 3. Hash相關問題與建議 3a. md5/sha1應淘汰。 3b. 密碼不應該用單純Hash存,應該使用PBKDF或scrypt。 3c. 注意Length Extension Attack,因此HMAC請照標準HMAC格式走。 4. 其他 4a. 亂數應該使用標準的亂數演算法 (NIST系列,DUAL_EC_DRBG除外)。 4b. 亂數應確保有足夠的Entropy。 4c. 封包的大小與Timing有Side Channel。 4d. 承4c,該漏洞可利用於破解通話加密,以及分析 TLS裡面瀏覽的網站內容。 4e. TLS有SNI會洩漏你瀏覽哪個網站。 4f. 除非必要,建議使用現成,常用的套件或協定 (ie. OpenSSL+TLS) 4g. 注意殘留,硬碟/記憶體需要Shred,如果使用現成套件,用完要釋放。