简介
故障攻击注入故障的方式有多种,如电压变化、改变时钟周期、温度变化、激光和X射线、等等。这些方式都是为了使攻击对象在执行计算时出错,导致输出错误结果。这些错误信息可能被攻击者用来破解密钥。这里简单介绍对使用中国剩余定理(CRT)的RSA算法的攻击,即RSA-CRT,通过故障攻击可以完全破解密钥。
RSA加解密过程
-
选择两个大素数,p、q (这里的p和q不能太小,太小容易被破解,太大计算时间比较长)
-
n=p*q。Φ(n) = (p-1)(q-1)(这里的Φ(n)是欧拉函数:Φ(n)的值为小于n且与n互质的个数)
-
选择一个公钥e(1<e<Φ(n)),e不是p-1与q-1的因子。gcd(e,(p-1)(q-1)) = 1(e与Φ(n)互素)
-
私钥d:(d*e) mod (p-1)(q-1) = 1
-
加密(密文:c,明文:p):
c = p^e mod n。公钥(n,e)
-
解密:
p=c^d mod n。私钥(p,q,d)
CRT加速RSA解密
在使用RSA算法对密文进行解密时,私钥指数d和模数n的位数一般比较大,计算起来比较困难。可以使用中国剩余定理对其进行解密。
-
可以将 m = c^d mod n 写成
m1=c^d mod p
m2=c^d mod q
-
n得到降低,d位数还是很大,继续降低d的位数,可得:
c ^ d mod p = c ^ ( d mod Φ ( p ) ) mod p = c ^ ( d mod (p-1) ) mod p
-
最终求解为:
S = CRT(m1, m2) = m2 + ((m1–m2) (q^(–1) mod p) mod p)⋅q
RSA-CRT故障注入攻击
一般的RSA-CRT计算过程为:
- 计算 m1 = c ^dp mod p
- 计算 m2 = c ^dq mod q
- 计算 h = q^(-1)⋅(m1 - m2) mod p
- 计算 m = m2 + h⋅q
一个有效的错误和一个合理的攻击窗口即可恢复秘钥。
输出错误解密密文 m* = m2 + h*⋅q
m - m* = (h - h*)⋅q
gcd(m - m*, n) = q
通用防御:
通用防御的方法包括且不限于以下几种:
- 最终签名结果的计算在故障检验步骤之后进行,具体为:首先在组合步骤之前产生随机数
- 多次随机冗余操作
- 传感器检测:电压变化、改变时钟周期、温度变化传感器等