针对模幂运算的测信道攻击
\quad
在公钥密码体系中,主要的计算代价在于使用秘密的指数的指数操作,例如,RSA。
\quad
但在实际应用时,公钥密码算法每次都是用随机的秘密指数或者使用盲化手段增加测信道攻击的难度,致使算法即使处理相同的数据运算也是不同的,攻击者只能利用
s
i
n
g
l
e
e
x
e
c
u
t
i
o
n
single\ execution
single execution 攻击。
一、 基本模幂运算介绍
Algorithm 1 Binary exponentiation algorithm
input : a,m,n
output : a^m (mod n)
s:=1
for i from |m|-1 to 0 do:
s: = s*s (mod n)
if (m[i] = 1), then :
s:= s*m (mod n)
return s
二、模幂运算的攻击
-
从Algorithm 1可知,当d[i]为1时,多执行了一次乘法,当d[i]为0时,乘法操作就被忽略了。第一次对这个算法的测信道攻击是Kocher1996.
Kocher 使用的是基于时间的侧信道攻击,结合统计学工具,使用5000个样本,以0.885的概率成功恢复秘密指数(128bits)。 -
Walter2001本质 是一种利用 data dependent leakage 的攻击手段。对于秘密指数的每一比特都会对应的一个大整数模乘法,利用乘法器处理乘法时对数据的依赖,可以建立对指数的某一比特的联系,然后逐个比特的恢复指数(nibbled at and consumed by tackling individual layers one by one in any order.)。
-
IIT2002使用的一种 address-bit DPA 攻击。
address-bit DPA 攻击利用的是从不同的地址加载相同数据的差异。我们都知道从具有不同地址的寄存器加载不同的数据功耗肯定是不同的。 如果将数据差异性消除,只观察地址的差异就可以推敲出密钥。
三、滑动窗口求模幂
滑动窗口是使用预计算的最快的模幂算法之一。由于它的效率,滑动窗口法已被广泛和实际地应用于许多RSA-CRT的实现中。下表总结了当前主流密码开源库中模幂用到的算法。
left-to-right
假设滑动窗口大小为
ω
\omega
ω
先将指数
e
e
e 用二进制表示,从左到右,从遇到非0比特开始,从左往右滑动最大长度
ω
\omega
ω内遇到最后一个非0比特截至作为当前的窗口。按照如此方式,每个窗口的值属于集合
{
1
,
3
,
⋯
,
2
ω
−
1
}
\{1,3,\cdots,2^{\omega-1}\}
{1,3,⋯,2ω−1},将每个窗口值记为
e
i
e_i
ei,则
e
=
∑
e
i
⋅
2
i
e = \sum e_i\cdot 2^i
e=∑ei⋅2i.
伪代码如下:
right-to-left
与 left-to-right相同,只是从右往左滑动:
人们认为滑动窗口在某种程度上是安全的,可以抵御类似于简单功率分析(SPA)的侧信道攻击,因为攻击者不能完全知道从滑动窗口的平方-乘法运算序列中得到完整的指数,但在CHES 2017 BBG+17 中,展示了通过滑动窗口进行模幂运算也是不安全的。
四、添加盲化因子的模幂运算
\quad
在RSA体制中,解密或者签名使用的是
x
d
(
m
o
d
n
)
x^d\pmod n
xd(modn),但容易遭受章节二中的侧信道攻击,所以 Kocher 建议将
d
d
d 替换成
d
+
r
ϕ
(
n
)
d+r\phi(n)
d+rϕ(n),
r
r
r是一个随机数。这时有
x
d
≡
x
d
+
r
ϕ
(
n
)
(
m
o
d
n
)
x^d\equiv x^{d+r\phi(n)}\pmod n
xd≡xd+rϕ(n)(modn), 因为
x
ϕ
(
n
)
≡
1
(
m
o
d
n
)
x^\phi(n)\equiv 1\pmod n
xϕ(n)≡1(modn).
\quad
使用盲化后的指数的方案可以有效防御上面的攻击。
添加盲化因子的模幂运算仍然存在的信息泄露
Bauer2012 采用 operation-dependent 攻击,他们假设攻击者知道每个盲化因子 r j r_j rj的一些信息,然后穷举未知的比特,最终得到 r ∼ ϕ ( n ) \overset{\sim}r\phi(n) r∼ϕ(n)的估计值, r ∼ \overset{\sim}r r∼ 是 r r r 的估计,与已知的 d + r ϕ ( n ) d+r\phi(n) d+rϕ(n) 的已知信息进行匹配,排除不符的 r ∼ \overset{\sim}r r∼,得到所有的 r j r_j rj 后,就可以推测出 d d d 了。
- 猜测每个盲化因子 r j r_j rj的一些信息,通过筛选得到一些候选的 r j r_j rj。
- 然后利用密钥中的冗余信息,得到唯一的最有可能的 r j r_j rj。
- 根据2中的 r j r_j rj 反解 d d d。
总结
添加盲化因子的模幂运算与滑动窗口算法仍然存在侧信息泄露,但我们可以将滑动窗口与添加盲化因子结合起来,对于这种方案,很难实施侧信道攻击。