模板攻擊

模板攻擊是一種強大的側信道攻擊。它是「建模類」攻擊(profiling attack)的一種,所謂建模類攻擊,是指攻擊者會在目標設備的同類型設備或者其複製品上建立一個"profile",隨後利用這一"profile"快速恢復目標設備的密鑰。python

相較於CPA,模板攻擊對攻擊者的要求更高。攻擊者須要對目標設備的複製品具備徹底的控制權,而且進行大量的前期工做以創建模板,不過,一旦模板創建,攻擊者可以以很小的代價完成攻擊。在模板足夠好的狀況下(如建模所用的能量跡數量足夠大),攻擊者僅需一條能量跡便可恢復密鑰。(下文中以「曲線」一詞替代「能量跡」)算法

模板攻擊分爲如下四步:app

  1. 利用一個能夠徹底控制的目標設備的複製品,使用不一樣的輸入(明文和密鑰)進行計算並採集曲線,確保採集的曲線足夠提供給攻擊者每一種密鑰猜想對應的信息
  2. 建立模板,模板是一種POIs(points of interest)的多元分佈
  3. 在目標設備上,使用少許的不一樣明文加密獲取相應的曲線(目標設備的密鑰不受攻擊者控制)
  4. 利用模板進行攻擊,找到最可能正確的密鑰猜想值

本文譯自http://wiki.newae.com/Template_Attacks函數

信號、噪聲和統計學

開始討論模板攻擊的細節前,理解其涉及的統計學概念是很是重要的。所謂模板就是一種描述曲線上關鍵點的多元分佈。這一部分就是介紹何爲多元分佈以及它是如何在側信道這一背景下使用的。加密

噪聲分佈

電信號是內在的噪聲。不管什麼時候咱們進行電壓測量,咱們都不會看到一個完美、恆定的結果。例如,若是咱們把萬用表接到一個5V的電源上並進行4次測量,獲得的結果更多是相似於(4.9五、5.0一、5.0六、4.98)這樣,能夠考慮用以下方式對這一電壓建模:spa

\[\boldsymbol{X} = X_{actual}+\boldsymbol{N} \]

其中,\(X_{actual}\)表明無噪聲的電壓測量,\(\boldsymbol{N}\)表明額外的噪聲。在上面的例子中,\(X_{actual}\)爲5V。\(\boldsymbol{N}\)爲隨機變量,每次測量的結果都不一樣。注:\(\boldsymbol{N}、\boldsymbol{X}\)加粗表示它們是隨機變量。3d

高斯分佈(即正態分佈)是一種能夠用來描述這些隨機變量的模型。高斯分佈的機率密度函數(PDF)是:rest

\[f(x) = \frac{1}{\sigma \sqrt{2 \pi}}e^{-(x-\mu)^2/2\sigma^2} \]

其中, \(\mu\)表示平均值、\(\sigma\)表示標準差。如在上面的例子中,若是均值爲5,標準差爲0.5,那麼它對應的機率密度函數爲orm

Normal-Dist.png

咱們能夠利用機率密度函數來評估一個測量值出現的可能性,如:blog

 f(5.1) \approx 0.7821

 f(7.0) \approx 0.0003

因而可知,測量結果爲7V的機率是極小的。咱們將這一特色應用在模板攻擊中,若是某一個密鑰猜想對應的機率密度值較小,那它極有多是錯誤的。

多元統計

上面的例子告訴咱們,對於一個值的測量來說一元高斯分佈可以有很好的表現,但若是咱們須要同時處理多個隨機變量呢?

假設咱們正在測量兩個夾雜着噪聲的電壓源,記爲\(\boldsymbol{X}、 \boldsymbol{Y}\),其中,\(\boldsymbol{X}\)符合正態分佈,\(\boldsymbol{Y}\)符合另外一種分佈。然而,這不必定是有效的。若是兩者遵循不一樣的分佈,,那咱們則認爲這兩者是獨立的,即當\(\boldsymbol{X}\)發生變化時,\(\boldsymbol{Y}\)不必定會隨之變化。

多元分佈可以幫助咱們對相關或不相關的多個隨機變量進行建模。在多元分佈中,再也不使用方差,而是使用一個協方差矩陣。例如,對三個隨機變量(\(\boldsymbol{X}, \boldsymbol{Y}, \boldsymbol{Z}\))建模,該協方差矩陣爲:

協方差

相應地,這種分佈要求每個隨機變量都有一個平均值:

平均值

多元分佈的機率密度函數要更復雜一些:再也不使用單個數做爲參數,而是使用一個包含所有變量的向量\(\boldsymbol{x}=[x, y, z,...]^T\)。k個隨機變量的機率密度函數爲:

多元分佈機率密度函數

若是以爲這個公式太複雜了,不用擔憂,python中的scipy科學計算包已經給咱們提供了底層的實現。上一部分中咱們將單個值輸入機率密度函數獲得了對應的測量出現的可能性。換句話說,只要將曲線上的點(POIs)放入\(\boldsymbol{x}\)中進行計算,那麼\(f(x)\)就能告訴咱們這一密鑰猜想正確的可能性了。

建立模板

模板是多個機率分佈的集合,每一個機率分佈描述了一個密鑰可能對應的曲線的樣子。也能夠這麼說:「若是你使用了密鑰\(k\),那麼你的能量曲線會符合\(f_k(\boldsymbol{x})\)。」利用這一性質,咱們就能夠區分能量曲線之間的細微不一樣,並做出準確的密鑰猜想。

曲線數量

模板攻擊的一大缺點就在於在開始攻擊前攻擊者須要收集大量的曲線用於建模階段。這是由於要對每個可能的密鑰都能獲得一個好的模型,就須要對每一個可能的密鑰都收集足夠多的曲線用以建模。例如,若是要攻擊AES-128的子密鑰(一次S盒操做用到的一個字節),就須要對0-255這256個可能的值分別建模。因此,每每咱們須要上萬的曲線才能在建模階段有一個好的結果。

固然,若是咱們不對每一個可能的密鑰值建模,而是對密鑰的漢明重量建模,一樣在AES-128的狀況下,只須要0-8共9個模型便可,須要的曲線數量大大減小。不過,這樣作缺點也很明顯,再也不能使用單條曲線便可恢復密鑰,還須要一些其餘的信息。

Points of Interest

咱們的目標是建立多元機率分佈來描述每個可能的密鑰對應的曲線。若是咱們用這種方式對整個曲線(若有3000個點)建模,那麼就須要一個3000維的分佈。這是很誇張的,因此咱們須要一種更好的方式來替代它。好消息是,並非曲線上的每個點對咱們都有用,緣由以下:

  • 每一個時鐘週期可能會取樣屢次。所以咱們能夠從一個適當的點獲取大量的信息而無需處理曲線上全部的點
  • 私鑰不必定會影響整條曲線,它可能隻影響曲線的一些關鍵部位。找出這些部位,咱們就能夠捨棄掉無關的點

這兩點意味着咱們能夠從曲線中選擇最重要的3-5個點做爲POIs(points of interest),若是咱們能夠選出這些點,那麼就可使用一個3維到5維的分佈來描述曲線,相較於3000維這是一個很是大的提高。

如何選擇POIs

有不少種選擇POIs的方法,主要目標是找到在操做數不一樣(不一樣的密鑰或漢明重量)的曲線上差別較大的點。這裏介紹最簡單的方法--差值求和。

  • 對於每個操做數\(k\)對應的曲線上的第\(i\)個點求平均值\(M_{k,i}\),例如當咱們採集到使用密鑰\(k\)進行加密的\(T_k\)條曲線後,就會有\(M_{k,i} = \frac{1}{T_k}\sum_{j=1}^{T_k}{t_{j,i}}\)
  • 求得每一個\(k\)的均值後,兩兩做差,並對這些差值求和。這將會獲得一條有尖峯的曲線(以下圖),尖峯處即爲上面提到的差別大的點。計算方式爲\(D_i = \sum_{k_1, k_2} |M_{k_1, i}, M_{k_2, i}|\)

Template-Sum-Of-Difference.png

  • 尖峯位置即爲重要的點,但考慮到上一部分中的第一條,相鄰很近的尖峯咱們須要捨棄一部分。下面這個算法能夠幫咱們選擇最終的POIs:
    • 選擇最高的尖峯,並將其索引選爲一個POI
    • 捨棄最近的N個點(N爲POIs之間的最小距離)
    • 重複前面兩個步驟直至選取足夠的POIs

分析數據

假設咱們已經肯定了I個POIs,記爲\(s_i,(0<=i<I)\)。那麼咱們下面的任務就是爲每個候選的子密鑰或者中間值的漢明權重求得一個均值和一個協方差矩陣,設共有K個候選項。

對一個單獨的候選項\(k\)而言,步驟以下:

  • 獲取\(k\)對應的全部曲線,共\(T_k\)條,則\(t_{j,s_i}\)表示第\(j\)條曲線第\(s_i\) 個POI的值

  • 計算每一個POI的值的均值\(\mu_i\)

    \[\mu_i = \frac{1}{T_k}\sum_{j=1}^{T_k}t_{j, s_i} \]

  • 計算每一個POI的值的方差\(v_i\)

    \[v_i = \frac{1}{T_k}\sum_{j=1}^{T_k}(t_{j, s_i}-\mu_i)^2 \]

  • 計算每個POI點對(\(i、i^*\))的協方差\(c_{i,i^*}\)

    \[c_{i,i^*}=\frac{1}{T_k}\sum_{j=1}^{T_k}(t_{j, s_i}-\mu_i)(t_{j,s_i^*}-\mu_i^*) \]

  • 獲得均值向量和協方差矩陣

對每一個\(k\)都執行一遍上述操做,咱們就完成了對\(K\)個候選者的建模工做

使用模板

建模完成後,就能夠開始進行攻擊了。完成攻擊須要若干條曲線,設該值爲\(A\),那麼\(a_{j,s_i},(1<=j<=A)\)就表示第\(j\)條曲線的第\(i\)個POI的值。

應用模板

首先咱們嘗試將上一節中創建的模板應用在單條曲線上,目標是獲得全部密鑰猜想的可能性。

  • 將POIs的值放入向量,獲得
  • 計算每一個密鑰猜想的機率密度函數(PDF):\(p_{k,j} = f_k(a_j)\)
  • 對每一條曲線重複上述步驟

這部分操做獲得一系列的\(p_{k,j}\),表明第\(j\)條曲線表示的候選者是\(k\)的機率

組合結果

最後一步就是根據全部的\(p_{k,j}\)判斷哪一個密鑰猜想更多是最終的答案。最簡單的方法就是:

\[P_k = \prod_{j=1}^Ap_{k,j} \]

例如,若是咱們的一個密鑰猜想爲0x00,而且三條曲線對應的機率密度爲(0.9, 0.95, 0.8),那麼計算結果會是0.684。只要有一條曲線不符合模板,就會使得最終值迅速降低,這很是有助於咱們消除錯誤選項。最終,咱們選擇\(P_k\)值最高的\(k\)做爲攻擊結果。

這種將每條曲線的結果直接組合起來的方法容易出現精度問題。將不少數相乘後,最終獲得的結果可能超出了浮點數的表示範圍,形成精度問題。一個很是簡單的解決方法就是使用對數。使用以下方法:

\[\log{P_k} = \sum_{j=1}^{A}\log{p_{k,j}} \]

代替直接計算\(P_k\),使用對數結果便可做出正確且不存在精度問題的結論。

相關文章
相關標籤/搜索