在Barenghi和Pelosi的论文中,描述了使用确定性ECDSA时,可以使用故障攻击来导出密钥,如@Thomas_Pornin的RFC6979中所述。确定性(EC)DSA 。在这种情况下,攻击者的目的是从正确的签名$(r,s)$和错误的$(\ tilde r,\ tilde s)$的值中恢复秘密密钥$ d $的值。 。攻击者可以在未知数$ d $和$ k $中的$ \ mathbb {Z} ^ * _ q $上建立以下联立方程组:

$$ \ left \ {\ begin { align} s&\ equiv_q(\ texttt {H}(\ texttt {msg})+ d \ cdot r)\ cdot k ^ {-1} \\ \ tilde s&\ equiv_q(\ texttt {H}(\ texttt {msg})+ d \ cdot \ tilde r)\ cdot k ^ {-1} \ end {align} \ right。 $$

并解决

$$ \ left \ {\ begin {align} d&\ equiv_q \ textstyle \ frac {(s-\ tilde s)\ cdot \ texttt {H}(\ texttt {msg})} {r \ cdot \ tilde s-\ tilde r \ cdot s} \\ k&\ equiv_q s ^ {-1} \ cdot(\ texttt {H}( \ texttt {msg})+ d \ cdot r)\ end {align} \ right。 $$

导出密钥所需的计算量可以忽略不计,并且在使用不可靠的故障注入技术的情况下,有可能确认$ d $和$ d的正确值。已通过[9]中指定的过程提取了$ k $,得出与$ d $相对应的确定性$ k $,并将其与从联立方程中获得的确定性$ k $进行比较。


确定性ECDSA可以免受此类故障攻击吗?

#1 楼

正如fgrieu在回答中所说的那样,这是有可能的。

有多种方法可以保护确定性ECDSA免受故障攻击,但是这些方法将取决于您的故障模型。

如果仅考虑单个故障模型,那么任何要求攻击者执行两个故障以实现其目标的构造都是可以接受的对策...另一方面,如果您认为攻击者无处不在并且可以执行其选择的错误在芯片上任何位置的任何时间点,那么您很可能找不到对付她的任何方法。这是一个普遍的假设,在实际实验的支持下,很难在同一计算上执行两个局部故障,如果故障值很重要,则更难做到。

那么,如何处理单个故障?确定性ECDSA的错误?

您可以按照fgrieu所说的做,并执行验证过程,但是最后一步的第二个错误可能只是触发验证以输出“ true”而不是“ false”,但是处于另一个错误模型中,攻击者可以执行两个错误...现在,还有其他方法会使第二个错误对于攻击者而言更加困难:

第一种方法由Thomas Pornin描述自己在RFC6979第3.6节(强调我的)中:


可能在bit2octets(H(m))之后将附加数据添加到HMAC的连接中,串联后:
>
     K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')


用例可能是一种协议,该协议需要在无法访问高质量随机源的系统上使用非确定性签名算法。足以保证附加数据k'不重复(例如,签名计数器或单调时钟),以确保“随机”签名以密码方式与普通(EC)DSA签名是无法区分的。 >在[SP800-90A]术语中,k'是“附加输入”,可以在生成伪随机时将其设置为参数
位。可以将这种变体视为“增强”附加数据k'的来源的随机性。


这是XEdDSA选择的方法,信号,以防止故障对其安全性产生影响。它既可以提供确定性ECDSA对偏向随机源的额外安全性,又可以看起来与ECDSA完全兼容,并且可以有效抵抗XEdDSA文档中所述的故障攻击。但是可悲的是,您再也无法获得签名的确定性。

实现相同目标的第二种方法可能是对相同数据进行两次签名,并比较两个数据的输出,如果它们匹配继续进行,否则计算中将出现故障或多个不同步的故障。这样做的好处是,尤其是对于EdDSA,它不承担完整验证的费用,因为在此验证是一种操作成本更高的方式(对于ECDSA而言,成本也更高)。但仍然会使过程慢一倍。

第三种可能性是使用为RSA引入的所谓“传染性”对策,以便最终计算的任何部分中的故障都会使故障随机化。输出。这是最近的一篇论文(针对FDTC 2017发布),针对EdDSA采取了这种对策。这种对策通常将以相同的方式组合同一哈希的两种不同实现,如果两种方法都输出相同的数据,则可以恢复正确的值,但否则不会引起任何关注。但是它是非常“本地的”:它可能无法防止在签名过程的其他步骤中发生错误。

我个人喜欢将确定性ECDSA添加回随机性,我发现这两者都很优雅,因为它与标准ECDSA且高效,因为与许多其他方式不同,它在实践中几乎没有成本。

PS:顺便说一句,Barenghi和Pelosi表示EdDSA对这类攻击表现出结构上的抵抗力,但实际上并非如此,因为仍然有可能获得足够的机密材料来模仿有效签名,而只有秘密密钥才可以。所有者可以检测到。

#2 楼

是的,可以保护ECDSA(包括确定性)免受故障攻击。一个想法是在释放签名之前检查任何计算出的签名(通过验证者的算法)(如果验证失败,则不释放任何内容;也许将密钥清零并声明设备有故障或受到攻击)。

这是适用于许多签名方案的相当通用的技术。在Eurocrypt 1997的诉讼中,Dan Boneh,Richard A. DeMillo,Richard J. Lipton已经讲授过关于检查密码协议错误的重要性。
,并且正如以上文章所述,这种对策非常昂贵:它使签署的成本增加了一倍以上。

可以采用成本较低的对策;请参阅Lery的出色答案。