rsa 模数 指数转换 c语言_OneDone:针对OpenSSL的恒定时间盲RSA的基于单解密EM的攻击(上)...

0摘要

本文提出了一种不依赖高速缓存组织和/或定时的第一侧信道攻击方法,在RSA(当前版本的OpenSSL)固定窗口常数时间实现中,从对任意密文的单个解密中检索秘密指数。具体地,攻击从处理器在执行构造指数中每个“窗口”的值的恒定时间代码时无意产生的模拟信号中恢复在模块化求幂期间的指数位,而不是对应于乘法表查找操作期间的平方/乘法操作和/或缓存行为的信号。使用电磁(EM)发射演示两种移动电话和嵌入式系统的方法, 并且在固定窗口RSA实现中仅进行一次解密之后,它恢复足够的秘密指数位,从而能够非常有效(在几秒钟内)重构完全私有RSA密钥。由于密文的值与我们的攻击无关,所以即使当密文未知和/或当使用消息随机化(盲)时,攻击也是成功的。我们的评估使用在处理器的时钟频率(大约1GHz)附近从相对窄的频带(40MHz)解调信号获得的信号,该频率在紧凑的1000美元以下的软件无线电(SDR)接收机的能力范围内。最后,我们提出一种简化方法,其中指数位仅从整数组(几十位)中的指数获得,而不是一次获得1位。这种减轻是有效的,因为它迫使攻击者试图从单个简短的信号片段中恢复数十位,而不是为每个单独的比特单独设置信号片段。此缓解措施已提交OpenSSL,并在本文发表之前合并到其主源代码分支中。

1介绍

旁路攻击在计算设备执行计算时从计算设备内的电子活动产生的信号中提取敏感信息,例如密码密钥。这些信号包括由器件的计算和功率传输电路内的电流流[2,3,14,21,33,46]产生的电磁辐射,功耗的变化[9,12,15,17,23,26,34,35,36,41],以及声音[6,16,24,42],温度[13,29],以及底盘电位变化[23],其主要可归因于功耗的变化及其与系统的电力输送电路的相互作用。最后,并非所有的旁路攻击都使用模拟信号:一些使用故障[11,25]、缓存[8,43,44]、分支预测器[1]等。物理侧信道攻击的研究大多集中在相对简单的设备上,如智能卡和简单的嵌入式系统,其中,可以以比目标处理器和其他相关电路(例如,用于加密/解密的硬件加速器)的时钟速率高得多的带宽来获取侧信道信号,并且通常具有对设备的高度侵入性访问,例如将小探针直接放置在芯片的封装[19,35]上。最近,对诸如智能手机和PC等更高时钟速率设备的攻击已经被证明[ 7, 20, 21,22 ]。它们已经表明,即使以比处理器的(千兆赫范围)时钟速率低得多的带宽来获取信号,以较少的侵入性访问设备,并且即使具有先进的面向性能的特性,物理侧信道攻击也是可能的,例如超标量(每个周期多个指令)执行和指令调度,以及系统软件活动,例如中断和多处理,在密码活动期间产生的信号的形状和时间上造成显著变化。为了克服低带宽和变化的问题,对高时钟速率系统的成功攻击往往集中在与需要许多处理器周期的活动相对应的部分信号上。一个典型的例子是RSA中的解密,它由密文的模幂和从私钥导出的指数组成。攻击者的目标是通过旁路分析恢复该秘密指数的足够位,并使用该信息计算秘密密钥的其余部分。大整数模幂运算中的大部分计算活动都用于乘法和平方运算,其中每个平方(或乘法)运算对大整数进行运算,因此需要许多处理器周期。先前对RSA的物理侧信道攻击依赖于对与大整数平方相对应的信号进行分类,以及当执行大整数指数化时,一起表示绝大多数计算工作的乘法运算[10、20、23、24]。在这些长时间的平方运算和乘法运算之间,需要很少的处理器指令来获得秘密指数的下一位(或一组位)并使用它来选择下一个大整数运算是平方运算还是乘法运算,和/或哪些操作数提供给该操作。考虑到旁路攻击最终通过识别信号样本的相关子序列并评估每个子序列的可能类别中的哪一个是最佳匹配来恢复信息,因此关注长时间操作是可以理解的。对应于大整数运算的子序列产生样本的长子序列,因此它们1)在对应于整个指数化的整个样本序列中更容易识别,和2)提供足够的信号样本用于成功分类,即使在使用相对低的采样率时。然而,这些大整数操作中的操作数在所执行的指令序列方面都是非常规则的,并且这些指令中使用的操作数是依赖于密文的,因此,除非1)平方运算和乘法运算的序列是依赖于密钥的,或者2)攻击者可以控制将被指数化的密文,否则根据指数相关特性对信号进行分类是困难的,以及选择密文,其方式为每个可能的与指数相关的操作数选择产生系统不同的侧信道信号。

1.1 我们的工作

在本文中,我们提出了一种侧信道攻击,它基于对与计算每个窗口在指数化期间的值的简单计算活动相对应的信号的分析,即,大整数乘法之间的活动,与关注大整数乘法本身和/或获得计算窗口值的乘数的表查找的大多数先前工作相反。这些窗口值计算的短时间可能会在某种程度上阻碍基于信号的分类。然而,这些计算操作的值与保密文本的各个比特相关,而不是与消息(密文)相关。这种没有消息引起的变化允许由单个指数位的不同值引起的小变化在信号中“突出”,并且与来自训练的信号精确匹配。更重要的是,这种消息无关性使得新的攻击完全不受现有对策的影响,现有对策侧重于阻止选择密文攻击和/或平方/乘序列分析。对两个基于Android的移动电话和一个嵌入式系统板进行了实验评估,所有的ARM处理器都工作在高(800MHz到1.1GHz)频率下,并且信号是在40MHz频带内全天候采集的,导致采样率小于处理器时钟频率的5%,并且很好地在紧凑型商用1000美元以下软件定义无线电(SDR)接收机(例如Ettus B200-mini)的信号捕获能力之内。我们的目标RSA实现是OpenSSL[38]版本1.1.0g中使用的固定时间固定窗口实现,这是撰写本文时OpenSSL的最新版本。我们的结果表明,我们的攻击方法从RSA解密的单个实例的信号中正确恢复出95.7%-99.6%(取决于目标系统)的秘密指数位,并且我们进一步验证在我们的实验中来自RSA加密/签名的每个实例的信息足以快速地(平均 < 1秒的执行时间)完全重构所使用的私有RSA密钥。为了进一步评估我们的攻击方法,我们将其应用于OpenSSL中模块幂的滑动窗口实现——这是OpenSSL中的默认实现,直到Percival等人在[39 ]中证明了它的密钥依赖平方/乘法序列易受侧信道攻击。我们展示在这个实现中,我们的方法还从该秘密指数的一次使用(指数化)中恢复几乎所有的秘密指数位。为了减轻我们的攻击方法暴露的侧信道漏洞,我们改变窗口值计算以从指数获得完整的整数位值,然后屏蔽该值以获得窗口值,而不是用这些1位窗口值更新之间的大量Montgomery乘法一次构造一个窗口值。这种缓和使得在简短窗口计算期间的信号变化依赖于作为组的指数的几十位,也就是说,在窗口计算期间由指数中的一个比特引入的信号变化现在被叠加到组中的其他比特引入的变化上,而不是将每个比特的变化单独地包含在其自身的信号片段中。我们的实验表明,这种减轻实际上稍微提高了指数化性能,更重要的是,通过这种减轻,指数位的恢复率变得等同于随机猜测。此缓解措施已提交OpenSSL,并在本文发表之前,于2018年5月30日合并到其主源代码分支中。

1.2 威胁模型

1.2.1 假设

我们的攻击模型假设有一个对手希望获得用于基于RSA的公钥加密或认证的密钥。我们进一步假设对手可以将相对紧凑的接收机带到执行RSA秘密密钥操作的系统附近,例如,智能基础设施或智能城市设备,其使用公钥基础设施(PKI)对自身进行身份验证并保护其在因特网上的通信,以及位于公共位置,或者敌方可以将相对紧凑的接收机隐藏在系统可以被放置在其附近的位置,例如,在公共位置的手机充电站下,在咖啡店的桌面表面下,等等。我们假设对手可以访问与被攻击的设备类型相同的另一设备,这是上述大多数攻击场景中高度现实的假设,并且使用已知的密钥执行RSA解密/认证,以准备攻击。与许多先前对RSA的攻击不同,我们不认为对手可以选择(或甚至知道)将应用私钥的消息(RSA解密的密文),并且我们进一步假设在攻击下的RSA实现确实利用盲法来防止这样选择的密文攻击。最后,我们假设攻击者在目标设备上仅使用很少的密钥(理想情况下仅使用一次)之后就恢复秘密密钥是非常理想的。这是一个非常现实的假设,因为PKI通常仅用于建立安全连接,通常用于建立通信方的真实性和建立对称加密会话密钥,因此,在攻击者的接收机只能在有限的时间内接近目标设备的情况下,可以观察到很少使用私有RSA密钥。

1.2.2 目标软件 我们的目标是OpenSSL版本1.1.0g [ 38 ],这是本文撰写的OpenSSL的最新版本。其RSA解密使用常数时间固定窗口大数模幂来减轻基于定时的攻击和利用平方乘法序列中指数相关变化的攻击。用于更新每个窗口末尾结果的查找表以分散的形式存储,以减轻在读取这些表时检查缓存和内存行为的攻击,RSA实现支持盲(我们在实验中打开)来减轻所选择的密文攻击。
1.2.3 目标硬件
我们瞄准的硬件是两款基于Android的现代智能手机和基于Linux的嵌入式系统板,所有的ARM处理器频率都在1GHz左右。在我们的实验中,我们放置探针非常接近,但是与电话的(未打开的)情况没有物理接触,而对于嵌入式系统板,我们将探针定位在离板20cm处,因此我们考虑所演示的攻击是近距离的,但非侵入性的。
1.2.4 缓解现状
本文中描述的缓解已被提交为一个补丁,以集成到OpenSSL的主要分支。该补丁被合并到OpenSSL的源代码的“主”分支于2018年5月20日,在本文发表之前。

2背景

长时间操作(例如大整数平方和乘法操作)通过产生许多信号样本来促进匹配,即使当信号以有限的采样率收集时。 一个代表性的例子是RSA的解密,其核心是用秘密指数(d)模m对密文c进行模幂,或者在依赖于中国提醒定理(CRT)的更有效的实现中,两个这样的指数,分别具有模p和q的秘密指数dp和dq。因此,侧信道分析试图利用在执行指数化时获得的侧信道测量来恢复d或CRT实现中的dp和dq。该指数化被实现为从左到右(从最高有效位开始)或从右到左(从最低有效位开始)对指数位的遍历,使用大整数模乘法更新结果直到完全求幂完成。从左到右的实现更为常见,在不损失通用性的情况下,我们使用c表示密文,d表示秘密指数,m表示模数。指数化的简单实现一次只考虑一个指数位,如图1所示,它是根据OpenSSL源代码改编的。

63497eeb49fa14fcda39e7c62625ab12.png

图1中的BN前缀代表“大数”(即大整数)。每一个大整数由肢体的向量表示,其中肢体是普通的(机器字大小)整数。BN是位集(d,b)函数返回大整数指数d的第b位的值(0或1),这只需要几个处理器指令:计算包含请求位的数组元素的索引,加载该元素,然后移位和位掩码以保持仅请求位实现循环、IF语句和函数调用/返回的指令数量也相对较少。图1中的BN前缀代表“大数”(即大整数)。每一个大整数由 limbs 的向量表示,其中 limb是普通的(机器字大小)整数。BN是位集(d,b)函数返回大整数指数d的第b位的值(0或1),这只需要几个处理器指令:计算包含请求位的数组元素的索引,加载该元素,然后移位和位掩码以保持仅请求位。实现循环、IF语句和函数调用/返回的指令数量也相对较少。 然而,BN mod mul操作要耗费更多的时间:它需要对大整数乘法器的分支进行操作的大量乘法指令。大整数c、d和m(或者,在基于CRT的实现中,dq、dp和相应的模数)都具有O(n)位,因此具有O(n)分支,其中n是RSA密码密钥的大小。因此,BN模mul的小学实现需要O(n^2)分支乘法,但是通常使用Karatsuba乘法算法[30]来将其减少到O(nlog 2^3)≈O(n^1.585),在大多数现代实现中,通过将密文转换为Montgomery表示,在求幂期间对BN mod mul使用Montgomery乘法,并最终将结果r转换回标准表示,实现了显著的进一步性能改进。然而,即使采用Montgomery乘法,大数乘法运算的执行时间绝大多数都花费在大数乘法上,所以性能优化集中于减少这些乘法的数目。同样,在大数指数化期间收集的大多数侧信道测量(例如,信号样本)对应于大数乘法活动,因此现有的侧信道密码分析方法倾向于以乘法活动为目标。 一类攻击的重点是区分平方(rr)和乘法(rc)操作,并从它们发生的序列中恢复关于秘密指数的信息。此类攻击的例子包括FLUSH+RELOAD[45](使用指令缓存行为)和Percival的攻击[39](使用数据缓存行为)。在上述天真的实现中,平方的出现告诉攻击者正在使用指数的下一位,并且乘法的出现指示该位的值是1,因此正确恢复平方乘法序列的攻击可以平凡地获得秘密指数的所有位。 为了提高性能,大多数现代实现都使用基于窗口的求幂,其中指数的每个位都需要平方,但是对于指数位的多位组(称为窗口),乘法只需要一次。从左到右(从最高有效位开始)滑动窗口实现扫描指数位并形成不同长度的窗口。由于只包含零位的窗口不需要乘法(因此不能从形成多位窗口中获益),所以只允许以1值位开始和结束的窗口形成多位窗口,而在这些窗口之间的零位每个被视为它们自己的单位窗口,可以省略乘法。图2中显示了一个滑动窗口实现,它使用从OpenSSL源代码改编的代码进行滑动窗口模块化求幂。滑动窗口方法为其将使用的窗口选择最大大小wmax,为每个可能的值wval到wmax长度预先计算包含大整数值c wval modm的表ct,然后扫描指数,形成窗口并更新每个窗口的结果。

3c31fdcb8140ac973f945e9e05e72d51.png

在该算法中,对每个比特执行平方(图2中的第7和26行),而乘法操作(第29行)仅在非零窗口的(1值)LSB处执行。因此,平方乘序列揭示了指数中的1值位中的一些,并且通过分析每对乘法之间的平方的数目,指数的附加位已被证明是可恢复的〔10〕。可以从平方乘序列恢复的比特的分数取决于最大窗口大小WMAX,但是WMAX的常用值相对较小,并且先前的工作〔10〕实验证明当WMAX=4时基于平方乘法QUN平均恢复49%的指数位。另外的技术[10,28]已经表明,一旦知道了足够的指数位,就可以恢复完整的RSA私钥,而对于wmax=4,这允许28%的密钥的完全密钥恢复[10]。最后,最近的工作已经表明,细粒度的控制流跟踪通过模拟侧通道可以是非常准确的[ 32 ]。因为该滑动窗口实现使用指数的每个位来作出至少一个控制低决策,所以高精度的控制流重构等于发现指数位并具有一定错误概率。 由于对指数依赖的方乘序列的关注,OpenSSL采用了固定窗口指数,它结合了基于窗口的实现和指数无关的方乘序列的性能优势。这一实现在图3中表示,再次适应OpenSSL的源代码。

b50203cc14f8fcbc6af7c29f1904275d.png

现在,所有窗口具有相同的位数w,每个窗口都执行一个乘法——实际上,不管指数如何,所有控制流现在都完全相同。注意,窗口值(由来自秘密指数的位组成)直接确定访问ct的哪些元素。这些元素都是大整数,每个元素通常存储为数组或普通整数(例如,OpenSSL的“Big Number”BN结构)。由于每个这样的阵列比缓存块大得多,不同的大整数占据不同的高速缓存块,因此在读取CT阵列的元素时访问的高速缓存集的地址揭示了关键材料。例如,珀西瓦尔的攻击(39)可以注意到在固定窗口幂运算期间由受害者访问高速缓存集的序列,它揭示了使用哪些窗口值以及以什么顺序依次产生秘密指数的位。为了减轻这种攻击,OpenSSL中的实现已经更改为存储ct,以便每个缓存块包含来自多个ct元素的部分,因此,在每个ct[wval]查找中访问的存储器块序列不会泄漏该查找的wval的位或非常少的位。另一类广泛的旁路攻击依赖于选择密文,使得模乘法的旁路行为揭示了正在使用哪个可能的乘法。例如,Genkin等人。[23,24]构造一个密文,该密文以与密文相乘产生的任何值产生许多零分支,但当将这么多零分支值平方时,结果具有更少的零分支,每当平方运算(在我们的示例中为BN mod mul(r,r,r,m))紧跟在1值窗口(即,当r等于r prev * c mod m)之后时,产生容易区分的侧信道信号。此方法已被扩展[21]以构建(选择的)密码文本,该密码文本揭示在窗口实现中何时使用特定窗口值进行乘法,通过收集对应于2^w所选密文(每个窗口值一个)的信号,允许完全恢复指数。然而,在当前的OpenSSL实现中,通过启用盲,可以防止选择密文攻击,盲将密文与加密(使用公钥)随机“密文”组合,对密文的这个盲版本执行秘密指数模幂。然后“揭开”解密结果。 总的来说,因为大整数乘法是大整数求幂花费大部分时间,大多数侧信道测量(例如,物理侧信道的信号样本)也与该乘法活动相对应,因此攻击和缓解都倾向于集中在信号的该部分,在乘法运算之间留下(相当短的)信号部分,大部分没有被攻击利用,但也没有受到反措施的保护。下一节描述我们新的攻击方法,它针对与计算窗口值相对应的信号,即乘法之间的信号。

3提出的攻击方法

在固定窗口和滑动窗口实现中,我们的攻击方法都集中在考虑指数的每个位并形成窗口值wval的相对短暂的计算周期上。攻击方法有三个关键部分,我们将讨论如下。首先,第3.1节描述了信号是如何接收和预处理的。其次,第3.2节描述了我们如何识别信号的时间线中每个兴趣区间开始的点。最后,我们描述如何从这些用于固定窗口(3.3节)和滑动窗口(3.4节)实现的信号片段中恢复秘密指数的位。
3.1 接收信号
我们计算的目标是简短的,并且指数比特的不同值在侧信道信号中产生相对小的变化,因此经受我们分析的信号需要具有足够的带宽和信噪比,以便我们的分析成功。为了最大限度地提高信号噪声比,同时尽量减少入侵,我们定位EM探针刚好在目标设备的外壳外。然后,我们在目标设备上在OpenSSL上运行RSA解密,同时在40 MHz频带中记录信号的时钟频率。40MHz带宽被选择为秘密指数比特的恢复速率和能够捕获所需带宽的接收机的可用性和成本之间的折衷。具体而言,40 MHz带宽在Etut-Urp B200微型接收机的能力范围内,它非常紧凑,成本低于1000美元,并且可以在中心频率周围接收高达56MHz的带宽,中心频率可以设置在70MHz至6GHz之间,然而,40MHz带宽足以从使用该指数的指数化的单个实例中恢复秘密指数的几乎所有位。然后,将AM解调应用于接收信号,最后对其进行4倍上采样。上采样包括通过信号的现有采样点进行插值以及沿着插值曲线放置附加点。这是需要的,因为我们的接收机的采样与感兴趣的计算不以任何方式同步,所以为同一计算收集的两个信号片段可能被多达一半的采样周期错位。上采样允许我们以更高的精度重新对准这些信号,并且我们发现4倍的上采样对于我们的目的产生足够的精度。
3.2 识别信号的相关部分
图4显示了在OpenSSL中固定窗口幂运算期间开始的信号的一部分。它包括一个大数乘法的一部分(图3中的第7行),在OpenSSL中,它使用Montgomery算法和一个常数时间实现,该实现被设计成避免先前的旁路攻击所利用的与乘数相关的时序变化。

c8dfd06f9338fc13f5586145816df768.png

Montgomery乘法返回并且信号的相关部分开始的时间点由图4中的虚线垂直线表示。在信号的这个特定部分中,执行进行到图2中的第8行和第9行,其中获得一些指数并将其添加到wval,然后是第10行和第6行,然后是7行,其中在由第二个虚线垂直线指示的点,执行进入另一个Montgomery乘法,其中信号很好地通过图4的右边缘。如图所示,信号的相关部分相对于蒙哥马利乘法的持续时间非常短。识别整个信号中的相关片段的一种简单方法是在训练期间获得参考信号片段,然后在攻击期间在信号中的每个位置与这些参考片段进行匹配并使用信号的最佳匹配部分。这种信号匹配在寻找具有显著特征的片段时工作得最好,因此它们不太可能被噪声遮蔽,并且其显著特征以不太可能存在于信号中其他地方的模式出现。不幸的是,与我们的分析相关的信号片段几乎没有信号变化(相对于信号的其他部分)以及信号的许多其他部分相似的信号形状(只是几个起伏)。相比之下,对应于蒙哥马利乘法的信号具有更强的特征,并且它们以非常明显的模式出现。

因此,与其通过训练来匹配它们的参考信号,而不是找到相关的片段的实例,我们使用与信号在单数乘法期间的最显著变化相对应的信号作为参考,其中信号从具有相对低信号电平的周期突然改变为具有相对高信号电平的周期。我们使用一种非常有效的算法来识别信号中的这一点。我们首先计算信号的移动中值(图4中的厚虚线黑色曲线),以提高对噪声的恢复能力。然后,我们检查这个移动中值(图4中的粗红曲线)的导数(斜率),以识别显著超过其统计预期变化的峰值。在图4中,粗红箭头表示这样的峰值,这与信号相关部分之前的蒙哥马利乘法最显著的变化相对应。因为蒙哥马利乘法的实现被设计成几乎没有时序变化,我们实际需要分析的信号片段处于与匹配点相距的固定时间偏移处。因为识别信号的相关片段的方法是基于对应于每个相关片段之前的蒙哥马利乘法的信号,同样的方法可以用于提取固定窗口和滑动窗口指数化的相关信号片段——在两种情况下,相关片段都处于在信号的移动中位数的导数中检测到足够突出的峰值。

3.3 在固定窗口实现中恢复指数位
在固定窗口实现中,使用大数乘法来平方(图3中的第7行)到达窗口之后的更新结果(第14行)。因此,在蒙哥马利乘法之间有四个控制流的可能性。 当第7行中的蒙哥马利乘法完成时,前两个控制流可能性开始。两种控制流的可能性包括更新窗口值以包括来自指数(线8, 9和10)的另一比特,以及在第6行递增I并检查它与窗口的最大尺寸W。第一控制流可能性是更常见的一种——窗口不结束,并且当行7的另一乘法时执行到第7行。我们将这个控制流的可能性标记为S(从平方到平方)。第二控制流可能性出现在检查窗口的最后一位并将其添加到wval之后,在这种情况下,退出第6行的循环,准备第14行的结果更新的参数,并且开始第14行的Montgomery乘法。我们的代码示例中的参数准备涉及计算ct[wval]的地址以创建一个指针,该指针将被传递给Montgomery乘法作为它的第二个乘数。在OpenSSL的实现中,ct保持为点阵格式,以便在计算Montgomery乘法时最小化通过缓存侧通道的wval泄漏,因此,取而代之的是使用wval的值来将ct[wval]的散乱部分收集到一个预先分配的数组中,该数组被传递给Montgomery乘法。由于这个预先分配的数组用于所有结果更新乘法,蒙哥马利乘法期间的内存和缓存行为不再依赖于wval。这意味着,在第二种控制流可能性中,需要大量的活动来收集乘数的部分并将它们放入预先分配的数组中,并且只有在那时,第14行的蒙哥马利乘法才开始。我们将此控制流的可能性标记为SU(从平方到更新)。 由于这个预先分配的数组用于所有结果更新乘法,蒙哥马利乘法期间的内存和缓存行为不再依赖于wval。这意味着,在第二种控制流可能性中,需要大量的活动来收集乘数的部分并将它们放入预先分配的数组中,并且只有在那时,第14行的蒙哥马利乘法才开始。我们将此控制流的可能性标记为SU(从平方到更新)。 最后两个控制流的可能性发生在行14中的结果更新完成其蒙哥马利乘法之后。检查行2处的循环条件,然后一个控制流可能性(四个中的三分之一)是整个指数化循环退出。我们将此控制流的可能性标记为U-X(从更新到退出)。对于除了最后一个窗口之外的所有窗口,最后一个控制流可能性是在第2行之后执行第3行,在第6行进入窗口扫描循环,并在第7行开始下一个大数蒙哥马利乘法。我们将此控制流的可能性标记为U-S(从更新到平方)。 在每个窗口中遇到这四种控制流可能性的顺序总是相同的:w_1出现S-S,然后出现S-U,然后出现U-S或U-X,其中U-X只可能出现在指数的最后一个窗口。我们的分析的第一部分涉及区分这四个控制流的可能性。这样做的原因是,噪声突发、中断和其他核上的活动可以暂时干扰我们的信号,并防止蒙哥马利乘法的检测。在这种情况下,仅仅依靠已知的控制流可能性序列将导致观测序列和预期序列之间的“滑动”,使我们使用不正确的参考信号来恢复指数的位,并将恢复的位置于恢复指数内的不正确位置。 四种可能性的分类比指数位的恢复更可靠。与其他三种可能性相比,S-U在蒙哥马利乘法之间花费的时间明显更多(因为乘数收集活动),因此可以高精度地识别它,并且我们使用它来确认该乘法刚刚完成一个窗口。U-X的可能性也是高度可识别的,因为与其在后面执行蒙哥马利乘法,它导致执行从蒙哥马利转换为标准大数格式的代码,并且它用来确认整个求幂已经结束。S-S和U-S片段都只涉及蒙哥马利乘法之间的一些指令,因此它们很难区分,但是我们的信号匹配在区分它们时仍然具有很高的精度。 在将各个片段与四种可能性匹配之后,该匹配用于查找片段序列到已知有效序列的最可能映射。例如,如果对于w=5,我们观察到S-U、U-S、S-S、S-S、S-S、S-U,所有这些都具有高置信度匹配,那么我们知道那个窗口缺少一个S-S。然后,我们另外使用这些片段之间的定时来确定丢失的S-S的位置。即使该确定是错误的,我们将正确地开始匹配S-U之后的下一个窗口,因此,丢失的片段不太可能导致任何滑移,但是即使它确实导致滑移,这种滑移也很可能被“包含”在一个指数化窗口中。注意,缺少的S-U或S-S片段阻止我们的攻击使用其信号匹配来恢复相应位的值。一个幼稚的解决方案是将一个随机值分配给该位(在缺失位之间有50%的错误率)。然而,对于完全RSA密钥恢复缺失位(擦除,即已知位的值是未知的)来说,问题远小于错误(位的值是不正确的,但不知道先验是不正确的),我们将这些缺失位标记为擦除。 最后,对于S和S -S片段,我们执行额外的分析来恢复片段对应的指数的位。回想一下,在S-S和S-U控制流的可能性中,在第9行中,从指数中读取一个新位并将其添加到wval,并且该位是我们将从片段中恢复的位。为了便于讨论,我们将把这个位的值称为BVAL。为了恢复BVAL,在训练中,我们得到每个BVAL值的这些片段的例子。为了抑制参考片段中的噪声,从而使以后的匹配更加精确,这些参考片段是训练中许多“相同”示例的平均值。显然,对于bval=0(其中只有bval=0示例被平均)和bval=1(其中只有bval=1示例被平均)应该有单独的引用。然而,bval不是唯一有系统地影响信号的值——这部分计算中的信号也受到先前的wval、环路计数器i等的值的影响。问题是,这些变化发生在信号的同一部分,其中由于bval occu而变化。因此,这些不同变体的平均化可能导致衰减BVAL的影响。我们通过在窗口中形成不同的位位置的独立引用来减轻这个问题,例如,对于窗口大小w=5,bval的每个值将具有4组S-S片段和1组S-U片段,因为窗口中的第一个for比特对应于S-S片段,而窗口中的最后一个比特对应于S-U片段。为了解释信号中的其他值依赖于信号,在每一组这样的片段中,我们将相似的信号聚集在一起,并使用每个簇的质心作为参考信号。我们使用k-均值聚类算法,用于聚类的距离度量是Euclidean距离(两个片段中相同位置样本之间的平方差值之和)。我们发现,上面讨论的每一组片段至少有6-10个簇显著提高了精度。 在6-10簇之外,我们的秘密指数位的恢复仅略有改进,但是需要更多的训练示例来补偿每个簇的例子较少(因此在簇的质心内噪声抑制较少)。因此,我们使用10个簇为每个窗口位位置为每个两个可能值的BVAL。总的来说,BVAL恢复的S - S参考片段的数目是2 * (W - 1) * 10——BVAL的两个可能值,w_1位位置,每个位置有10个参考信号(簇质心),而对于S-U片段,我们只有20个参考片段,因为S-U只发生在窗口中的最后一个位位置。对于常用的窗口大小,这会导致相对较少的引用片段总数,例如,对于w=5,只有100个引用片段。为了说明由指数位的值创建的信号中的差异,图5显示了针对指数位的每个值的两个参考S-S片段(群集重心),其中0值和1值信号之间的最大差异由粗箭头表示。

37af664d5e223c99f762a091781f4438.png

回想一下,在尝试恢复秘密指数的未知位之前,我们已经识别出所考虑的片段属于哪个控制流可能性(S-S或S-U),对于S-S,它属于哪个位位置,所以每个考虑中的片段有20个参考片段(对于bval=0有10个簇,对于bval=1有10个簇)。因此,我们分析的最后一步包括在这20个参考片段中找到最接近的匹配(使用欧几里得距离作为度量),并采取与该参考片段相关联的bval。

(文章篇幅较长,请持续关注更新……)

文章来源:One&Done: A Single-Decryption EM-Based Attack on OpenSSL’s Constant-Time Blinded RSA  作者:Monjur Alam等


2fee9005fa55bec04c15e5e4cb47be56.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值