46、随机幂运算算法全解析

随机幂运算算法全解析

1. 随机幂运算算法简介

随机算法在计算函数 $f$ 时,会将函数 $f$ 的常规输入与随机数流相结合。其设计的巧妙之处在于,即便攻击者掌握了计算 $f$ 所使用的原子操作的部分或全部知识,也难以轻易推断出部分或所有输入的值。不过,函数 $f$ 的输出依然能被正确计算出来,并且该输出值与随机输入流无关。

在幂运算函数的场景中,我们假设侧信道泄漏会暴露一些关于对大数字进行算术和读写操作的部分信息。我们的目标是让攻击者在密码令牌的使用周期内,无法通过这些泄漏信息推导出秘密指数。

以常见的平方 - 乘法算法为例:

Inputs: M, bit representation of D = dn−1dn−2 ...d2d1d0
Output: C = MD
C ←1
For i ←n−1 downto 0 do
Begin
    C ←C2
    If di ̸= 0 then C ←C ∗M
End

在这个算法里,如果攻击者完全知晓平方和乘法的操作顺序,就能唯一确定整个指数。具体而言,每个平方操作对应一个指数位,若平方操作后紧跟乘法操作,该指数位为 1;若平方操作后还是平方操作,该指数位为 0。

但实际情况中,泄漏的信息往往存在误差,比如一些平方操作可能被错误记录为乘法操作,反之亦然。所以通常需要进行误差校正。当误差数量较小时,通过搜索附近的密钥,能在合理的计算时间内找到真实的密钥 $D$。可以利用对应的公钥 $E$ 和关系式 $P^{ED} = P$ 来轻松验证其正确性。在搜索密钥空间时,通常需要采用智能的方法,优先选择最可能的替代方案,才有希望找到密钥。

在 RSA 等典型协议中,同一秘密密钥 $D$ 会被多次使用。在此期间,可能会通过添加 $\varphi(N)$ 的随机倍数($N$ 为公共模数)来对密钥进行盲化处理。随着秘密密钥的多次使用,关于原子操作的数据会不断积累,这些数据有可能被成功组合起来,从而暴露密钥。然而,像 ECDSA 这样的许多协议,每次都会生成一个新的随机数作为秘密密钥。在这种情况下,攻击者只有一次获取密钥的机会,而且在使用密码令牌进行实际签名的同时,几乎不可能从其中提取出有用的侧信道信息。

随机算法的一个重要特点是,对相同输入的连续使用会产生不同的操作序列。这使得 Kocher 提出的通过多次使用同一密钥进行平均的攻击方法失效。但我们也会探讨如何以类似 Kocher 的方式组合泄漏数据,从单次使用秘密密钥中提取操作符和操作数信息,这与之前章节中需要多次应用同一密钥进行平均才能获取信息的攻击方式有所不同。此外,当侧信道泄漏发生时,使用更长的密钥可能实际上会削弱密码系统,而不是增强它,这是一个违反直觉但重要的结果。

2. Big Mac 攻击

Big Mac 攻击适用于 m 进制幂运算以及所有使用预计算输入密文 $C$ 的数字幂表的类似算法。之所以被称为 Big Mac 攻击,是因为秘密密钥的数字 $d_i$ 是独立确定的,就像某种著名快餐产品不同层的口味(如番茄、牛肉饼、生菜、奶酪等)一样。

m 进制幂运算算法如下:

Inputs: M, base m representation of D = dn−1dn−2 ...d2d1d0
Output: C = MD
Pre-computation of the table:
    M(1) ←M
    For i ←2 to m−1 do M(i) ←M ∗M(i−1)
Exponentiation of the message:
    C ←1
    For i ←n−1 downto 0 do
    Begin
        C ←Cm
        If di ̸= 0 then C ←C ∗M(di)
    End

攻击者首先要区分将 $C$ 提升到 $m$ 次幂($C ← C^m$)和乘以 $M$ 的数字幂($C ← C * M(d_i)$)这两个过程。然后,将乘法操作划分为不同的集合,使得每个集合中的数字 $d_i$ 具有相同的值。

攻击的背景是硬件乘法器消耗的功率在一定程度上取决于输入的汉明重量。对于大量逐字乘法 $a×b$(其中 $a$ 随机变化,$b$ 固定),其平均功率轨迹至少在一定程度上能反映 $b$ 的特征。对于标准经典乘法器,汉明重量相同的字 $b$ 的平均轨迹会比汉明重量不同的字的平均轨迹更接近。攻击成功的关键在于功率轨迹在足够多的字值组之间有明显变化,这主要取决于实验技术以及攻击者和设计者愿意付出的努力和成本。通过一些实验,可以根据给定的平均轨迹为 $b$ 的特定值分配一个概率。

攻击的思路是将 Kocher 功率分析的平均过程应用于数字与大整数的乘法轨迹,而非幂运算轨迹。具体步骤如下:
1. 把 $C ← C * M(d_i)$ 的轨迹切割成与组成操作 $C ← shift(C) + c_j * M(d_i)$ 对应的子轨迹($c_j$ 是 $C$ 的字级数字)。
2. 对这些子轨迹进行对齐和平均,得到一个应能反映 $M(d_i)$ 特征的轨迹,从而消除 $C$ 的字 $c_j$ 的影响。
3. 对密钥 $D$ 的所有 $n$ 个数字都进行此操作,然后使用欧几里得距离比较这 $n$ 个平均轨迹。具有相同数字值的轨迹会更接近,而不同数字值的轨迹则明显更远,这样就能进行划分操作。

在 RSA 中,输入 $C$ 和 $M$ 通常约有 1024 位,使用 8 位或 16 位硬件乘法器。这意味着 $C$ 会被拆分为约 64 个字,对这些轨迹进行平均足以消除平均轨迹对 $C$ 的依赖。而且,$M(d_i)$ 也约有 64 个字,在比较平均轨迹时,一对 $M(d_i)$ 不太可能有足够多相似特征的数字而导致混淆。

同样的技术也用于区分在获取 $C$ 的 $m$ 次幂时使用的平方(或乘法)操作。此时的平均轨迹是随机操作数 $C’$ 的轨迹,它与涉及 $M(d_i)$ 的任何乘法操作的轨迹以及其他 $m$ 次幂计算中使用的操作数的轨迹都不接近。因此,当对幂运算中的所有乘法操作(包括 $m$ 次幂中的乘法操作)进行划分时,可以识别出 $m$ 次幂的计算,并将使用相同指数数字的乘法操作集合分组在一起。所以,除非密钥长度较短且乘法器较大,否则通常可以从单次幂运算中或多或少准确地恢复出数字 $d_i$,进而恢复出密钥 $D$。

3. 数字表示与幂运算算法

本章介绍的所有随机幂运算算法都依赖于对秘密密钥 $D$ 的二进制表示进行随机重新编码。这可以通过以下两种基数转换算法实现:

固定基数的基数转换算法:

Inputs: D ≥0, base m > 1
Outputs: n, base m representation of D = (dn−1 ...d2d1d0)m
i ←0
While D > 0 do
Begin
    di ←D mod′ m
    D ←(D−di)/m
    i ←i+1
End
n ←i

可变基数表示算法:

Input: D ≥0
Outputs: n, base sequence mn−1 ...m2m1m0, digit sequence dn−1 ...d2d1d0
i ←0
While D > 0 do
Begin
    Select base mi
    di ←D mod′ mi
    D ←(D−di)/mi
    i ←i+1
End
n ←i

在这两个算法中,函数 $\text{mod}’$ 包含一个随机输入,允许有有限数量的替代输出数字 $d_i$,并且要保证下一行的除法 $(D - d_i) / m$ 或 $(D - d_i) / m_i$ 是精确的。输出满足以下关系:
$D = \sum_{i = 0}^{n - 1} d_i m^i = ((…(d_{n - 1} m + d_{n - 2}) m + \cdots + d_2) m + d_1) m + d_0$
$D = ((…(d_{n - 1} m_{n - 2} + d_{n - 2}) m_{n - 3} + \cdots + d_2) m_1 + d_1) m_0 + d_0$

当 $\text{mod}’$ 采用通常的 $\text{mod}$ 函数(返回除以 $m$ 的最小非负余数)时,图 17.3 的算法能提供常规的标准 $m$ 进制表示。例如,$m = 2$ 时得到二进制表示,$m = 10$ 时得到十进制表示。在这种固定选择下,算法的连续执行总是会得到相同的表示。将这些数字输入到以下左到右的幂运算算法中,就得到了正常的 $m$ 进制幂运算算法:

Inputs: M, representation of D = dn−1 ...d2d1d0
with respect to bases mn−1 ...m2m1m0
Output: C = MD
Pre-computation: a table containing M(d) = Md for each digit value d
C ←1
For i ←n−1 downto 0 do
Begin
    C ←Cmi
    If di ̸= 0 then C ←C ∗M(di)
End

图 17.4 算法的一个著名应用是滑动窗口幂运算算法。同样将 $\text{mod}’$ 设为 $\text{mod}$ 函数,若 $D$ 未重新编码的部分为奇数,则选择基数 $m_i = 2^r$;否则选择 $m_i = 2$。这样就得到了 $r$ 位或 1 位的窗口,$r$ 位窗口的数字为奇数,1 位窗口的数字为 0。将这些数字输入到上述左到右的幂运算算法中,就得到了滑动窗口幂运算算法。

$m$ 进制和滑动窗口算法从左到右处理指数 $D$ 的位或数字,即从最高有效位到最低有效位。而平方 - 乘法算法也可以从相反的顺序处理数字,如下所示:

Inputs: M, representation D = dn−1 ...d2d1d0
with respect to bases mn−1 ...m2m1m0
Output: C = MD
C ←1
For i ←0 to n−1 do
Begin
    If di ̸= 0 then C ←C ∗Mdi
    M ←Mmi
End

对于基数为 2 的情况,这两种处理方向的成本差异几乎完全取决于具体的上下文,例如数据在寄存器中的移动方式。而对于较大的 $m$,幂运算算法的左到右和右到左版本可以在内存需求和执行时间之间进行权衡。左到右版本需要空间来存储预计算的 $M$ 的幂,而右到左版本则需要在每次循环迭代时花费时间计算 $M$ 的数字幂。

对于密码学应用,通常希望以与幂运算中消耗数字相同的顺序对指数进行重新编码,即使用上述的基数转换算法与右到左的幂运算算法结合。还有一种可变基数重新编码算法:

Input: Binary representation of D = bz−1 ...b2b1b0 ≥0
Outputs: n, base sequence m0m1m2 ...mn−1, digit sequence d0d1d2 ...dn−1
i ←0
carry ←0
While z > 0 do
Begin
    borrow ←carry
    Choose window size ri ≤z
    if ri = z then carry ←0 else choose carry
    mi = 2ri
    di ←borrow×mi +(bz−1 ...bz−ri)2−carry
    i ←i+1
    z ←z−ri
End
n ←i

该算法通过从左到右重新编码位组来实现基数的改变,新的基数必须是 2 的幂。这种方法在 Itoh 的重叠窗口方法中有很巧妙的应用。

4. Liardet - Smart 算法

在椭圆曲线的场景中,Liardet 和 Smart 提出使用可变基数重新编码的方法,基数选择为随机选择的 2 的幂 $m_i = 2^{r_i}$,且 $r_i ≤ R$。具体的基数选择算法如下:

Inputs: D,R
Output: mi
If (D mod 2) = 0 then mi ←2
else
Begin
    r ←Random(R)
    mi ←2r
End

这里的 $\text{Random}(R)$ 返回区间 $[1, R]$ 内随机选择的整数。图 17.5 中的函数 $\text{mod}’$ 是确定性的,是具有最小绝对值的(有符号)余数(当 $D$ 为奇数且 $r_i = 2$ 时取 1)。

这种重新编码用于左到右的幂运算,在椭圆曲线上下文中执行点乘法。此时,术语变为“加法”和“加倍”,而不是“乘法”和“平方”。图 17.5 中的预计算表只需包含输入点的奇数倍,直到 $2^R - 1$,对于负数字,通过减去输入点的相应正倍数来处理。因此,该算法的空间效率类似于 $(R - 1)$ 位窗口的滑动窗口算法,在该算法中需要计算所有数字倍数。

如果 $\text{Random}(R)$ 在 $[1, R]$ 上具有均匀分布,那么奇数数字的平均窗口大小为 $(R + 1) / 2$,算法的时间效率将接近窗口大小为 $(R + 1) / 2$ 的等效滑动窗口算法。当然,可以对基数的分布进行偏置,以倾向于较大的值,从而提高执行效率。

由于窗口现在在加法/加倍序列中占据任意位置,如果重复使用相同的密钥,侧信道轨迹的任何给定位置都会同时出现加法和加倍操作。这使得通过平均多个轨迹来推断有意义的信息几乎成为不可能。而且,即使能够确定单次使用密钥时的加法和加倍模式,仍然存在识别出现的数字以及区分数字符号的问题,因为相同的操作数用于正负两种符号。

对于 ECDSA 等协议(秘密密钥仅使用一次),如果侧信道泄漏不太严重,这是一个非常优秀的算法。但如果使用经典的点加法和点加倍算法,组成字段操作的不同数量和类型可能会导致非常准确地确定加法和加倍的顺序。因此,建议将平衡代码与该算法结合使用。

以下是 $R = 3$ 时,13(二进制为 1101)的一些重新编码及其加法/加倍轨迹的示例:
| 数字序列 | 加法/加倍轨迹 |
| — | — |
| 1 1 0 1 | DA DA D DA |
| 1 – ¯1 0 1 | DA D DA D DA |
| – – 3 0 1 | D D DA D DA |
| 1 1 – 1 | DA DA D DA |
| 1 – ¯1 – 1 | DA D DA D DA |
| – – 3 – 1 | D D DA D DA |
| 1 0 – – ¯3 | DA D D D DA |

5. 对 Liardet - Smart 算法的攻击

如果秘密密钥未经过盲化处理就被重复使用,并且加法(A)和加倍(D)的模式泄漏的误差较少,那么情况就不太乐观了。以下是一个示例表格,展示了可能的数字序列及其对应的加法和加倍操作序列(称为“轨迹”):

数字序列 加法/加倍轨迹
1 1 0 1 DA DA D DA
1 – ¯1 0 1 DA D DA D DA
– – 3 0 1 D D DA D DA
1 1 – 1 DA DA D DA
1 – ¯1 – 1 DA D DA D DA
– – 3 – 1 D D DA D DA
1 0 – – ¯3 DA D D D DA

为了确定第 $i$ 位或其上方的位的值,我们将忽略轨迹中第 $i$ 位右侧的部分。为了简化,假设删除这部分,即移除最右侧的 $i$ 个 $D$ 以及其中的任何 $A$。然后,根据轨迹段最右侧的操作(在第 $i$ 位)是 $A$ 还是 $D$,将轨迹段划分为两个集合 $TrA_i$ 和 $TrD_i$。假设我们有足够的轨迹来展示该位置周围所有可能的加法和加倍模式。

如果只有 $D$ 出现(即 $TrA_i$ 为空),那么第 $i$ 位必须为 0,因为仅使用基数 2 的表示法在该位为 1 时会生成 $A$。同样,如果只有 $A$ 出现,该位也可以确定。例如,在上述表格中,第 0 位和第 1 位分别为 1 和 0。

设 $D_i$ 为输入二进制密钥 $D$ 从最高有效位到第 $i$ 位(包括第 $i$ 位)的值。那么,$TrA_i$ 中的轨迹根据下一个(即较低有效位)数字是否为非负,代表 $D_i$ 或 $D_i + 1$。显然,由于这些轨迹中的数字 $d_i$ 为奇数,它必须是 $D_i$ 或 $D_i + 1$ 中的奇数。因此,$TrA_i$ 中表示的数字的位模式与 $D_i$ 的位模式相同,唯一可能的例外是第 $i$ 位。

假设我们有足够的轨迹使得在第 $i$ 位选择了基数 2,那么当且仅当第 $i + 1$ 位为 1 时,该位置会出现 $A$。通过这种方法,我们可以推断出第 1 位和第 3 位的值。实际上,在出现下一个 1 之前不会再有 $A$,因此我们可以从轨迹集 $TrA_0$ 推断出第 2 位为 1。由于第一个轨迹只到第 3 位,我们知道输入最多有 4 位,并且所有位都已确定。

然而,攻击者可能只能进行有限次数(例如 10 次)的准确测量来推断加法和加倍模式,这可能导致一些位无法确定。但即便如此,推断密钥所需的计算能力也出乎意料地少。

另一方面,如果几乎无法区分加法和加倍操作,攻击者的攻击难度会大大增加。攻击者的主要问题是对齐加倍操作,如果无法做到这一点,与给定密钥位对应的子轨迹就无法对齐。侧信道轨迹中这些子轨迹的随机移动似乎会平均掉有用信息,除非在密钥的两端。攻击者可以选择最长的轨迹以确保只使用基数 2,并对它们进行平均,但这也面临诸多挑战。

Mermaid 流程图:Liardet - Smart 算法攻击流程

graph TD
    A[获取侧信道轨迹] --> B[处理轨迹,忽略第i位右侧部分]
    B --> C[划分轨迹段为TrA_i和TrD_i]
    C --> D{TrA_i是否为空}
    D -- 是 --> E[第i位为0]
    D -- 否 --> F{TrD_i是否为空}
    F -- 是 --> G[第i位为1]
    F -- 否 --> H[根据TrA_i推断位值]
    E --> I[继续处理下一位]
    G --> I
    H --> I
    I --> J{是否处理完所有位}
    J -- 否 --> B
    J -- 是 --> K[完成密钥推断]

总结

随机幂运算算法在密码学中具有重要意义,它通过随机重新编码等方式增加了攻击者从侧信道泄漏信息中推断秘密密钥的难度。不同的算法,如 $m$ 进制幂运算、滑动窗口算法、Liardet - Smart 算法等,各有其特点和适用场景。

  • $m$ 进制幂运算 :适用于需要预计算输入密文数字幂表的场景,但容易受到 Big Mac 攻击。
  • 滑动窗口算法 :通过合理选择窗口大小,在时间和空间效率上取得平衡。
  • Liardet - Smart 算法 :在椭圆曲线场景中表现出色,特别是对于秘密密钥仅使用一次的协议,但在密钥重复使用且侧信道泄漏信息较准确时,可能受到攻击。

在实际应用中,需要根据具体的协议要求、侧信道泄漏情况等因素选择合适的随机幂运算算法,并结合平衡代码等技术,以提高密码系统的安全性。同时,攻击者也在不断探索新的攻击方法,这促使我们持续研究和改进随机幂运算算法,以应对日益复杂的安全挑战。

建议列表

  • 在使用随机幂运算算法时,根据协议特点和安全需求选择合适的算法。
  • 对于可能存在侧信道泄漏的情况,考虑结合平衡代码等技术来增加攻击难度。
  • 定期评估密码系统的安全性,及时发现并解决潜在的安全漏洞。
  • 在设计密码系统时,充分考虑密钥的使用方式和频率,避免因密钥重复使用而带来的安全风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值