哈希函數的介紹:#
!
- 哈希函數是一種將任意長度輸入字符串映射到固定長度哈希值(有時稱為消息摘要)的高效可計算函數。不管輸入幾位,輸出都是 N bits。
- 哈希函數不是 keyed primitive 基於密鑰的原語。
哈希函數的應用#
包括 message fingerprinting 消息指紋生成、 file integrity checking 文件完整性檢查、signature schemes (hash-then-sign paradigm) 簽名方案(先哈希後簽名範式)、message authentication codes 消息認證碼(例如 HMAC)、key derivation 密鑰派生(例如,在 Diffie-Hellman 密鑰交換中從 “原始數據” 派生密鑰)、password hashing 密碼哈希、commitment schemes 承諾方案、pseudorandom number generators 伪隨機數生成器、stream ciphers 流密碼(計數器模式下的哈希函數)、bitcoin 比特幣(工作量證明方案)、post-quantum signature schemes 後量子簽名方案等。
哈希函數的標準:#
NIST 的 SHA-1(直到 2010 年)、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3(Keccak);NESSIE 的 SHA-2(SHA-256、SHA-384、SHA-512)、WHIRLPOOL;CRYPTREC 的 SHA-2(SHA-256、SHA-384、SHA-512)。
password hashing 密碼哈希#
加密散列函數可用於多種安全環境,但最著名的是密碼 hash。
- 伺服器中密碼是明文,伺服器被入侵直接洩漏,攻擊者冒充。
- 在數據庫中只存儲密碼哈希值。
- 為每個用戶存儲 H (password) 而不是密碼。
- 伺服器對收到的密碼進行 Hash,並與表進行比較。匹配成功則驗證成功。
- 直覺:攻擊者必須逆向散列才能恢復密碼。
Salting#
- 在每次散列計算中添加一個隨機的、賬戶專用的值,稱為鹽。
- 典型的鹽值為 64 位,足夠防止碰撞。
伺服器存儲 (salt, H (salt||password),而不是 H (Password),salt 時特定賬戶的隨機值。
Iteration#
- 典型的迭代次數: 10000,即每嘗試一個密碼都要算 10000 次,安全性更高。
哈希函數的安全屬性#
定理#
碰撞:hash 後的值相等,但 hash 前的值不等。
抗碰撞性意味著抗第二預映像性,任何 collision resistance 抗碰撞性的哈希函數都是 second pre-image resistance 抗第二預映像性的。
pre-image resistance 抗預像和 collision-resistance 抗碰撞#
-
pre-image resistance 抗預像(單向性):有 h 不能找到 m
-
second pre-image resistance 抗二次預像:給定 m1,若另一個 m2 的 hash 等於 m1 的 hash,m2 也不等於 m1
-
collision resistance 抗碰撞:在 m 對(pair)中,若有 H (m1)=H (m2),m1 也不等於 m2
-
Near-Collision Resistance: hash 值大部分相同的 m1 和 m2 也不相同,體現在信號中的公鑰驗證。
-
Partial Pre-Image Resistance 1:無法從給定 hash 值中恢復任何信息。
-
Partial Pre-Image Resistance 2:給定一個長度為 l 的 hash 值,無法在 2l 次嘗試內獲取到其 message。
對於在 t 時間內運行的所有 A,A 輸出碰撞的概率的邊界是 e
生日約束的含義#
-
N 位散列函數只能提供 N/2 位的安全性 *,以抵禦一般碰撞攻擊。e.g. 我們需要 256 位輸出的散列函數來實現 128 位的。
-
但目前還沒有比一般生日攻擊(2^128)更快的碰撞 inding 攻擊。
-
在某些成本模型中,攻擊成本為 2^(N/2) 個 "操作"+ 內存。
普通散列函數並不好用(對於加密來說!)。非加密哈希函數(在加密方面)很弱!#
Merkle-Damgård iterated hashing#
-
用壓縮函數 h 構建哈希函數。
-
將 message 分成固定長度為 k 的 blocks (e.g. m1
, m2
),其中包括了填充。 -
引入 IV 對 m1
進行hash。。。然後引入m2
重複步驟 -
如果壓縮函數 h 是抗碰撞的,那麼 H 也是抗碰撞的。
length-extension 長度擴展特性#
本來在 tu 就該輸出了,但作為輸入進入下一個塊了。
在某些應用中存在問題,如 MAC 或密鑰推導通過連接密鑰和信息,從散列值函數構造出的函數。
主要問題是散列輸出大小 = 區塊密碼塊大小,因此需要較大的塊大小 N,以避免 2N/2 生日攻擊。
從塊密碼構建壓縮函數#
Davies-Meyer 戴維斯 - 邁耶:#
連鎖變量變為信息輸入;信息輸入變為密鑰。
給出了一種抗碰撞。
SHA-2#
使用了戴維斯 - 邁耶模式的 256 位塊密碼建立壓縮功能。
速度是 SHA-1 的兩倍
SHA-3#
允許可變長度輸出,在密鑰推導等應用中非常有用。
SHA3-256 比 SHA-256 稍慢(10-15%)。
Public Key Encryption (PKE)#
公鑰加密技術的基礎是非對稱加密機制,與傳統的對稱加密不同,非對稱加密使用一對密鑰:公鑰和私鑰。公鑰用於加密信息,而私鑰用於解密信息,這兩個密鑰是數學上相關聯的,但是從公鑰不能輕易計算出私鑰,這就確保了信息傳輸的安全性。
三重算法:#
- KGen: 隨機 key pair (sk,pk) sk is private key, pk is public key
- Enc: 一般是隨機的,pk + m → c
- Dec: sk + c → m
![Screenshot_2024-03-15_at_03.28.22](https://file.yotroy.cool/Screenshot_2024-03-15_at_03.28.22.png?x-oss-process=style/1)
过程#
實際應用中不應該像教科書 RSA 這樣直接使用。
破解關鍵點#
- 不僅要保護秘密密鑰難以猜測,更要確保信息的機密性,更確切地說,是在選擇密文攻擊(IND-CCA)下的不可區分性。
- 即使敵手能夠獲取任意消息的解密,也不應該有任何關於明文的信息洩露給敵手。
- 敵手能夠訪問加密和解密的預言機,分別用於密鑰對 (sk, pk)。
- 敵手可以提交任意消息對 (m0, m1) 到加密預言機,並接收加密消息 c。
- 敵手還可以提交任意密文 c' 到解密預言機,並接收解密消息 Dec_sk (c')。
- 敵手的目標是恢復比特 b。
- 這個定義與 IND-CPA 的定義進行了比較,但敵手在這裡不能提交來自加密預言機的輸出,否則他們可以輕易地贏得比賽。
IND-CCA 選擇密文攻擊下的不可區分性#
Indistinguishable (IND) under Chosen Ciphertext Attack
(CCA)
- 如果攻擊者可以以某種方式從公鑰 (pk) 恢復私鑰 (sk),該 PKE 方案就不是 IND-CCA 安全的。
- 一個方案是 IND-CCA 安全的,它必然是 IND-CPA 安全的
- 如果一個 PKE 方案有一個確定性加密算法,它就不是 IND-CPA 安全
- 教科書中的 RSA 是確定性的,所以它既不是 IND-CPA 安全也不是 IND-CCA 安全。在現實應用中,RSA 需要採用像 OAEP 這樣的填充方案來增加隨機性,以達到 IND-CPA 和 IND-CCA 安全性。
使用例子#
RSA 因數分解,ElGamal 離散對數,McEliece 基於代碼的加密法,NTRUEncrypt 基於網格加密法
擅長?#
- PIN code 如支付用
- 比對稱加密貴
- PKE 通常用於傳輸對稱密鑰,用於加密批量或有效載荷數據。
- PKE 的這種用法通常被稱為混合加密。
- 對稱密鑰在對稱加密方案中用於加密實際數據。
關鍵封裝機制 KEM#
體現了在選擇密文攻擊(CCA)下的不可區分性(IND),也稱為 IND-CCA 安全性。
Hybrid Encryption 混合加密#
-
一般稱為 KEM/DEM 範式。
-
簡化了開發過程,因為開發者不需要配對加密原語,從而減少了複雜性和出錯的可能性。
-
它利用密鑰封裝機制(KEM)來安全傳輸一個對稱密鑰,以及數據封裝機制(DEM)來用對稱密鑰加密數據。
定理#
PKE 系統是從密鑰封裝機制(KEM)和數據封裝機制(DEM)構建的,如果 KEM 是抗選擇密文攻擊(IND-CCA)安全的,同時 DEM 也是 IND-CCA 安全的,那麼整個 PKE 系統也是 IND-CCA 安全的。
對稱加密方案的核心問題在於需要預先共享加密密鑰。為了解決這個難題,我們還有公鑰加密機制。通過將 PKE 作為密鑰封裝機制來形式化使用,並且建立了混合加密,使用 KEM/DEM 範式,並展示如何證明其安全性。簡要概括如下:
- 對稱加密(SE)需要提前分享密鑰,這在分佈式環境中是不方便的。這就是為何需要引入公鑰加密(PKE),它解決了密鑰分發的問題。
- 然而,PKE 相比於對稱加密來說計算成本很高。為了保持效率,我們使用 PKE 加密一個較短的密鑰,然後使用這個密鑰通過對稱加密(SE)來加密有效載荷數據。這種做法通常稱為混合加密。
- 我們將 PKE 的使用形式化為密鑰封裝機制(KEM),並通過 KEM/DEM 範式構建混合加密,並展示如何證明其安全性。
總結來說,混合加密結合了 PKE 的安全性和 SE 的效率,通過密鑰封裝和數據封裝兩個步驟,以安全且高效的方式傳輸加密密鑰和數據。