一、对 DPA 攻击的反制措施
1 掩码
- 定义:所有中间值通过一个随机值(掩码)m 隐藏起来,该掩码由密码设备内部生成,通常与中间值进行异或
- 原理:由于掩码是随机的且对攻击者未知,被掩码中间值无法与能量迹对应起来
- 问题:只要有使用相同掩码的两个中间值(产生掩码和对中间值使用掩码),即可进行二阶 DPA 攻击
- 解决办法:将掩码方案和其它反制措施结合起来
2 随机化
-
定义:随机改变密码算法的执行序列,将对中间值的操作随机分布在一段时间内,降低中间值和能量消耗的相关性
-
具体措施:插入随机伪操作、等待状态
-
分类:
(1)在算法执行前后加入额外轮,隐藏算法的开始或结束时间
(2)在算法内部随机化操作序列
-
效果:根据 [CCD00],如果中间值对应某一确定时刻的概率为 p,则所需能量迹数量为 \(p^2\)
二、AES 实现
1 反制措施
将掩码和随机化结合起来,所有轮中间值都使用了掩码,第一轮和最后一轮为随机化区域
2 掩码实现(见《能量分析攻击》9.2.1)
-
使用 6 个不同掩码字节,前 2 个 M 和 M' 为字节替换操作的输入和输出掩码,其余 4 个 \(M_1\), \(M_2\), \(M_3\) 和 \(M_4\) 为列混淆操作的输入掩码
-
对加密函数的掩码
-
预计算被掩码 S 盒 S' 使得 \(S'(x\oplus M)=S(x)\oplus M'\)
-
预计算列混淆输出掩码 (\(M_1'\), \(M_2'\), \(M_3'\), \(M_4'\)) = MixColumns(\(M_1\), \(M_2\), \(M_3\), \(M_4\))
-
轮函数
- 对明文使用 (\(M_1'\), \(M_2'\), \(M_3'\), \(M_4'\)) 掩码
- 轮密钥加操作将掩码转换为 M
- 使用 S' 盒进行字节替换操作将掩码转换为 M'
- 列混淆输入掩码将掩码转换为 (\(M_1\), \(M_2\), \(M_3\), \(M_4\))
- 列混淆操作将掩码转换为 (\(M_1'\), \(M_2'\), \(M_3'\), \(M_4'\))
- 行移位操作不改变掩码
注:此处轮函数与传统 AES 算法实现顺序不同是为了方便随机化
-
最后一轮执行轮密钥加操作后消除掩码
-
-
对密钥方案的掩码
使用 \(M_i'\oplus M\) 掩码
3 随机化实现
3.1 随机化操作序列(只在随机化区域实现,即第 1 轮行移位前和第 9 轮行移位后)
在 AES 算法每一轮轮密钥加和字节替换操作重复进行多次且相互独立,列混淆操作列的顺序也可以进行替换
3.2 前后加入额外轮
在智能卡中其它存储区域,基于与真实状态地址相同汉明重量的地址上的虚拟状态生成伪操作
三、安全性分析
1 理论分析
- 所有中间值都进行掩码处理,能够抵抗 SPA、一阶 DPA 和模板攻击
- 随机化区域内操作在确定位置的概率为 \(p=\frac{1}{16+4×n}\),需要 \((16+4×n)^2\) 倍能量迹,能够抵抗二阶 DPA 攻击
- 随机化区域外操作已经经过列混淆处理,需要猜测的密钥至少为 32 位,实际难以实现
2 实践分析
- 没有一阶 DPA 攻击能够成功
- 选定第一轮字节替换的 2 个输出字节(随机化区域内)作为 2 个中间值进行二阶 DPA 攻击,相关系数从 0.24 降为 0.04