Ed25519

為什麼實現與定時攻擊相關?

  • July 6, 2021

來自備受推崇的來源(詳情如下)的討論強調了實施加密軟體對提供有效安全性的重要性,其中一個特殊情況是對定時攻擊的敏感性。


澄清 - 上下文是非秘密消息的加密簽名

@poncho 的初步回答指出,攻擊者並不總是能夠確定“使用者的”實現。

事實上,我對這個問題感興趣的正是攻擊者是使用者的非常真實的情況,並且有能力選擇他們自己的實現——在非秘密消息的加密簽名中。我在下面的引文是關於 NaCl 的,其中包括 ed25519 的實現。在我正在處理的案例中,您可以假設“攻擊者”/使用者擁有明文消息、簽名和公鑰。這三個對於簽名甚至是有用的都是必要的。他們唯一缺少的是私鑰。


這不是無關緊要嗎?從邏輯上講,如果算法本身能夠在比確認驗證成功所需的操作數更少的操作中辨識驗證失敗,那麼密碼算法本質上容易受到定時攻擊。可以在數學上確定驗證失敗的不同點越多,算法就越容易受到影響。

例如

  • 如果一個算法直到最後一步才能在數學上確定一組輸入的有效性,那麼它天生就不受時間攻擊的影響。據我了解,自FIPS-180-4 起,所有 NIST 批准的 SHA 算法都在該組中。
  • 如果一種算法可以在處理的某個流的每個增量字節/字/塊上以數學方式辨識無效輸入,那麼它對定時攻擊極為敏感。
  • 在最壞的情況下,確定成功或失敗所需的最小操作數取決於密鑰中的每個增量位。

任何給定實現避免或忽略算法對定時攻擊的潛在敏感性的能力在邏輯上是不相關的,因為**理性的攻擊者會簡單地選擇使用對定時攻擊有意敏感的實現。**即使大多數攻擊者缺乏編寫自己實現的技能或動力,也只需要一個人創建並分發一個強調定時攻擊的實現。

同樣,如果一個算法本質上不受定時攻擊的影響(例如,直到最後一步才能確定有效性或無效性),那麼根據定義,無論是有意還是無意地創建一個容易受到定時攻擊的實現都是不可能的。

作者可以為他們實現算法的任意數量的質量感到自豪,但“抵抗定時攻擊”似乎並不是一種具有邏輯意義的質量。

我在這裡錯過了什麼嗎?

參考:丹尼爾伯恩斯坦/氯化鈉

Daniel Bernstein 的原始NaCl 庫文件的特性部分,這是他和合著者發明的ed25519簽名算法的參考實現,多次聲稱其實現的優越性使其能夠抵抗定時攻擊(強調我的):

沒有依賴數據的分支

…文獻中有許多成功的定時攻擊範例,這些範例從 CPU 的這些部分中提取了密鑰。NaCl系統地避免了從秘密資訊到指令指針和分支預測器的所有數據流

沒有數據相關的數組索引

…文獻中有幾個成功的記憶體定時攻擊的例子,這些攻擊使用通過地址洩露的秘密資訊。NaCl 系統地避免了從秘密資訊到載入指令和儲存指令中使用的地址的所有數據流

這應該是一個(長)評論,但我沒有空間。它旨在解釋為什麼讓攻擊者選擇底層實現的想法太強了——它“微不足道”地破壞了任何原語。


對於任何密碼原語,如果攻擊者想要提取密鑰 $ k\in {0,1}^n $ 對於一些 $ n $ , 並且可以:

  1. 選擇任意消息(至少包含在 $ {0,\dots,n-1} $ ) 進入任何正在考慮的原語,
  2. 任意修改算法的實現(但不是算法實現的數學函式的輸入輸出行為)
  3. 可以使用任何質量方法來測量時間

修改算法的實現以完全洩露密鑰是非常簡單的 $ n $ 查詢。如果 $ \mathcal{O}(k, m) $ 是“舊”原語,通過以下方式定義“新”原語:

O'(k, m)
   if m in {0,...,n-1} and k[m] == 1:
       wait(T)
   return O(k, m)

在這裡,T 是一些未指定的常數,它“足夠大”,以便攻擊者可以可靠地測量算法之間的差異 $ \ll T $ 時間,或 $ \approx T $ 執行的時間。 $ \mathcal{O}’ $ 顯然具有完全相同的輸入輸出行為 $ \mathcal{O} $ .


上面的例子應該表明,讓攻擊者選擇實現是一個巨大的安全問題,即使限制實現與所需功能具有完全相同的輸入/輸出行為。因此,“數學上容易受到定時攻擊”的定義並不明確,因為任何依賴“秘密”數據的算法都容易受到上述攻擊。

但這並不是一個真正的問題,因為讓攻擊者選擇所使用的算法在實踐中並不被視為一個大問題(它可能真正發生的唯一一次是在“後門標準委員會”類型的攻擊中,比如 DUEL_EC_DRBG 發生了什麼,但計時後門似乎比“我知道密鑰”後門更糟糕,因為其他人可能更容易觀察到計時後門)。

雖然“易受定時攻擊”沒有明確定義,但有些原語更難以恆定時間的方式實現。這通常意味著以下兩件事之一:

  1. 從非常數時間轉換到恆定時間的成本很大
  2. 從非常數時間到常數時間的轉換很容易出錯。

但是,這些不是問題的形式屬性,而是從業者的經驗觀察。第一個問題可能能夠被形式化(具體來說,在最小尺寸的電路計算東西和 RAM 模型中最小尺寸的 TM 計算東西之間存在很大差距),但我通常不會看到人們嘗試這樣做(實施者似乎並不感興趣)。

這不是無關緊要嗎?從邏輯上講,如果算法本身能夠在比確認驗證成功所需的操作數更少的操作中辨識驗證失敗,那麼密碼算法本質上容易受到定時攻擊。

實施非常相關;任何在有限時間內完成的算法都可以以恆定時間/恆定記憶體訪問方式實現;因此,任何此類算法都可以安全地實施以抵禦這些側通道攻擊。當然,有些算法使這樣的實現變得容易,而另一些算法則非常昂貴。

如果一個算法在最後一步之前無法在數學上確定一組輸入的有效性,那麼它天生就不會受到定時攻擊。

實際上,實現可能需要時間,具體取決於密鑰或秘密中間值。

如果一種算法可以在處理的某個流的每個增量字節/字/塊上以數學方式辨識無效輸入,那麼它對定時攻擊極為敏感。

不; 實現可能決定提前中止,或者它可能設置一個內部“失敗”標誌並繼續(最後,請注意設置了失敗標誌,並在該點處理失敗),是的,設置失敗標誌可以在恆定時間內完成。使用最後檢查的失敗標誌對於恆定時間實現非常常見。

理性的攻擊者會簡單地選擇使用對定時攻擊有意敏感的實現。

如果攻擊者正在攻擊使用者的系統(可以訪問秘密值),他不能要求使用者更改為更方便(對攻擊者而言)的實現;他必須使用使用者擁有的東西。

如果算法本質上不受定時攻擊的影響(例如,直到最後一步才能確定有效性或無效性),那麼根據定義,無論是有意還是無意地創建一個容易受到定時攻擊的實現都是不可能的。

不,這不是真的;您可以輕鬆引入與有效性或無效性無關的時間變化。

如果攻擊者可以指定使用者擁有的實現,他可以(比如說)指定一個在秘密值的位 0 為 1 時需要額外一秒鐘的實現——這很容易檢測到。並且,通過指定 $ n $ 不同的實現,他可以閱讀所有 $ n $ 秘密值的位-因此,在此攻擊模型中,沒有安全性可能(這意味著使用者可能不想盲目地信任攻擊者提供的實現)。

當然,如果攻擊者在自己的系統上工作,他可以​​隨心所欲地執行;當然,由於他的系統沒有秘密值,因此該實現中的任何旁道都不會告訴他任何他不知道的事情。

引用自:https://crypto.stackexchange.com/questions/91913