依赖AES加速器的抗泄漏的认证加密
论文主要工作
在2020年tches上提出了一篇论文[USS20]给出了抗泄漏AEAD的具体实现,并论证了其安全性。但是本论文作者(Olivier Bronchain等)发现[USS20]给出的实现在实际环境中并不安全,因此作者给出了相关的攻击并分析了不安全的原因,并且进一步给出了相应的改进方案。因此在介绍本论文之前,我们需要简要回顾一下[USS20]论文给出LAEAD的实现方案,而由于[USS20]论文是对一个理论上抗泄漏的AEAD方案的实现,因此我们需要首先了解这个LR-AEAD是如何构造的[KS20]。
Retrofitting Leakage Resilient Authenticated Encryption to Microcontrollers 相关工作
抗泄漏的AEAD方案
从图中我们可以看到,该LAEAD方案包含四个函数——两个伪随机函数F,F‘,一个伪随机数生成器PRG,以及一个hash函数H。这个方案要求F和F’都需要满足在侧信道泄漏的情况下仍然是伪随机的(刚开始作者要求F‘需要是不可预测的,但是后来Kramer和Struck证明了这个性质是不需要的)。因此我们可以发现,实现这个AEAD方案具体主要需要实现两个函数,LR-PRF和LR-PRG。
LR-PRF
作者使用的L-PRF是Marcel等人提出的。
初始方案如左图:Fk(x)F_k(x)Fk(x): 每个临时密钥具有两个明文信息。然后从初始密钥开始,利用初始密钥k进行加密,获得两个临时密钥。stage 2使用哪个临时密钥进行加密依赖于伪随机函数的输入x的第 i 比特。我们假设PRF的输入具有128比特,这样的话我们就需要128 个 stage。(由于每个临时密钥只使用两次,因此敌手很难进行侧信道攻击)
我们能想到的提升效率的方法就如右图所示:对于每个stage 选取2^k个明文信息,例如我们选取 k=8,也就是选取256个明文信息。这样每次就能使用x的8比特。这样我们就只需要(128/8)16个stage了。这样虽然提高了效率,但是同时也会降低安全性。因为这样每个临时密钥就被使用了256次,增加了敌手通过侧信道攻击恢复临时密钥的风险。
上面这个方案在一般的情景下仍然不是抗泄漏的。作者又提出了AES的S盒并行来进一步增加侧信道安全性(由于并行会增加侧信道攻击的噪音)。然而,在这种情况下,敌手仍然有可能通过divide and conquer策略来一步步恢复所有密钥。
作者为了进一步增加侧信道攻击的难度(准确来说应该增加divide and conquer的难度),作者为每一层精心挑选了加密的明文信息。即:把每个明文信息都设置为相同的字节进行及联,这样敌手在进行攻击的时候,由于第一层AES加密每个S盒都具有相同的输入,这样敌手即使是用了 divide and conquer策略,也仍然需要确定每个S盒的顺序,这样就进一步增加了敌手完整的恢复密钥的难度。
但是这样保证安全性其实要求两个条件:
- 每个S盒的侧信道泄漏函数需要是相同的
- 利用未知的密文进行侧信道攻击是困难的
L-PRG
该L-PRG也是利用AES算法不断更新临时密钥,从而达到抗侧信道的性质的。和LPRF不同的是,这个函数使用的明文信息需要进行保密。
Hash算法
Hash算法由于不需要抗侧信道攻击的性质,因此可以直接运用SHA256。
作者利用上面这些组件的实现,就可以获得一个抗侧信道攻击的AEAD了。作者在STM32和EFM32上进行了测试,说明了这种实现方式是侧信道安全的
Improved Leakage-Resistant Authenticated Encryption based on Hardware AES Coprocessors
作者在这篇论文中分析了上一篇论文方案中存在一些不合理的方面并给出了进一步的改进。
不合理之处
- 在上面LAEAD方案中存在标签验证的比较操作,这个操作需要在实现层面进行保护(例如通过masking技术),但是这项技术和上篇论文的主题(使用硬件来保证测新到的安全性)不相符合。
- 上面使用的L-PRF在实际使用中其实并不是完全抗侧信道攻击的,原因是上面L-PRF安全性要求每个S盒的侧信道泄漏函数需要是相同的,但是(Olivier Bronchain等)发现在实际芯片中,不同S盒侧信道泄漏不完全相同,并且这个差异性可以被使用来进行SPA攻击。
关于标签验证操作的攻击:
首先看一下上一篇论文中给出的AEAD解密方案:
特别注意一下在14行,代码中实现是直接利用真实标签和敌手给的标签进行比较。这个相比的操作在C语言中写出来就是下面的代码(进行位运算速度更快)
攻击者可以选择随机的标签S,访问LR-ARAD的解密函数,并进行侧信道攻击。下面是选择的标签S的数据量和成功恢复标签成功率的关系。我们可以看到,敌手大概需要3000次左右的解密操作就能恢复一个32比特长度的标签了。