第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-describe-some-basic.html

为了让这篇文章保持简单,我们将会我们将讨论所谓的“香草”RSA(在加密中不使用随机性),并强调少量潜在的侧通道攻击和对策。

让我们回顾一下简单的RSA加密方案。
密钥生成:选择一对秘密的素整数\(p\)和\(q\),然后计算模\(N = pq\)。一个整数\(3 \le e \le \phi(N)\),和\(\phi(N)\)互质。然后公钥对就是\((N,e)\)。私钥式独一无二的整数\(3 \le d \le \phi(N)\),使得\(ed=1 \mod \phi(N)\)。

加密一个消息\(m \in Z_N\),我们能计算\(m^e \mod N\)。

解密一个私钥\(c \in Z_N\),我们能计算\(c^d \mod N\)。

一个确定密钥的SPA类型的攻击

我们首先给出一个示例,说明如何在解密操作期间泄漏关于密钥d的信息。一个典型的实现指数幂乘法的方式就是分支程序。例如,乘加算法能有效的计算一个被二进制表达的幂乘操作。

假如说\(d = \Sigma_{0 \le i \le n}b_i2^i\),其中\(b_i \in \{0,1\}\)。那么,

\[c^d = \Phi_{0 \le i \le n}c^{b_i2^i}\]

那么我们就可以通过下面的算法来计算\(c^d的值了\)。

  • \(ANS \leftarrow 1\)
  • \(fac \leftarrow c\)
  • \(For 0 \le i \le n\),do
    • \(if \space b_i = 1\)
      • \(ANS \leftarrow ANS \times fac\)
      • \(fac \leftarrow fac^2\)
    • \(Else,\)
      • \(fac \leftarrow fac^2\)
  • \(return ANS\)

算法的行为取决于每个\(b_i\)是0还是1。因此,如果使用这种算法解密RSA密文,它所花费的时间或它的功耗可以显示每一位\(b_i\)的值,从而显示密钥d。这将是一种spa式的攻击,因为只需要一个跟踪。

为了防止这种攻击,必须使算法的两个分支在攻击者看来是相同的,即使平方和乘法算法的两个分支花费相同的时间运行或消耗相同的能量。

一个SPA类型对明文的攻击

上面展示了解密过程中如何危害密钥。但是攻击者可能对特定的明文感兴趣,\(m\)(毕竟,加密被用于设计保持消息机密)。同样,如果加密操作是一个依赖于m值的分支程序,那么单个加密的运行时或功耗可能会在SPA类型攻击中泄漏关于m的信息。特别要注意的是,必须在加密中执行模操作。在大多数实现中,不是在取幂结束时对一个非常大的整数进行单个约简,而是在取幂算法中进行许多次模操作,以保持所涉及的数字(相对)较小。

作为一个例子,我们假设在循环中执行下面的操作:

  • while \(ANS > N\)
    • \(ANS \leftarrow ANS-N\)

在这里,因为机密的时刻,指数是已知的,根据运行所需的时间和消耗的电量泄露关于m的基本信息(参见David关于蒙哥马利算法攻击的文章)。

再一次,以防止这种攻击,我们必须确保我们的使用相同的时间和消耗相同的功率来减少中间值模N,不管他们是什么大小。(由于我们知道底的精确指数和取值范围,所以可以很容易地找到上限)。

防止对密钥进行DPA类型的攻击

即使我们模糊了依赖于d的解密中的任何分支,在执行解密的幂运算时执行的操作的精确细节仍然依赖于该指数(以一种不太明显的方式)。:因此,在多次解密之后,可能会出现解密密钥与操作持续时间或功耗之间的统计关系。因此,我们还需要防止更微妙的dpa风格的攻击,即攻击者对大量跟踪使用统计技术来测试关于秘密密钥的假设。

要做到这一点,我们必须消除密钥和每次执行的计算之间的直接依赖关系。这涉及到盲处理,即在不影响结果的情况下将一些随机噪声注入到求幂运算中。在解密中,我们引入随机性,当\(d\)的在\(Z_{\phi(N)}\)中\(e\)的逆,我们能够加或者减\(\phi(N)\),这样结果也不会改变。因此解密\(c \in Z_N\),选择一个随机的\(r \in Z\)然后计算\(d^{'} = d + r\phi(N)\)。然后计算消息\(c^{d^{'}}\)也和\(c^d \mod N\)相同。关键是加法通常不是一个分支操作,所以增加\(r\phi(N)\),\(d\)不会泄漏在一个跟踪信息,并使用一个新的随机r为每个解密防止DPA-style攻击。

Coppersmith's的SPA类型攻击来确定明文

我们使用一个特殊但是有趣的攻击来结束这篇文章,这个攻击只会发生在e很小的时候,例如\(e=3\)是在加密时刻为了效率的一个选择。这有一个定理叫史密斯定理,这里会有介绍,一个攻击者能有效率的找到所有的小整数的解:\(f(x)=0 \mod N\),其中\(x < N^{1/e}\)。如果\(m<N^{1/e}\),那么直接就通过开方计算出来。但是如果\(m\)的某些位泄露,那么我们就可以写成\(m = m_k+m_u\)。这样我们就有多项式\(f(X) = (m_k+X)^e\)。因此我们需要确保\(m\)的位数在加密过程中不被泄露。

为了对抗这种攻击,我们再次使用了盲方法:我们在取幂之前给m引入一些随机性,然后再将其移除。简单来说,我们取一个随机数\(r\),然后计算\(rm \mod N\),然后是\((rm)^e \mod N\),最后计算\(r^{\phi(N)-e}\)。显然,密文是一样的,如果没有盲方法,但泄漏的指数运算现在是独立于m的。

这篇文章应该让您了解可以安装在加密方案上的那种侧通道攻击,以及实现可以避免它们的方式。

上一篇:【代码超详解】CometOJ C0896 [SDOI2008]仪仗队(欧拉函数 + 思维,4 ms)


下一篇:刚性方程