Timing-Attack
在這個版本的 libcrypt++ 中未能平方值是如何導致定時攻擊漏洞的?
我是加密初學者,正在閱讀有關致盲的知識,我對防止定時攻擊的基本理解是,您需要以一種為每組操作產生相似處理時間的方式對處理資訊進行排序。
在CVE-2015-2141中,像未能呼叫
r = modn.Square(r);
單個 func 這樣簡單的事情似乎在 2015 年導致了 libcrypt++ 中的定時攻擊漏洞。我對此有一個多部分的問題:
- 首先,您似乎需要一些特殊的輔助函式,旨在產生在每個子常式中呼叫的隨機計時結果以使函式失明,為什麼平方值的過程就足夠了?
- 其次,這個算法肯定有數百個常式,每次使用時都會被呼叫 - 似乎如果幾乎所有子常式都被蒙蔽,那麼僅一個蒙蔽的失敗不會洩漏足夠的時序資訊以導致整個函式容易受到定時攻擊,有人可以解釋一下嗎?
- 目標是讓每個子程序花費完全相同的時間來完成,還是隨機的不可預測的時間?為什麼我們不能將輔助函式呼叫粘貼到在安全隨機時間內執行的每個模組中,這樣發布的時間資訊就變得無用了?
在 CVE-2015-2141 中,像未能呼叫
r = modn.Square(r);
單個 func 這樣簡單的事情似乎在 2015 年導致了 libcrypt++ 中的定時攻擊漏洞。其實沒有。這不是 CVE-2015-2141 的意義所在。它實際上是關於循環最初沒有平方,這會導致有時在私鑰操作之後的後續步驟中沒有刪除盲點,這會在同一消息的大約 2 個簽名中洩漏足夠的資訊來恢復私鑰。
首先,您似乎需要一些特殊的輔助函式,旨在產生在每個子常式中呼叫的隨機計時結果以使函式失明,為什麼平方值的過程就足夠了?
這裡的致盲是通過以下事實來實現的:在 rabin-williams 中計算簽名“實際上等同於”計算消息的平方根。所以它有點像這樣:
- 挑選 $ r\gets_$ {1,…,n-1} $ , 計算 $ r^2\bmod n $ 和 $ r^{-1}\bmod n $
- 讓 $ m $ 成為消息,計算 $ m’=r^2\cdot m $
- 現在計算簽名 $ s’=\sqrt {m’}\bmod n=\sqrt {r^2\cdot m}\bmod n=r\cdot\sqrt {m}\bmod n $
- 最後解盲簽名恢復實際簽名 $ s=r^{-1}\cdot s’\bmod n $
現在這樣做的目的是防止攻擊者知道究竟應用了哪個值的私鑰操作,這應該可以阻止相當多的定時攻擊。
目標是讓每個子程序花費完全相同的時間來完成,還是隨機的不可預測的時間?
阻止定時攻擊的標準策略是
- 確保時間實際上並不取決於所討論的私人價值或
- 確保時間實際上並不以有意義的方式與已知輸入和/或私鑰相關聯。
將私鑰操作的輸入隨機化是第二種策略的一部分。