基于故障的几乎通用伪造攻击CLOC和SILC
摘要
CLOC和SILC是两种提交给CAESAR竞赛的基于分组密码的认证加密方案,旨在使用低面积缓冲区并高效处理短输入。方案设计者声称其对重用随机数的对手提供n²‐比特完整性安全性,其中n是分组密码状态大小(以比特为单位)。本文中,我们提出了针对CLOC和SILC的单故障几乎通用伪造攻击,仅需在特定分组密码输入的固定位置引入一个单比特故障即可实现。对于CLOC,该伪造几乎适用于任何随机数、关联数据和消息三元组,仅对关联数据存在名义限制。对于SILC,该伪造几乎适用于任何关联数据和消息,但对关联数据存在名义限制且需要固定随机数。对CLOC和SILC的这两种攻击都需要若干次随机数滥用的加密查询。该攻击独立于底层分组密码,作用于加密模式本身。本文还通过电磁脉冲注入实施实际的故障攻击,验证了所提出的基于故障的伪造方法的有效性,表明该伪造过程具有实际可行性。最后,我们提供了改进的构造方案,在假设底层分组密码具备抗故障能力的前提下,可抵抗对加密模式的故障攻击。需要指出的是,我们的攻击并未违反设计者的声明,因为我们的攻击依赖于故障注入。然而,它揭示了当故障可行时,这些方案存在一定的脆弱性。
关键词
故障攻击 · Blockcipher · Authenticated加密 · CLOC · SILC
1 引言
一种带有关联数据的认证加密方案(AEAD)是一种对称密钥密码原语,可提供明文的隐私性以及关联数据的完整性。
CLOC[22]和SILC[21]是CAESAR[1]竞赛中的两个候选方案,该竞赛旨在标准化一些高效的AEAD方案。CLOC是一种在线认证加密方案,采用CFB分组密码操作模式,并基于底层分组密码AES‐128[11,12]和TWINE‐80[29]。CLOC旨在优化CCM、EAX和EAX′的实现开销、预计算复杂度和内存需求。它具有低开销计算的独特优势,使其在处理短输入时更加高效,且CLOC唯一的预计算就是密钥调度。CLOC被认为是一种轻量级AEAD方案,适用于嵌入式设备。在底层分组密码具备伪随机性属性的前提下,CLOC被证明是安全的。
SILC旨在实现轻量级结构,并基于CLOC构建。SILC也是一种在线认证加密方案,采用CFB模式并以底层分组密码AES‐128、PRESENT‐80[8]和LED‐80[15]构造而成。实际上,SILC的构造旨在优化CLOC的硬件实现,因此SILC被认为是一种适用于硬件资源受限设备的轻量级AEAD方案。此外,SILC在底层分组密码的伪随机性属性下具有可证明安全性。
针对多种密码原语的故障攻击正受到越来越多的关注。智能卡、移动设备以及具有密码硬件的其他设备的引入,要求具备抵御故障注入的能力。Boneh等人[9,10]首次提出了针对密码设备的基于故障的攻击。此后,该研究领域扩展到了对称密码和非对称密码。Biham等人在[6]发表了针对DES的差分故障分析(DFA)。此后,许多分组密码和流密码已通过故障攻击成功分析,例如AES[13,27,30],LED[23,24], Trivium[18,19], RC4[7,17], Grain[3,4], Mickey 2.0[2]。Hemme等人[16]也提出了针对SHA‐1压缩函数的故障攻击。据我们所知,目前仅存在一种针对认证加密方案的此类故障攻击。Saha等人[28]对CAESAR候选算法APE提出了该攻击。该攻击通过注入两个5比特的对角线故障,成功减少了APE‐80的密钥搜索空间。
我们的贡献
在本研究中,我们发现CLOC和SILC在加密和关联数据处理阶段都具有分组密码输入状态分离的特性。这种分离是通过在AD处理阶段将分组密码输入状态的第一位固定为0,在加密阶段固定为1来实现的。
对CLOC的攻击
在CLOC的情况下,第一个关联数据块的第一位在相应的分组密码调用之前被固定为零。所有密文块的第一位被固定为1,然后传递给下一个分组密码调用。在第一个密文块的第一位被固定为1之后,在该位上注入一个故障。该攻击首先使用这个有故障的输入‐输出对来模拟关联数据处理阶段,以找到一对碰撞的关联数据,进而伪造一个有效密文。如果故障被注入到第一位,则我们仅需两次遵守随机数的加密查询即可伪造一个有效密文。
接下来我们描述如何利用上述攻击实现几乎通用伪造。我们在相应章节中明确说明了术语“几乎”的含义。在这种情况下,我们必须进行多次遵守随机数的加密查询,查询次数取决于关联数据块的数量。我们证明,基于故障的存在性伪造对于任何认证加密方案都是平凡的,但此攻击完全是非平凡且有趣的,因为它是几乎通用伪造。
对SILC
在SILC中,随机数在前缀处填充若干个零,且所有密文块的第一位首先被固定为1,然后传入下一次分组密码调用。该攻击试图在任意一个这样的固定密文块中注入故障,使得该块的第一位变为0。注意,除了块的第一位外,我们可以通过重复使用随机数的加密查询或RUP解密查询来控制所有其他比特。因此,通过调整加密查询中的明文或RUP查询中的密文,我们可以找到一个发生故障的输入‐输出对,其中输入的形式为在前缀处填充了零的随机数。接下来,攻击会找到一对碰撞的关联数据,并进一步伪造出一个有效密文。
接下来我们描述一种针对SILC的几乎通用伪造,其方法与对CLOC的攻击几乎相同,只是在随机数的限制上有所不同。
故障攻击的实际验证
我们已在实际的FPGA实现上验证了所提出的基于故障的伪造攻击。我们将CLOC移植到SPARTAN‐6 FPGA(xc6slx75)上,并在实现中施加了故障,以证明所提出的攻击方法是实际可行的,因此必须加以应对以维护CLOC和SILC的安全性。
伪造防御措施
上述攻击基于加密模式,而非底层分组密码。我们通过仅更新CLOC和SILC的消息处理阶段,提出了三种抗故障加密模式。此处,我们假设底层分组密码是抗故障的。我们还简要讨论了这些构造在硬件面积和吞吐量方面相对于CLOC和SILC的开销。
2 预备知识
2.1 CLOC的描述
在本节中,我们对CLOC进行非常简要的描述,并采用与[22]中所述相同的符号和变量名。根据作者的描述,CLOC基于三个参数具有多种变体:底层分组密码 Ek的长度为 n比特,nonce长度为 N比特,标签长度为 τ比特。CLOC没有密钥消息编号,且存在三个额外要求: 1 ≤ N ≤ n −1, 1 ≤ τ ≤ n 和 n ∈{64, 128}。我们还假设 N/8和 τ/8均为整数。
下面仅描述加密电路,因为解密电路对我们的攻击并不重要。加密电路依次运行 Hashk、 Enck和标签生成算法。它接收随机数 N、关联数据A=(A1, A2,···, Aa)和消息 M=(M1, M2,···, Mm),并输出密文 C=(C1, C2,···, Cm)和标签 T,其中 m和 a分别为消息和关联数据的块数。我们假设 Aa具有完整的块长度。从图1可以看出,分组密码E的底层密钥是 k。首先, N和 A通过算法 Hashk处理以产生中间值 V。然后, Enc算法获取 V和 M,并使用相同的分组密码 Ek生成密文 C=( C2,···, Cm)= Enck(V, M)。标签生成算法接收 V和 C以产生最终标签 T。我们有意省略了标签生成算法的描述,因为它对我们的攻击并不重要。 Hashk和 Enck在图1中给出。
我们有意忽略了[22],中的 ozp msb h g1 g2和 f2函数,因为它们对攻击没有影响且不需要。我们还假设 i, f1, fix0和 fix1是公开可逆置换。输入为 x的 fix0函数将 x的第一位固定为0,输入为 x的 fix1函数将 x的第一位固定为1。 i是恒等函数。
CLOC的参数选择和完整性声明
CLOC。建议的参数集及相应的完整性安全性声明(以比特为单位)如下所示。
- aes128n12clocv1: E= AES‐128, N= 96, τ= 64, 64‐位安全性。
- aes128n8clocv1: E= AES‐128, N= 64, τ= 64, 64‐位安全性。
- twine80n6clocv1: E= T W INE‐80, N= 48, τ= 32, 32‐位安全性。
2.2 SILC描述
在本节中,我们对SILC进行了非常简要的描述,并采用与[21]中所述相同的符号和变量名。正如作者所述,SILC有多种变体,基于三个参数:长度为Ek的底层分组密码 n、nonce长度 N和标签长度 τ。SILC没有密钥消息编号,并且存在三个额外的要求: 1 ≤ N ≤ n − 1,1 ≤ τ ≤ n和 n ∈{64, 128}。我们假设 N/8和 τ/8均为整数。
下面,我们描述加密电路和解密电路。加密电路依次运行 Hashk、 Enck和标签生成算法。它接收随机数 N、关联数据 A=(A1, A2,···, Aa)以及消息 M=(M1, M2,···, Mm),并输出密文 C=(C1, C2,···, Cm)和标签 T,其中 m和 a分别为消息和关联数据的块数。我们假设 Aa具有完整的块长度。如图2和图3所示,分组密码 E所使用的底层密钥为 k。首先, N和 A通过算法 Hashk处理,使用分组密码 Ek生成中间值 V。然后, Enc算法接收 V和 M,并使用相同的密钥 k生成密文C=(C1, C2,···, Cm)= Enck(V, M)。标签生成算法接收 V和 C以生成最终标签 T。我们有意省略了标签生成的描述,因为它对我们的攻击并不重要。
解密电路首先运行 Hashk ,然后并行执行 Deck和标签生成算法。它以随机数 N、关联数据A=(A1, A2,···, Aa)、密文 C=(C1, C2,···, Cm)以及标签 T作为输入。它首先运行Hashk(A)以生成 V。该 V和 C被传入
Deck算法用于计算 M。标签生成算法并行运行以计算标签 T∗。如果 T∗= T则电路输出 M,否则输入被拒绝。 Hashk和 Enck如图2所示, Deck如图 3所示。
我们有意忽略了 zap, msb和 g函数,因为它们对我们的攻击没有影响且不需要。我们还假设 fix1, g是公开可逆置换。 zpp函数定义为 zpp(X)= X, 如果 |X| =n且 zpp(X)= 0n−(|X| mod n) ||X,否则。 fix1已在CLOC描述中定义。
参数选择和SILC的完整性声明
建议的参数集及相应的完整性安全性声明(以比特为单位)如下所示。
- aes128n12silcv1: E= AES‐128, N= 96, τ= 64, 64‐位安全性。
- aes128n8silcv1: E= AES‐128, N= 64, τ= 64, 64‐位安全性。
- present80n6silcv1: E= PRESENT‐80, N= 48, τ= 32, 32‐位安全性。
- led80n6silcv1: E= LED‐80, N= 48, τ= 32, 32‐位安全性。
2.3 完整性安全模型
令 x ∈R X表示 x从某个有限集合 X中均匀采样。令⊥表示一个特殊符号 reject。接下来我们定义完整性安全性概念,INT-CTXT,即攻击者在可以访问加密预言机和验证预言机,并且在加密查询中可重复使用随机数的情况下所具备的不可伪造性。设 π=(K, E,D, V)为一个认证加密方案,其中K是密钥生成算法, E是加密算法, D是解密算法, V是验证算法。
定义1。
关于π的区分器 D的INT- CTXT优势定义为
Adv int−ctxt π (D)= |Pr[K ∈ R K: DE K ,VK =⊥]|
我们假设区分器不会进行验证查询(N, A, C, T),如果它曾经获得了某个 M对应的(C, T) ← EK(N, A, M)。根据攻击场景的不同,我们还可以选择性地限制区分器不得对不同的 Ek查询(N, A, M)重复使用 N。用Advint−ctxt π (q,l)表示在所有进行 q次查询且总查询消息长度为 l比特的区分器中取到的上确界。如果Advint−ctxt π (q, l) ≤ 2−s,那么 π在面对所有进行 q次查询且总查询消息长度为 l比特的攻击者时,具有 s比特的INT-CTXT安全性。
非正式地, D的目标是计算一个(N, A, C, T),使得 Vk(N, A, C, T)=⊥。这里验证 =⊥的输出意味着 ∃ M,使得(C, T)=Ek(N, A, M)。如果攻击者能够为任意消息、关联数据和随机数生成有效的密文和标签对,则称该攻击者进行了universally伪造。
在基于故障的伪造情况下, D可以在加密查询期间向中间加密状态注入故障。这意味着, D可以强制改变加密过程的正常执行 Ek。换句话说,他可以通过注入故障从Ek模拟一个新的电路 E′ k(故障注入后的加密过程)。在这种情况下, D获得了更改电路的额外能力。 D的目标将如上所述的INT‐CTXT安全性模型。
3 动机
在本节中,我们阐述了此项工作的动机。基于故障的存在性伪造攻击并不具有太大的重要性,因为该攻击的输出对攻击者带来的益处有限。此外,在基于分组密码的认证加密方案中,若主密钥仅用于底层分组密码内部,则对该方案的密钥恢复意味着对分组密码的密钥恢复。因此,假设底层分组密码是抗故障的,那么通过故障注入在加密模式上实现比存在性伪造更有价值的攻击将具有重要意义。
例如,考虑一种低资源嵌入式设备(如智能卡)的场景,该设备的芯片内嵌有用于安全通信的认证加密算法。如果攻击者能够访问该芯片,则可以注入故障并伪造虚假信息。然而,注入故障可能成本较高且耗时较长。在这种情况下,通过注入故障实现存在性伪造可能并非攻击者的目标,因为他只能伪造单个有效密文,并且在此过程中并未获得明显优势。在此场景中,通用伪造甚至多重伪造可能是更具吸引力且非平凡的任务。
然而,在任何认证加密方案上,使用单故障进行存在性伪造是可能的。正如岩田等人所指出的[20]任何认证加密方案都可以通过以下过程实现存在性伪造。
进行一次故障注入加密查询(N, A, M),并收到(C, T)。故障被注入到已知的位位置 N 和 A ,分别导致 N′ 和 A′。使用(N′, A′, C, T)生成有效的伪造。
该攻击可以通过注入故障,针对任意随机数、关联数据和消息三元组伪造出有效密文。从广义上讲,如果攻击者想要伪造 k个密文,则必须进行 k次故障注入。然而,这一过程并不高效,因为故障注入本身代价较高,且此处我们需要插入 k个故障。因此,研究是否可以用一次或极少数几次故障实现 k( k 1)伪造将是一个非常有趣的问题。由于单次故障注入可能成本较高,使用极少数故障实现多次伪造可能成为一种高效的基于故障的攻击方式。在本研究中,我们探讨了这一问题,并证明对于CLOC和SILC而言,仅需一次单比特故障即可对几乎所有随机数、关联数据和消息伪造出有效密文。
该攻击针对加密模式,且未利用底层分组密码的结构。因此,研究是否存在能够抵抗类似攻击策略的加密模式也将非常有意义。
4 基于故障的CLOC存在性伪造
4.1 一种基于故障的CLOC伪造方法及随机数合规的加密查询
我们首先描述故障模型,然后描述在此故障模型下的伪造攻击。
故障模型与攻击动机。 在此,我们假设在 Enck中处理第一个密文块的第二次分组密码调用对应的 n位输入状态的第一位位置注入了一个故障 e。接下来,我们描述如何在特定的 n位输入状态的第一位位置注入故障 e的情况下伪造一个有效密文。
伪造的不同阶段。
伪造的各个阶段如下所述。
- 阶段1:通过一次加密查询,构造一个错误的输入‐输出对和两个对应于Ek的有效输入‐输出对。
- 阶段2:构造两个碰撞的关联数据(A, A′),在相同随机数 N下生成相同的 V。
- 阶段3:通过一次加密查询,在 N、 A和一个随机消息 M∗下构造(C ∗, T∗)。
- 阶段4:伪造一个有效密文(N, A′, C ∗ , T ∗)。
阶段1:通过一次加密查询构造一个错误的输入‐输出对以及两个对应于 Ek的有效输入‐输出对
该攻击首先使用一个随机的4分组消息 M=(M1, M2, M3, M4)、一个随机的随机数 Nr和一个随机的关联数据 Ar进行一次加密查询,并收到一个密文标签对((C= C1, C2, C3, C4) T)。我们假设故障 e在 Enck中的相应 Ek调用之前,被注入到 n位输入状态 fix1(C1)的第一位。现在我们构造两个对应于 Ek的有效输入‐输出对(X1, Y1)和(X2, Y2),其中包含 X1= fix1(C2)、 Y1= M3 ⊕ C3、X2= fix1(C3)和 Y2= M4 ⊕ C4。注意,由于 fix1(C1)的第一位为1,因此 e(fix1(C1))的第一位为0。我们将 e(fix1(C1))记为 X,将 Ek(X) =M2 ⊕ C2记为 Y。该阶段在图4中进行了描述。
阶段2:构造两个碰撞的关联数据 (A, A′),在相同随机数 V下产生相同的 N
我们现在构造两个碰撞的关联数据 A=(A1, A2, A3) 和 A′=(A1, A ′2, A′ 3),使得它们在相同随机数 N 下产生相同的 V。我们设定 A1= X。由于A1= fix0(A1), Ek(A1) 等于 Y。现在我们设定 A2= Y ⊕X1,使得对应 Ek 调用的输入为 X1。由于 Ek 输出 Y1,设定 A3= Y1 ⊕ X2 使得对应 Ek 调用的输入为 X2。因此, V= f1(Y2 ⊕ ozp(N))。
我们通过首先设置 A′ 来构造 A′ 2= Y ⊕ X2,使得对应 Ek调用的输入为 X2。由于 Ek输出 Y2,设置 A′ 3= Y2 ⊕X2使得对应 Ek调用的输入为 X2。因此 V得到相同的值 f1(Y2 ⊕ ozp(N))。该阶段如图5所示。
阶段3:构造 (C∗, T ∗)在 N, A和一个随机消息 M∗通过单个加密查询
我们现在使用 N, A和一个随机消息 M∗进行一次加密查询。作为响应,我们收到一个有效的密文标签对(C∗, T∗)。
阶段4:伪造密文。(N, A′, C ∗ , T ∗ )
由于 A和 A′产生相同的 V,因此为 M ∗使用 N 和 A′生成的密文标签对是(C ∗ , T ∗ )。因此我们成功构造了一个有效的伪造(N, A′, C ∗ , T ∗ )。
5 基于故障的CLOC几乎通用伪造
第4节中描述的攻击首先收集一组与 Ek相对应的输入‐输出,然后找到一个碰撞的关联数据对,最后伪造有效的密文‐标签对。在本节中,我们描述如何通过一些额外的随机数滥用加密查询将该技术有效地扩展到几乎通用伪造。此外,我们首先计算 X和 Y,如第4.1节阶段1中所述。我们使用 X和 Y来描述 “almost universalforgeries”这一术语 我们首先描述在此场景下术语“almost universal forgeries”的含义。该攻击能够为几乎所有(N, A=(A1,···, Aa) M=(M1,··· Mm))三元组生成有效的伪造,适用于任意 a和 m(其中a和 m根据规范有界)。对 A的选择存在名义上的限制,但对消息 M和随机数 N则无任何限制。我们将 Ek在 A2,···, Aa情况下的中间输入和输出分别记为X1,···, Xa−1和 Y1,···, Ya−1。此外,我们引入 I1和 O1,其定义如下。
I1= A1= X, O1= Y= Ek(I1) X1= A2 ⊕ i/h(O1), Y1= Ek(X1)
.
.
Xa−1= Aa ⊕ Ya−2, Ya−1= Ek(Xa−1)
在此攻击中,我们首先进行一次故障注入加密查询以获取 X和 Y。对关联数据 A=(A1,···, Aa)的限制可以理解为A1始终等于 X, A2,···, Aa的所有比特除第一位外均可取任意值,而 X1,···, Xa−1的第一位为1。这是一个可忽略的限制,其中所有 Ais可取 2127个值中的任意一个,而非 2128。此处我们假设所有的Ais均为完整的。不完整 A a的情形与此相同,故省略。接下来,我们描述针对任意随机数、关联数据和消息三元组(N, A=(A1 ,···, A a) M=(M1 ,···, M m))的几乎通用伪造,使得该三元组遵循“almost”限制。设 V为关联数据和随机数处理后的中间值。
1. 设置 A1= X 和 X1= Y ⊕ A2。
2. 发起一次加密查询 (N, A, Mr= M1r),接收 (Cr 1, T r 1) 并计算 Ek(V)= Mr 1 ⊕ Cr 1。
3. 对 i= 1 到 a−2 重复上述步骤:
- 发起一次加密查询 (N, A, M=(M1′= Ek(V) ⊕ Xi, M2′) 并接收 (C′=(C1′, C2′) T′)。
- 计算 Yi= M2′ ⊕ C2′。
- 计算 Xi+1= Ai+2 ⊕ Xi。
4. 发起一个加密查询 (N, A, M=(M1′= Ek(V) ⊕Xa−1, M′ 2),并收到 (C′=(C′ 1, C ′ 2 ⊕ C′ 2。
6. 根据第 4.1节中的阶段2,为 A 找到一个碰撞的关联数据 A′(在 V 处碰撞)。
7. 发起一个加密查询 (N, A′, M),并收到 (C, T)。
8. 因此 (C, T) 是针对 (N, A, M) 的一个有效伪造。
6 基于故障的存在性伪造攻击SILC
6.1 一种基于故障的对SILC的伪造,使用随机数滥用的加密查询
故障模型与攻击动机。本攻击针对SILC的故障模型与第CLOC在第4.1节中描述的故障模型类似。本节描述了在假设上述 e ‐比特输入状态的第一位注入了一个故障的情况下,如何伪造一个有效密文。 n我们将随机数长度记为 N,并定义 t为 t= n − N,,使得 zpp(N)= 0t||N。
Diffe伪造的不同阶段。
以下将描述各个不同阶段 .
- 阶段1:通过2次加密查询,构造一个错误的输入‐输出对和2个对应的 Ek的有效输入‐ 输出对。
- 阶段2:构造两个在相同随机数 N下产生相同 V的碰撞的关联数据(A, A′)。
- 阶段3:在 N、 A 和一个随机消息 M∗ 下,通过一次加密查询构造 (C∗, T∗)。
- 阶段4:伪造一个有效密文(N, A′, C∗, T∗)。
阶段1:通过2次加密查询构造一个错误的输入‐输出对和2个与Ek对应的有效输入‐ 输出对
该攻击首先发起一次加密查询,使用一个随机的3块消息 M=(M1, M2, M3)、一个随机的随机数 Nr以及一个随机的关联数据 Ar,并收到一个密文标签对((C= C1, C2, C3) T)。接着,攻击者构造两个与Ek对应的输入‐输出对(X1, Y1)和(X2, Y2),其中 X1= fix1(C1)、 Y1= M2⊕C2、X2= fix1(C2)和 Y2= M3 ⊕ C3。然后,攻击者发起一个两块的加密查询(Nr, Ar, M′=(M′ 1, M2)),并接收到((C′= C′ 1, C ′ 2) T′),其中 M′ 1的前 t比特被调整为使得 C′ 1的前 t比特为0。注意,我们在 Enck中对应的 Ek调用之前,在 fix1(C′ 1)的第一位注入一个故障 e。由于 fix1(C′ 1)的第一位为1,且 fix1(C′ 1)的接下来的 t −1比特为0,因此 e(fix1(C′ 1))的前 t比特为0。记 e(fix1(C′ 1))为 X,Ek(X)= M2 ⊕ C′ 2为 Y。此阶段在图6中进行了描述。
阶段2:构造两个在相同随机数A, A′下产生相同 V的碰撞的关联数据( N)
攻击现在构造两个产生相同 V 的碰撞的关联数据 A=(A1, A2) 和 A′=(A′ 1, A′ 2),它们在与 zpp(N)= X 相同的随机数下成立。我们设置 A1= Y ⊕ X1, 使得对应 Ek 调用的输入为 X1。我们设置 A2= Y1 ⊕ X2,使得对应 Ek 调用的输入为 X2。因此, V= g(Y2 ⊕ 2),其中 len(A)= 2。
我们通过设置 A′来构造 A′ 1= Y ⊕X2,使得对应Ek调用的输入为 X2。我们设置 A′ 2= Y2 ⊕ X2,使得对应 Ek 调用的输入为 X2。因此, V将得到与 g (Y2 ⊕2) 相同的值,如 len(A′)= 2所示。该阶段如图7所示。
阶段3 和 4与第4.1节中描述的先前攻击相同。故障检测技术也与之前的攻击类似。我们重复此伪造尝试 n次,如果解密预言机接受了该伪造尝试,则检测到故障。
6.2 基于故障的几乎通用伪造攻击onSILC
第6节中描述的攻击与对CLOC的攻击几乎相同,它首先收集一组对应于 E k的输入‐输出,然后找到一对碰撞的关联数据,最后伪造出一个有效的密文‐标签对。在本节中,我们描述对 SILC 的几乎通用伪造。我们首先计算 X 和 Y,并用它们来描述术语 almost。almost是一个对可能的可伪造值(N, A, M)三元组的名义限制。该攻击可以为几乎所有(N, A=(A1,···, Aa) M=(M1,··· Mm)三元组创建有效的伪造,适用于任何 a和 m(a和 m根据规范受到限制)。随机数 N以某种方式受到限制,使得 zpp(N)= X。对 A的选择存在名义上的限制。然而,对消息 M没有限制。我们用 X1,···, Xa和 Y1,···, Ya分别表示 Ek对 A1,···, Aa的中间输入和输出。该限制是,
X1= zpp(N)= X, Y1= Y= Ek(X1) X2= A1 ⊕(Y1), Y2= Ek(X2)
.
.
Xa+1= Aa ⊕ Ya, Ya+1= Ek(Xa+1)
在此攻击中,我们首先进行一次故障注入加密查询以获取 X和 Y。对关联数据 A=(A1,···, Aa)的限制可视为 zpp(N)始终等于 X, A1,···, Aa的所有比特除第一位外均可取任意值,且 X2,··· Xa+1的第一位为1。这对 A的限制可以忽略不计,其中所有 Ais可取 2127个值中的任意一个,而非 2128。此处我们假设所有 Ais均为完整的。对于不完整的Aa情况相同,故省略。然而,对 N的限制是严格的。接下来,我们描述针对任意随机数、关联数据和消息三元组(N, A=(A1,···, Aa) M=(M1,···, Mm))的几乎通用伪造,使得该三元组满足 “almost”限制。令 V为处理完关联数据和随机数后的中间值。
1. 设置 zpp(N)= X 和 X1= Y ⊕ A1。
2. 发起一个加密查询 (N, A, Mr= M1r)并接收 (C1r, T1 r) 以计算 Ek(V)= M1r ⊕ C1r。
3. 对 i= 1 到 a−1 重复此过程:
- 进行一次加密查询 (N, A, M=(M1′= Ek(V) ⊕ Xi, M2′),并接收 (C′=(C1′, C2′) T′)。
- 计算 Yi= M2′ ⊕ C2′。
- 计算Xi+1= Ai+2 ⊕ Xi。
4. 发起一个加密查询 (N, A, M=(M1′= Ek(V) ⊕ Xa, M2′),并收到 (C′=(C1′, C2′) T′)。
5. 计算 Ya= M2′ ⊕ C2′。
6. 根据第6节中的阶段2,为 A(在 V 处发生碰撞)找到一个碰撞的关联数据 A′。
7. 发起一个加密查询 (N, A′, M),并收到 (C, T)。
8. 因此 (C, T) 是对 (N, A, M) 的一个有效伪造。
7 基于故障的伪造攻击方案的实验验证
在前面的章节中,我们描述了在 ENCk操作的fix1模块中进行故障注入如何使我们能够对CLOC和SILC成功实施基于故障的伪造。本节重点在于对所提出的基于故障的伪造攻击方案进行实际验证。
为了进行实验验证,我们在SAKURA‐G [37]板的SPARTAN‐6 FPGA( xc6slx75)上实现了CLOC。该实现需要7776个LUT和5422个寄存器。设计的关键路径为10.372 ns。需要注意的是,从操作角度来看,fix1模块不涉及任何计算,它只是设置 Ek模块输入寄存器的msb。我们没有直接将逻辑1赋值给 msb,而是在该赋值路径中引入了一些缓冲器。应注意,这些缓冲器不会增加设计的关键路径,仅略微增加了设计的面积开销。
注入故障到设备中有多种方法。超频 [32],欠压 [33],激光照射 [34],升温 [35]是其中的一些方法。在本实验中,我们使用电磁脉冲作为故障注入器 [36]。
故障攻击装置如图8所示。为了进行实验验证,我们仅关注CLOC的fix1模块。因此,我们将 fix1模块移植到了SAKURA G的SPARTAN 6 FPGA( xc6slx75)上。该FPGA实现会在每次执行fix1模块时触发连接的示波器,进而触发延迟发生器设备。这使我们能够选择一个精确的时间点来注入故障。该射频发生器模块由延迟发生器设备触发,从而产生电磁脉冲。最后,这些电磁脉冲通过射频放大器放大,并由电磁探针注入到FPGA中。
在个人计算机上持续监控现场可编程门阵列上执行的fix1模块的输入和输出,以检测故障的发生。
为了执行所提出的伪造攻击,我们需要在fix1模块输出的 MSB处注入一个固定为零故障。在这种情况下,攻击者需要对故障位置和故障性质具有非常精确的控制,而若无激光等精密仪器,这可能难以实现。然而,本文展示了如何利用基于电磁脉冲的故障注入装置来诱发一种故障,从而按所提出攻击的要求破坏MSB。更具体地说,我们能够在fix1模块的输出中引入一个32位左移。我们多次重复了实验,每次均观察到相同的故障模式(输入的32位左移)。该故障模式的确定性特性使我们能够按照以下步骤完成伪造攻击:
1. 我们将一个随机消息作为输入,提供给 ENCk 操作的 fix1 模块,仅有一个约束条件: 95th 位应设置为零。由于输入是前一个密文块,我们总是可以通过查询一个合适的消息块,将密文的第95位设置为零。
2. 然后我们将在 fix1模块上注入故障,该故障将 fix1模块的输出左移32位,使得 95th比特变为 MSB。因此,我们能够以一个其MSB置为零的输入进入 Ek操作。此外,由于故障特性是确定性的,我们可以获知fix1模块的输出,这使我们能够构造出所需的关联数据值以完成伪造攻击。主要挑战在于如何通过查询分组密码获得一个其MSB置为零的输入。一旦我们通过故障注入实现了这一点,其余的攻击即可如第4节所述进行实施。
3. 对于SILCtoo,由于 zpp函数的存在,我们可以采用类似的故障注入方法,并稍作修改。假设在一次SILC实例中, nonce为120比特,则需要从msb端填充8比特的零。因此,为了成功伪造,我们需要将fix1模块的最高有效字节设置为零。这可以通过设置将fix1输入的 95th到 88th比特置零。因此,当我们注入故障时,这些比特 将被左移32位,并成为最高有效字节,从而允许我们进行伪造。该方案可扩展用于任意长度的随机数。
因此,我们在本节中实际验证了基于故障的伪造攻击。在下一节中,我们将重点关注对策,提出两种不同的构造方法来防止所提出的基于故障的伪造攻击方案。
8 防止对CLOC和SILC的基于故障的伪造
在前面的章节中,我们利用了 ENCk和HASHk算法的脆弱性,对 HASHk实现成功实施了伪造攻击。在此情况下,攻击者能够借助对加密操作中fix1模块的故障注入,获取任意 Ek的输入和输出块。这使得攻击者可以使用特定选择的关联数据向 HASHk实现发起查询,从而产生成功的伪造。只要攻击者能够获得 Ek的输入‐输出对,对 HASHk算法进行结构修改并不会提升CLOC的安全性。由于关联数据的选择完全由攻击者控制,并且关联数据总可以选择为在相同随机数值下向加密块提供所需的输入,并生成重复的关联数据,从而产生相同的 V值。
8.1 ENCk算法的重新设计
由于攻击的根本原因是攻击者能够获取输入‐输出对,因此在本节中,我们将讨论对ENCk算法可能进行的修改,以防止故障攻击。为了使 Ek的输入‐输出对无法被获取,输出 Ci将使用另一个加密方法进行加密
如图9所示的加密块,其中i ∈{1, 2,…n}. 在这个新算法中,设 Y=(Y1, Y2....Yn)为消息M=(M1, M2....Mn)经过异或操作后的输出, Y1= M1 ⊕ Ek(V)攻击者未知,因此连续的 Yi= Mi ⊕ Ek(fix1(Yi−1))仍未知,其中 i ∈{2, 3…n}。因此我们无法预测任何 Ek的输入和输出,由于在修改后的 Enck算法中攻击的阶段1无法执行,攻击者将无法对该密码实施攻击。请注意, HASHk和 PRFk算法均未改变。该对策也可应用于SILC,因为其 ENCk操作与CLOC完全类似。现在,加密 n个块所需的分组密码执行次数为 2n次,时间开销将是原来的两倍。
经济高效 ENCk算法。 无需防止攻击者同时获知任意 Ek的输入和输出,即使已知输入或输出其中之一,攻击者仍无法攻击该密码系统。为降低算法成本,可对交替密文块进行加密,同时仍保持对攻击的防护,如图10所示。对于任意 Ek,仅已知输入或输出其中之一,而非两者皆知。分组密码执行的总次数现在为 3n 2次,对应 n个块数,时间复杂度为原始 ENCk算法的1.5倍,若使用现有实现方式执行计算。但若采用两倍面积的实现以支持并行计算,则时间可与原始 ENCk算法相当。
I1=fix0( M1 ⊕ Ek(V)) O1= M2 ⊕ C2I2= fix1( C2) I3= fix1( M3 ⊕ E −1 k(C[3])) O2= M3 ⊕ E −1 k(C3) O3= M4 ⊕ C4
从上述方程可知, O1、 I2和 O3的值对攻击者是已知的,但 I1、 O2和 I3的值由于密钥未知而无法获知,因此 E −1 k(C3)和 Ek(V)的值也无法获知。
8.2 ENCk算法的结构修改
在本节中,我们介绍另一种对 Enck算法的可能修改,该修改比之前讨论的重新设计的算法在计算上更具成本效益且速度更快。该算法暴露了任何 Ek的输出,但不暴露输入,这是通过引入一个秘密参数A实现的,其等于Ek(ozp(Nonce))。
如图11所示,将 Ek以 fix1(C[i])为输入的输出与 αi−1倍的A进行异或操作,其中 α是 GF(2128)中的本原元。除了最后一次加密时A乘以(1+ α)αm−2,而不是αm−1,m表示消息的块数。
Ii= Ek(fix1(Ci) ⊕ αiA) Oi= Mi+1 ⊕ Ci+1
我们可以看到, Ek的输出对攻击者而言是 readily available 的,但 Ek 的输入由于被依赖于 A的秘密参数所掩码,因此对攻击者不可知。由于 A 实际上是对nonce 的加密,因此攻击者无法获知其值。这排除了本文提出的攻击方式。该方案的面积和时间开销源于在 GF(2128) 中引入的域乘法运算,该运算可通过非常低的面积和时间需求实现。所需的 Ek 操作数量增加了一次,因为我们现在还需要计算 A= Ek(ozp(N))。此外,我们现在需要存储 A 的值,这需要额外的存储空间。
总结来说,本节中我们提出了两种改进的CLOC构造方法,以防止之前讨论的基于在fix1模块中故障注入的伪造攻击。一个重要的观察是,所提出的攻击之所以有效,是因为攻击者能够访问加密模块中 Ek的输入和输出。在改进的构造中,我们确保了攻击者在任何时刻都无法同时获取 Ek的输入和输出,从而防止了基于故障的伪造攻击。
还应注意,CLOC和SILC的 ENCk操作是相似的。由于我们未修改其他操作 HASHk和 PRF,本节所述的对策同样适用于CLOC和SILC。
9 结论
在本文中,我们提出了针对CLOC和SILC的基于故障的几乎通用伪造攻击,该攻击利用了随机数误用的加密查询以及仅一次在特定分组密码输入状态的 msb处注入单故障的故障注入加密查询。我们首先提出了针对这两种构造的基于故障的存在性伪造攻击,然后利用这些攻击构建几乎通用伪造。所有提出的伪造攻击都需要在fix1模块输出端进行故障注入,我们已通过在fix1模块上实施基于电磁脉冲的故障攻击对其进行了实际验证。最后,我们提出了三种具有较小开销的高效构造方法,以抵御针对加密模式的基于故障的伪造攻击。
CLOC与SILC的故障伪造攻击
1083

被折叠的 条评论
为什么被折叠?



