針對 RSA、DH 和 AES 的定時攻擊
我一直在閱讀Wing H. Wong 的“對 RSA 的時間攻擊:通過第四維度揭示你的秘密”。我想知道在使用 RSA簽名時這種攻擊是否可行,如果是,如何?
另外,這種攻擊是如何與 DH 一起應用的?
泛泛地談論定時攻擊,AES以何種方式受到影響以及如何解決?(我的意思是,對於 RSA,“問題”在乘法級別,而對於 AES,導緻密碼實現密鑰或數據依賴的問題在哪裡?)
關於定時攻擊的開創性論文是Paul C. Kocher,‘Timing Attacks on Implementations of Diffie–Hellman、RSA、DSS 和其他系統’,CRYPTO 1996,Springer LNCS 1109,1996(如果您遇到付費牆,請使用備用連結)。這也是標準參考,而且很容易理解——我建議閱讀它。這是一個粗略的高級概述。
RSA 和 DH 的基本思想是測量模冪運算需要多長時間作為秘密指數的函式。
您如何使用RSA 加密來做到這一點?找到一個自動化系統,它可以解密並將答案發回給你,並向它發送一長串消息,並測量解密每個消息需要多長時間。加密計算本身的任何時間變化——一旦你從網路和其他來源中隔離了雜訊——很可能由模冪計算的時間變化支配 $ m = c^d \pmod n $ 為秘密 $ d $ , 在幼稚的 RSA 實現中。(這裡 $ n $ 是公鑰, $ c $ 是密文代表,並且 $ m $ 是(比如)RSAES-OAEP 的填充明文代表,或 RSA-KEM 的密鑰種子。)
你如何用RSA 簽名做到這一點?找到一個自動化系統,該系統可以簽名並將簽名發送回您——不是您想要的任何文件上的簽名,而是合法簽名者想要簽名的文件上的簽名。例如,像 Let’s Encrypt 這樣的 HTTPS 證書頒發機構將執行此操作。向它發送一長串簽名請求,並測量簽署它們需要多長時間。同樣,時間變化很可能由模冪計算中的時間變化支配 $ s = h^d \pmod n $ 為秘密 $ d $ , 在幼稚的 RSA 實現中。(這裡 $ h $ 是消息雜湊,並且 $ s $ 是簽名。)
您如何使用Diffie-Hellman做到這一點?找到一個自動化系統,該系統使用靜態密鑰執行 DH 密鑰協議,並要求它與您選擇的公鑰進行一長串密鑰協議。再一次,時間變化很可能由模冪計算中的時間變化支配 $ k = B^a \pmod p $ 在哪裡 $ a $ 是靜態秘密和 $ B $ 是攻擊者的臨時公鑰。
你如何用AES做到這一點?這有點不同,Kocher 的論文除了隨便提及之外並沒有詳細說明。這裡的標準參考是Daniel J. Bernstein,“對 AES 的記憶體定時攻擊”,文件 ID:cd9faae9bd5308c440df50fc26a517b4, 2005-04-14。它也相當平易近人。粗略的高級概述是 CPU 載入數組元素所花費的時間取決於記憶體中的該位置是否已被記憶體。通過研究 S-box 的哪些元素通常不會在計算中的某個點進行記憶體,從而產生 $ S[k_i \oplus p_i] $ ,並研究哪些明文字節 $ p_i $ 導致計算花費的時間最多,我們可以推導出密鑰字節 $ k_i $ ,並為所有其他人重複。
除了模冪運算之外,還有對基於 RSA 的密碼系統的其他部分的側通道攻擊,例如Bleichenbacher 對 PKCS#1 v1.5 的攻擊,它利用構成秘密消息代表的有效填充的字節的側通道來啟用對手在沒有私鑰的情況下解密或簽署消息。此側通道可能表現為不同的錯誤消息,或響應時間的變化,這將想法擴展到 RSAES-OAEP(免付費預印本),即 PKCS#1 v1.5 加密的後續版本。此類側通道中的攻擊,填充預言機攻擊,也適用於其他情況,例如幸運十三攻擊關於 TLS 中分組密碼的 CBC 模式。
當然,定時攻擊的主題還有其他變體:例如 ,利用超執行緒中的記憶體共享通過 L2 記憶體從 Intel CPU 上的另一個超執行緒中恢復密鑰,刷新+重新載入攻擊通過 L3 記憶體恢復密鑰,阻止簡單的 RSA 計時對策的記憶體計時攻擊,使用麥克風的聲學密碼分析來聽到密碼算法中依賴於秘密的計時產生的聲音頻譜的變化,等等。
我一直在想同樣的事情,目前正在調查這個問題。從 2013 年開始,有一個名為“零夜”的會議,其中一位演講者 - Roman Korkikyan - 談到了這一點(幻燈片和筆記可線上獲得)。根據我對他的解釋的理解,時序攻擊發生在 AES 的混合列層——我們有二進制乘法,在我看來,這本質上取決於輸入(0 或 1),這引入了時序攻擊。我仍在研究這一點,如果尋找可以避免這種情況的方法,並將讓您隨時了解我的進展。