AES S-Box 能抵抗側通道攻擊嗎?
我知道使用諸如 Golang 之類的 T 表的實現很容易受到側通道攻擊,但是沒有任何附加表的 AES 的 S-Box 也是不安全的嗎?
我假設問題是’假設您有一個使用預先計算的 SBOX 表(並且沒有其他表)的 AES 實現;我們可以使用定時或記憶體側通道進行密鑰恢復攻擊嗎?
這個問題的答案是“是的(至少有可能;我們必須對 CPU 硬體做出一些假設;至少,如果它確實有記憶體)”
這是一個簡單(且看似合理)的場景,其中一些關鍵位很容易恢復(實際上,我們可以將它們全部恢復,但這需要更多解釋)
假設我們在一個具有 16 字節高速記憶體行的 CPU 上(也就是說,高速記憶體將內容儲存在 16 字節塊中;如果 CPU 讀取一個位置,記憶體控制器將讀取該塊的所有 16 個字節)。我們還假設 sbox 恰好在 16 字節邊界對齊(因此它佔用 16 個記憶體行)——實際上,如果它沒有對齊,它會更容易被利用;但是現在,我們假設對齊。
而且,對於我們基於記憶體的側通道,我們可以刷新記憶體,呈現一個明文塊,要求 AES 對其進行加密,然後檢查記憶體以查看 sbox 的哪些記憶體行被讀取。我將介紹時間基於以下攻擊的版本。
以下是攻擊的工作原理:我們刷新記憶體,並呈現一個隨機明文,執行它,然後查看 sbox 佔用了哪些記憶體行。AES 處理執行 160 個 sbox 引用(假設 AES-128);如果我們將每個引用建模為隨機,那麼我們有大約 2000 分之一的機會存在一些 160 次讀取中沒有引用的 sbox 記憶體行。現在,如果(比如說)對應於 5X 個條目的記憶體行(即,高 nybble 為 5 的 sbox 索引),那麼我們可以推斷它在初始輪中從未被引用;也就是說,對於每個字節 $ B_i $ 明文和每個密鑰字節 $ K_i $ , 我們有 $ B_i \oplus K_i \ne 5X $ ; 也就是說,我們可以推斷出每個關鍵字節的高半字節不是什麼。
我們可以重複這個過程,直到我們消除了每個密鑰字節的高 nybble 的所有可能性,除了正確的字節——這給了我們一半的密鑰。而且,這可能需要 30,000 或 50,000 次探測(在某種程度上取決於我們是選擇明文還是讓其他人隨機生成)。而且,恢復較低的 nybble 也很容易(例如,依靠第二輪 sbox 引用);那需要更多的解釋。
至於如何將其轉換為定時攻擊(使用相同的基本假設,除了攻擊者無法確定 AES 操作後記憶體中的記憶體行,但可以測量時間),我們可以執行相同的基本攻擊,但是在AES操作之前,我們設置了記憶體,使sbox內的15個記憶體行在記憶體中,1行不在,然後執行AES操作。如果引用了 1 行,CPU 會將該行讀入記憶體(這是一項昂貴的操作;CPU 製造商包含記憶體是有原因的),這會顯著增加時間。通過測量時間,我們可以推斷是否引用了該記憶體行,因此我們可以繼續進行相同的攻擊(儘管需要更多的探測;我們正在獲取有關是否讀取了特定記憶體行的數據,