参见《RSA 算法的错误敏感攻击研究与实践》
RSA 算法简介
RSA 算法原理:
1) RSA 算法密钥产生过程
(1)系统随机产生两个大素数
p
p
p 和
q
q
q,对这两个数据保密;
(2)计算
n
=
p
×
q
n = p \times q
n=p×q (公开),计算欧拉函数
ϕ
(
n
)
=
(
p
−
1
)
(
q
−
1
)
\phi(n) = (p-1)(q-1)
ϕ(n)=(p−1)(q−1)(保密);
(3)随机选择满足
g
c
d
(
e
,
ϕ
(
n
)
)
=
1
gcd(e, \phi(n) )=1
gcd(e,ϕ(n))=1 的
e
(
1
<
e
<
ϕ
(
n
)
)
e (1 < e < \phi(n) )
e(1<e<ϕ(n)) 作为公钥,则加密密钥
(
e
,
n
)
(e,n)
(e,n);
(4)计算私钥
d
d
d,使其满足
e
d
≡
1
(
m
o
d
ϕ
(
n
)
)
ed \equiv 1(\mod \phi(n))
ed≡1(modϕ(n)),私钥为
(
d
,
n
)
(d,n)
(d,n)。
2)RSA 加解密过程
首先,将需要加密的明文信息转化为二进制数,然后将其进行分组(分组长度根据实际需要来定),最后对每个分组进行加解密操作:
(1) 加密运算:使用公钥
e
e
e 和要加密的明文
m
m
m,进行
c
=
m
e
m
o
d
n
c = m^e \mod n
c=memodn 运算即得密文;
(2)解密运算:使用私钥
d
d
d 和要解密的密文
c
c
c, 进行
m
=
c
d
m
o
d
n
m = c^d \mod n
m=cdmodn 运算即得明文。
针对 RSA 算法的侧信道攻击
目前智能卡的密码芯片很多都采用了RSA算法来保护用户个人信息。然而,如果在智能卡运行过程中没有施以任何保护,攻击者则可以轻而易举地利用侧信道信息来破译密钥。其中功耗攻击和故障攻击作为侧信道攻击中最为有效的两种攻击方法,对智能卡安全而言是一个巨大的挑战。实施功耗攻击首先要获取密码芯片运行过程中的功耗曲线,然后通过分析找到功耗曲线和密钥之间的相关性,以此来破译算法密钥;故障攻击首先要确定注入错误的时间点,然后在该点注入足够大的错误使得密码芯片运算发生错误,最后利用得到的错误输出和算法特性等来获取密钥相关信息。
功耗攻击
Kocher等人发现可以利用密码芯片运行过程中的功耗曲线来破译加密算法密钥。简单功耗攻击正是基于这个特性,其只需获得密码芯片完整运行一次的功耗曲线就可以从中得出算法密钥。
智能卡在执行加解密算法时,电路会根据算法的运行步骤而处于不同的状态,由于电路所处的状态不同会导致电路运行过程中的消耗功耗不同,例如当设备处于存储数据和算术运算时设备所需的功耗是不同的。SPA核心思想就是利用获取得到的功耗曲线,通过分析将电路所处的状态区分开来,从而得到算法实施过程的各个时间点,推测实际运算过程涉及到的秘密参数,以此来破译算法密钥。
对于RSA算法来说,在加解密过程中进行最多次的是模幂运算。SPA利用这个特性,通过分析模幂运算过程中的功耗曲线来确定参与运算的指数位为1或0.其中L-R模幂算法尤为明显。L-R模幂算法如下所示:
在上述算法步骤2.2中,当
e
i
=
1
e_i=1
ei=1 时,
s
<
−
s
⋅
c
m
o
d
n
s <- s\cdot c \mod n
s<−s⋅cmodn 就会被执行一次;当
e
i
=
0
e_i = 0
ei=0 时,则算法直接跳过步骤2.2。基于这一点,密钥位的不同使得算法执行不同的分支,对应的,攻击者可以从功耗曲线上看出算法执行的不同路径。因此通过检测一次完整的RSA解密过程,获取功耗曲线,从功耗曲线上就可以推测出算法的具体实现过程,从而就可以对密钥进行重构。
从上述分析来看,采用SPA攻击RSA具有简单、高效的特点。针对SPA攻击方式的特征,其防御工作可以从几个方面展开:使攻击者不能够正确区分模乘和摸平方操作;消除算法中不平衡操作,可以对每一个比特都进行模乘和摸平方操作;在主要的运算中插入伪指令以消除或减小中间数据和功耗轨迹之间的相关性;阻止能量消耗的采集。近几年来,密码学界对功耗分析的威胁性越来越重视,并针对其防御投入很大的人力和物力,不断地提出有效的防御方案,目前具体有以下几种防护措施:减小信号强度、引入随机噪声、随机过程中断、非线性密钥升级。
故障攻击
故障攻击是指通过利用物理方法(如电磁辐射、X光、微探测或切断路线)干扰密码信息的正常工作,使密码芯片产生错误的操作,然后对密码芯片的输出进行收集和分析,从而可以得到芯片中的密钥信息。目前有很多成熟的故障攻击方法。
针对RSA,Yen提出了一种新的思想,即,安全错误攻击(Safe-Error Attack),其主要思想如图所示:
RSA算法执行了两个分支,分别是 operation1 和 operation2,运算完成后将结果存储在变量C当中。攻击者可以在算法执行者两个分支运算时注入错误,由于算法对错误做出了不同的反应,左边的计算没有受到影响,输出了正确的结果 C;而错误注入对 operation2产生了影响使其输出了错误的结果 C,因此根据这二者的不同,攻击者可以很直观地分辨出算法执行了哪个步骤,从而获取有关密钥的信息。
为了防范SPA,L-R模幂算法在密钥为0时加入了虚假操作,该操作对最终的结果没有任何影响。Joye等提出了C-safe error攻击,该攻击方式正是利用上述特点,在密码芯片进行模幂运算时,注入错误的时钟频率,使得本步的计算发生错误,然后继续运算,将得到的结果和正确的输出进行比较,如果二者一致,则说明本步的密钥为0,反之,则为1。如此反复,直到得到正确的密钥。为了防御 C-safe error攻击,Joye等提出了Powering Ladder 模幂算法。
错误敏感攻击
在FSA过程中,除了错误密文之外,攻击者还可以利用错误敏感信息。所谓错误敏感就是将错误注入到密码芯片中而恰使其好产生错误密文时的状态。当攻击者逐渐加大故障注入的强度时,可以辨别出故障开始出现和故障变得稳定时的临界状态。类似于大多数侧信道攻击,如果错误敏感信息和敏感数据之间的关系是已知的,那么FSA可以得到密钥的相关信息。
由于在密码芯片中电路信号的转换是数据依赖的,因此可以肯定的是错误敏感信息也是数据依赖的。数据依赖的基本概念就是指电路的输入信号对电路的运行时间起确定性左右。下面使用与门、或门和异或门作为例子来解释信号时序延迟的数据依赖的一般机制。如下图所示:
图中
T
X
T_X
TX 表示信号
X
X
X 的延迟。对与门(a),假设
T
A
<
T
B
T_A < T_B
TA<TB,即信号A到达与门的速度的快于信号B。如果信号A为0,则信号C的延时取决于信号A,即
T
C
=
T
A
+
T
A
N
D
T_C = T_A + T_{AND}
TC=TA+TAND,其中
T
A
N
D
T_{AND}
TAND为与门的延时;反之,如果信号A为1,信号C的值取决于信号B,即,
T
C
=
T
B
+
T
A
N
D
T_C = T_B + T_{AND}
TC=TB+TAND。即,信号A为1,则输出结果会更慢。
类似的,对于或门(b),仍然假设
T
A
<
T
B
T_A < T_B
TA<TB。如果信号A为1,
T
C
=
T
A
+
T
O
R
T_C = T_A + T_{OR}
TC=TA+TOR;反之,
T
C
=
T
B
+
T
O
R
T_C = T_B + T_{OR}
TC=TB+TOR。即,信号A为1时,输出会更快。由以上分析可知,一旦电路结构确定,数据依赖性的错误敏感度也会被固定。攻击者可以利用电路结构来分析得到数据依赖性,以此来获得错误敏感信息。
相较于差分故障攻击攻击,FSA攻击不需要通过假设只有几个比特或将注入的故障限制在一个小的子空间内。即使DFA可能只需更少的错误注入次数就可以获得密钥,但是它要求攻击者必须拥有将错误注入指定位置的能力。虽然攻击者可能拥有整个攻击设备,可以对设备进行多次非入侵式的注入故障,但是它需要有大量的知识来注入预期的故障。此外,FSA所需要的信息不包括错误的输出信息。因此,对于检测到故障即停止计算的密码设备,FSA的攻击仍然是一个潜在的威胁。
从L-R模幂算法的实现中可以看到,只要能够正确区分算法执行的是模乘操作还是模平方操作,就可以得到该比特位为1还是0。针对该特性,FSA攻击可以从模乘操作和模平方操作对错误时钟频率的不同敏感度入手,将错误时钟频率作为敏感信息来区分本步的具体操作,从而破译私钥。
RSA在智能卡中的应用十分广泛,研究该类智能卡的错误敏感攻击和针对性的防御措施具有重要的意义。