离散对数环境下的冷启动攻击与密钥恢复
1. 相关参数与测试
在离散对数环境下的冷启动攻击中,要恢复正确的私钥,需要考虑一些关键参数和测试方法。当使用相同的阈值 $C$ 进行每次相关性测试时,恢复正确私钥的概率为 $\gamma^m$。
这里存在一个问题,即需要确定 $p_0$ 和 $p_1$ 的取值。如果已知私钥的分布,那么为这些参数赋值就很容易。例如,在 RSA 环境中,假设整个私钥的 0 和 1 的数量大致相等,那么使用相关测试时,可将 $p_0 = p_1 = 1/2$。这为恢复因非对称二进制信道而受损的有噪声的 RSA 私钥提供了一种基于阈值的方法。
然而,在其他情况下,可能无法准确为 $p_0$ 和 $p_1$ 赋值。为解决这个问题,采用了两个独立的多项分布测试:一个针对 0 比特,另一个针对 1 比特。这样做的优点是无需估计 $p_0$ 和 $p_1$ 的值,算法的成功率不会因对这些参数的错误估计而受到影响。
对于正确的解决方案,一个 0 比特以概率 $\alpha$ 翻转成 1 比特,或以概率 $1 - \alpha$ 保持为 0 比特。如果正确解决方案中有 $n_0$ 个 0 比特,那么 $(n_{01}, n_{00})$ 遵循参数为 $n_0$ 和 $p = (\alpha, 1 - \alpha)$ 的多项分布。同理,对于 $n_1$ 个 1 比特,$(n_{10}, n_{11})$ 遵循参数为 $n_1$ 和 $p = (\beta, 1 - \beta)$ 的多项分布。
具体定义如下:
- $Correlate_0(s_i, r) := -2n_{i00} \ln \left(\frac{n_0(1 - \alpha)}{n_{i00}}\right) - 2n_{i01} \ln \left(\frac{n_0\alpha}{n_{i01}}\right)$
- $Correlate_1(s_i, r) := -2n_{i11} \ln \left(\frac{n_1(1 - \beta)}{n_{i11}}\right) - 2n_{i10} \ln \left(\frac{n_1\beta}{n_{i10}}\right)$
- $Correlate_C(s_i, r) = pass \Leftrightarrow Correlate_0(s_i, r) < C \land Correlate_1(s_i, r) < C$
$Correlate_0$ 和 $Correlate_1$ 是具有一个自由度的函数,$Correlate_0 < C$ 的概率为 $\gamma = \int_{0}^{C} \chi^2_1(x)dx$,$Correlate_1 < C$ 的概率同理。
2. 指数运算算法
在椭圆曲线离散对数密码系统中,点乘运算是核心部分。使用加法表示法 $Q = aP$ 来表示公钥 $Q$,其中 $P$ 是基点,标量 $a$ 是私钥,$O$ 表示无穷远点,即该群中的中性元素。
点乘运算的性能取决于多个因素,包括域元素的表示、基本群运算(如点加法和点加倍)的优化公式、曲线点的表示以及调度器的设计。在冷启动攻击的背景下,调度器是一个值得分析的目标,因为在基于椭圆曲线加密(ECC)的系统中,私钥通常对应于标量,而调度器正是处理这些信息的。
以下是几种常见的点乘算法:
-
双倍加算法
:这是点乘的教科书方法。给定标量 $a \in N$ 和适当的长度参数 $\ell \in N$,需要将 $a$ 表示为其二进制展开 $[a]
1 = (a
{\ell}, \ldots, a_0)$,其中 $a = \sum_{i = 0}^{\ell} a_i2^i$ 且 $a_{\ell}, \ldots, a_0 \in {0, 1}$。通过递归可得 $aP = 2(a \gg 1)P + a_0P$,该算法初始化 $Q$ 为 $O$,并迭代更新 $Q \leftarrow 2Q + a_iP$,其中 $i$ 从 $\ell$ 递减到 0。
-
(窗口化)有符号数字表示法
:大多数用于表示椭圆曲线点的编码的一个共同特性是群求逆操作成本较低,因此点减法和点加法的效率相当。基于有符号数字表示法的点乘算法利用了这一特性。对于固定的窗口大小 $w$,标量 $a$ 的分解 $[a]
{\pm w} = (a
{\ell}, \ldots, a_0)$ 满足 $a = \sum_{i = 0}^{\ell} a_i2^i$ 且 $a_i \in [-2^{w - 1}, 2^{w - 1} - 1]$。由此可推导出“双倍加或减”算法,其关键思想是允许系数为大值或负值,从而找到特别稀疏的标量表示,减少群加法/减法的次数。
常见的有符号数字标准形式包括:
-
非相邻形式(NAF)
:数字集限制为 ${0, \pm 1}$,且要求没有两个连续的系数非零。
-
固定窗口 NAF
:形式为 $[a]
{\pm w}$ 的编码,要求对于所有 $i \not\equiv 0 \pmod{w}$,$a_i = 0$。
-
滑动窗口 NAF(wNAF)
:确保所有非零的 $a_i$ 为奇数,且 $[a]
{\pm w}$ 的所有长度为 $w$ 的子序列最多包含一个这样的元素。
这些编码都是唯一的,并且存储 NAF 或 wNAF 可能比普通二进制展开多需要一个数字。例如,十进制数 15 的二进制展开是 $(1, 1, 1, 1)$,而其 NAF 是 $(1, 0, 0, 0, \overline{1})$,其中 $\overline{1}$ 表示 -1。
以下是 wNAF 的后缀性质:
Fact 1(wNAF 的后缀性质)
:对于固定的标量 $a \in N$ 和窗口大小 $w$,设 $a$ 的二进制展开为 $(a_{\ell}, \ldots, a_0)$,其 wNAF 为 $(b_{\ell}, \ldots, b_0)$,对于适当的长度参数 $\ell$。那么对于所有 $0 \leq t \leq \ell - w + 1$,$(b_t, \ldots, b_0)$ 完全由 $(a_{t + w - 1}, \ldots, a_0)$ 确定。
3. 不同库中的点乘实现
-
OpenSSL 中的点乘
:OpenSSL 版本 1.0.1h 中的椭圆曲线点乘例程使用了一个名为
compute_wNAF的函数,它计算一种修改后的 wNAF。与常规 wNAF 不同,修改后的 wNAF 对最高有效非零位置的要求有所放宽,以可能节省最终的加倍操作。默认窗口大小 $w = 4$,得到的系数 $b_i \in [-2^{w - 1}, 2^{w - 1} - 1]$ 被编码为一个字节数组(数据类型为signed char),使用标准的二进制补码内存表示。 - 基于梳状的方法 :wNAF 方法旨在比双倍加技术需要更少的点加法,但加倍操作的数量不变甚至增加。而基于梳状的方法可以显著减少加倍操作,但需要一些依赖于基点的预计算。
固定基点 $P$ 和参数 $w, d \in N$,对于标量 $a \in N$ 且 $0 \leq a < 2^{wd}$,设 $[a] 1 = (a {wd - 1}, \ldots, a_0)$ 为其二进制展开。对于所有 $i \in [0, d - 1]$,设 $K_i = (K_{i}^{w - 1}, \ldots, K_{i}^{0})$,其中 $K_{i}^{j} = a_{i + jd}$。则 $aP = \sum_{i = 0}^{d - 1} 2^iT(K_{i}^{w - 1}, \ldots, K_{i}^{0})$,其中 $T : (k_{w - 1}, \ldots, k_0) \to \sum_{j = 0}^{w - 1} 2^{jd}k_jP$。
基于梳状的点乘的基本思想是预计算表 $T$,这样剩余的操作最多只需要 $d$ 次加法和加倍。然而,这种方法的实现可能对基于简单功耗分析(SPA)的侧信道攻击的抵抗力有限,因为将中性元素 $T(0, \ldots, 0) = O$ 添加到累加器的事件可能通过分析功耗轨迹被识别。为减轻这种威胁,提出了一种改进的梳状调度器,只处理奇数标量,引入标志 $\sigma_i \in {\pm 1}$ 来表示 $K_i$ 的正负性,并对 $K_i = (0, \ldots, 0)$ 的情况进行处理。
-
PolarSSL 中的点乘
:PolarSSL 版本 1.3.8 中的点乘例程采用了基于梳状的调度器。它借鉴了上述改进方法中只处理奇数标量和引入标志 $\sigma_i$ 的思想,但有所创新。在迭代处理 $K_1, \ldots, K_{d - 1}$ 时,大约每第二次(即当 $K_{i}^{0} = 0$ 时)采取行动,将 $\sigma_{i - 1} \leftarrow -1$ 并将 $K_i$ 替换为 $K_i \oplus K_{i - 1}$,这种方法确保所有 $K_i$ 的 $K_{i}^{0} = 1$,并使预计算表 $T$ 的大小减半。但为记录最终加法步骤的进位,向量 $K_{d - 1}, \ldots, K_0$ 需要扩展一个辅助组件 $K_d$。
PolarSSL 对结果序列 $K_d, (\sigma_{d - 1}, K_{d - 1}), \ldots, (\sigma_0, K_0)$ 的内存编码要求 $w \in [2, 7]$(实际使用 $w \in {4, 5}$),每个 $K_i$ 存储在一个单独的字节(数据类型为
unsigned char
)中,剩余的第八位用于存储相应的符号指示符,$\sigma_i = +1$ 和 $\sigma_i = -1$ 分别编码为 0 和 1。
同样,PolarSSL 的梳状编码也有后缀性质:
Fact 2(PolarSSL 梳状编码的后缀性质)
:对于固定的标量 $a \in N$ 和参数 $w, d$,设 $a$ 的二进制展开为 $(a_{wd - 1}, \ldots, a_0)$,其梳状编码为 $(\overline{K}
{d - 1}, \ldots, \overline{K}_0)$,其中 $\overline{K}
{i}^{j} = a_{i + jd}$,其 PolarSSL 梳状编码为 $(K_d, \sigma_{d - 1}, K_{d - 1}, \ldots, \sigma_0, K_0)$。那么对于所有 $1 \leq t \leq d$,$(K_{t - 1}, \sigma_{t - 2}, K_{t - 2}, \ldots, \sigma_0, K_0)$ 完全由 $(\overline{K}_{t - 1}, \ldots, \overline{K}_0)$ 确定。
4. 密钥恢复算法
为了从有噪声的内存图像中恢复基于离散对数的密码系统的私钥,针对 OpenSSL 和 PolarSSL 分别提出了不同的算法,下面将详细介绍。
4.1 攻击模型
在 OpenSSL 和 PolarSSL 中,离散对数私钥及其 NAF 或梳状编码至少在短时间内会同时存在于计算机内存中。冷启动攻击模型假设攻击者可以获得原始私钥及其编码的有噪声版本,并试图恢复私钥。假设 0 比特以概率 $\alpha = P(0 \to 1)$ 翻转,1 比特以概率 $\beta = P(1 \to 0)$ 翻转,并且攻击者知道 $\alpha$ 和 $\beta$ 的值,攻击者可以通过类似的分析方法轻松估计这些值。
4.2 NAF 编码的密钥恢复
算法 3 尝试恢复使用教科书 wNAF 或 OpenSSL 修改后的 NAF 编码的密钥。它接受多个输入:公钥 $Q = aP$、有噪声的内存图像 $M^*$、私钥的长度 $\ell$、窗口大小 $w$、可变参数 $t$ 和常数 $k$。对于教科书 NAF,$k = 0$。该算法的输出要么是私钥 $a$,要么是 $\perp$ 表示失败。
以下是算法 3 的具体步骤:
Input: noisy memory image M∗, reference public key Q = aP, parameters ℓ, w, t, k;
use k = 0 for textbook wNAF recovery, and k > 0 otherwise.
Output: secret key a or ⊥
1: CandSet ← ∅
2: for all x ∈ {0, 1}t+w−1 do
3:
calculate partial representation Mx of x
4:
if Correlate(Mx, M∗) = pass then
5:
add x to CandSet
6: for i ← 2 to ⌊(ℓ−k + 1 −w)/t⌋ do
7:
CandSet′ ← ∅
8:
for all x ∈ {0, 1}t × CandSet do
9:
calculate partial representation Mx of x
10:
if Correlate(Mx, M∗) = pass then
11:
add x to CandSet′
12:
CandSet ← CandSet′
13: for all x ∈ {0, 1}k+(ℓ−k−w+1 mod t) × CandSet do
14:
a ← ∑ℓ−1i=0 2ixi
15:
if Q = aP then
16:
return a
17: return ⊥
-
初始化阶段
:首先将候选集
CandSet初始化为空,该集合将存储私钥 $a$ 的(部分)候选解决方案。 -
第一阶段
:取所有长度为 $t + w - 1$ 的比特串,将它们转换为整数,并计算其对应的 wNAF 表示。通过相关性测试
Correlate将通过测试的候选解决方案添加到CandSet中。 -
中间阶段
:对于
CandSet中的每个字符串 $x$,在其前面添加长度为 $t$ 的所有比特串,计算新字符串的 wNAF 表示,并再次进行相关性测试。通过测试的候选解决方案将被添加到新的候选集CandSet′中,然后更新CandSet。 -
最终阶段
:当部分候选解决方案的长度 $\ell’$ 大于 $\ell - t$ 时,在
CandSet中的所有字符串前面添加长度为 $\ell - \ell’$ 的所有比特串。对于每个新字符串 $x$,计算 $xP$ 并与公钥 $Q = aP$ 进行比较。如果匹配,则输出 $x$ 作为私钥;否则,输出 $\perp$ 表示失败。
对于 OpenSSL 实现的 wNAF 编码,当标准 wNAF 的最高有效 $w + 1$ 位(不包括前导零)是 1 后面跟着 $w - 1$ 个 0 再跟着一个负的有符号数字 $\overline{b}$ 时,需要对前 $w + 1$ 位进行转换。
综上所述,通过这些算法和方法,可以在离散对数环境下的冷启动攻击中尝试恢复有噪声的私钥。不同的点乘算法和编码方式各有优缺点,在实际应用中需要根据具体情况进行选择和优化。同时,密钥恢复算法的成功概率也受到多种因素的影响,如噪声的概率 $\alpha$ 和 $\beta$ 等。
离散对数环境下的冷启动攻击与密钥恢复
5. 不同编码转换及密钥恢复的详细分析
在密钥恢复过程中,不同编码之间的转换以及算法的具体执行细节对于成功恢复私钥至关重要。
5.1 OpenSSL 中 wNAF 编码的转换
OpenSSL 使用的修改后的 wNAF 编码是在教科书 wNAF 基础上进行了优化。当标准 wNAF 的最高有效 $w + 1$ 位(不包括前导零)呈现为 1 后面跟着 $w - 1$ 个 0 再跟着一个负的有符号数字 $\overline{b}$ 时,会进行如下转换:
| 原编码 | 转换后编码 |
| ---- | ---- |
| $1 0 \cdots 0_{w - 1} \overline{b}$ | $01 0 \cdots 0_{w - 2} \beta$ |
这种转换的目的是为了可能节省最终的加倍操作,从而提高点乘运算的效率。在密钥恢复算法中,需要考虑这种编码转换对候选解决方案的影响。当计算 wNAF 表示时,要根据这种规则对符合条件的编码进行转换,以确保后续的相关性测试和公钥匹配的准确性。
5.2 密钥恢复算法的复杂度分析
算法 3 的复杂度主要取决于输入参数和操作步骤。在初始化阶段,需要遍历所有长度为 $t + w - 1$ 的比特串,其数量为 $2^{t + w - 1}$。在中间阶段,每次迭代需要遍历 ${0, 1}^t$ 与
CandSet
的笛卡尔积,随着迭代次数的增加,
CandSet
的大小可能会发生变化,但总体上每次迭代的复杂度与 $2^t$ 成正比。最终阶段需要遍历 ${0, 1}^{k + (\ell - k - w + 1 \mod t)}$ 与
CandSet
的笛卡尔积。
因此,算法 3 的时间复杂度主要由比特串的遍历和相关性测试决定,大致为指数级。空间复杂度主要取决于
CandSet
的大小,在最坏情况下,
CandSet
可能包含大量的候选解决方案,导致空间开销较大。
6. 梳状编码的密钥恢复思路
对于 PolarSSL 中使用的梳状编码,其密钥恢复思路与 NAF 编码有所不同。由于梳状编码的特点,需要考虑其预计算表和进位处理的影响。
6.1 梳状编码的特点分析
梳状编码通过预计算表 $T$ 减少了点乘运算中的加倍次数,但引入了额外的标志 $\sigma_i$ 和进位处理。在内存中,每个 $K_i$ 存储在一个单独的字节中,第八位用于存储符号指示符。这种编码方式使得密钥的表示更加紧凑,但也增加了恢复的复杂性。
6.2 可能的密钥恢复算法思路
可以基于梳状编码的后缀性质(Fact 2)来设计密钥恢复算法。首先,从有噪声的内存图像中提取出 $K_d, (\sigma_{d - 1}, K_{d - 1}), \ldots, (\sigma_0, K_0)$ 的有噪声版本。然后,根据后缀性质,从低位开始逐步确定可能的候选解决方案。
具体步骤如下:
1. 初始化候选集
CandSet
为空。
2. 从有噪声的内存图像中提取出最低位的 $K_0$ 和 $\sigma_0$,根据其可能的取值生成初始的候选解决方案,并添加到
CandSet
中。
3. 对于 $t$ 从 1 到 $d$,根据后缀性质,利用已确定的 $(K_{t - 1}, \sigma_{t - 2}, K_{t - 2}, \ldots, \sigma_0, K_0)$ 来确定 $K_t$ 和 $\sigma_t$ 的可能取值。对于每个可能的取值,生成新的候选解决方案,并通过相关性测试(类似于 NAF 编码中的
Correlate
测试)筛选出符合条件的候选解决方案,更新
CandSet
。
4. 最终,对于
CandSet
中的每个候选解决方案,计算其对应的公钥,并与已知的公钥 $Q = aP$ 进行比较,输出匹配的私钥或表示失败。
7. 总结与展望
通过对离散对数环境下冷启动攻击和密钥恢复的研究,我们了解了多种点乘算法、编码方式以及相应的密钥恢复算法。不同的点乘算法和编码方式在性能和安全性上各有优劣,在实际应用中需要根据具体需求进行选择。
在密钥恢复方面,针对 OpenSSL 和 PolarSSL 分别提出的算法为从有噪声的内存图像中恢复私钥提供了可行的方法。然而,这些算法的成功概率受到多种因素的影响,如噪声的概率 $\alpha$ 和 $\beta$、密钥的长度 $\ell$ 等。未来的研究可以进一步优化这些算法,提高密钥恢复的成功率和效率。
同时,随着技术的发展,新的攻击和防御手段也在不断涌现。在冷启动攻击的背景下,如何更好地保护私钥的安全性是一个值得深入研究的问题。可以考虑采用更加复杂的编码方式、加密技术或硬件防护措施来增强系统的安全性。
以下是一个 mermaid 流程图,展示了算法 3 的整体流程:
graph TD;
A[开始] --> B[初始化 CandSet 为空];
B --> C[遍历所有长度为 t + w - 1 的比特串];
C --> D[计算部分表示 Mx];
D --> E{Correlate(Mx, M∗) = pass?};
E -- 是 --> F[将 x 添加到 CandSet];
E -- 否 --> C;
F --> G[循环 i 从 2 到 ⌊(ℓ - k + 1 - w)/t⌋];
G --> H[初始化 CandSet′ 为空];
H --> I[遍历 {0, 1}t × CandSet];
I --> J[计算部分表示 Mx];
J --> K{Correlate(Mx, M∗) = pass?};
K -- 是 --> L[将 x 添加到 CandSet′];
K -- 否 --> I;
L --> M[更新 CandSet = CandSet′];
M --> G;
G --> N[当部分候选长度 ℓ' > ℓ - t];
N --> O[遍历 {0, 1}k+(ℓ - k - w + 1 mod t) × CandSet];
O --> P[计算 a = ∑ℓ - 1i = 0 2ixi];
P --> Q{Q = aP?};
Q -- 是 --> R[返回 a];
Q -- 否 --> S[返回 ⊥];
这个流程图清晰地展示了算法 3 从初始化到最终输出结果的整个过程,包括各个阶段的操作和判断条件。通过对这些流程和算法的深入理解,可以更好地应对离散对数环境下的冷启动攻击,保障密码系统的安全性。
超级会员免费看
15

被折叠的 条评论
为什么被折叠?



