模板攻击

模板攻击是一种强大的侧信道攻击。它是“建模类”攻击(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\),使用对数结果便可做出正确且不存在精度问题的结论。

相关文章
相关标签/搜索