高效幂运算与批量密钥协商方案解析
1 幂运算问题背景
在密码学等领域,经常需要重复计算一个元素 (g) 的幂,直至 (g^N),其中 (g) 是群(如 (Z/qZ),(q) 是一个大整数,例如 512 位)中的元素,(N) 也是一个较大的数。不同的密码学方案对 (N) 的位数要求不同,如 Schnorr 方案中 (N) 约为 140 位,DSS 方案使用 160 位的 (N),Brickell - McCurley 方案使用 512 位的 (N)。
以 Diffie - Hellman 密钥交换为例,使用 512 位素数和 512 位随机指数进行幂运算。若采用平方 - 乘方法,平均需要进行 (765 + \frac{3}{2} \times 12) 次模乘法,最坏情况下需要 1022 次乘法,且至少需要 64 字节的存储空间。而通过一些优化方法,如计算长度约为 608 的加法链,可使平均乘法次数比二进制方法提高 21%。但对于 512 位指数,加法链的乘法次数最多只能达到 512 次。本文提出的一种方案,平均只需进行少于 105 次模乘法,最坏情况下为 106 次,使用 23168 字节的存储空间,相比平方 - 乘法方法,平均速度提高了 7 倍多,最坏情况下提高了约 10 倍。
2 基本幂运算策略
2.1 平方 - 乘法方法
使用平方 - 乘法方法计算 (g^n),最多需要 (2 \lceil \log N \rceil - 2) 次乘法,平均需要 (\frac{3}{2} \lceil \log N \rceil) 次乘法。
2.2 预计算值方法
- 简单预计算 2 的幂 :一种简单的方法是预计算集合 ({g^{2^i} | i = 1, \ldots, \lceil \log N \rceil - 1})。然后,通过将 (n) 的二进制表示中对应非零位的幂相乘,可在 (v(n) - 1) 次乘法内计算 (g^n),其中 (v(n)) 是 (n) 的二进制表示中非零位的数量,需要 (\lceil \log N \rceil) 的存储空间。
- 通用预计算值 :不一定非要存储 2 的幂。假设我们预计算并存储 (g^{x_0}, \ldots, g^{x_{m - 1}}) ((x_0, \ldots, x_{m - 1}) 为整数)。若能找到 (n = \sum_{i = 0}^{m - 1} a_i x_i) 的分解,其中 (0 \leq a_i \leq h),则可计算 (g^n)。
定理 1:假设 (n = \sum_{i = 0}^{m - 1} a_i x_i),其中 (0 \leq a_i \leq h)。若对每个 (0 \leq i < m) 都预计算了 (g^{x_i}),且 (m + h \geq 2),则 (g^n) 可以用 (m + h - 2) 次乘法计算。
证明算法如下:
If (3) were computed using optimal addition chains for 1, 2,
b + 1
a = 1
for d = h to 1 by -1
for each i such that a_i = d
a = a * b
b = b * g^{x_i}
return a.
通过归纳法可以证明,经过 (i) 次循环后,(b = C_h C_{h - 1} \ldots C_{h - i + 1}),(a = C_1 C_2 \ldots C_{h - i + 1})。经过 (h) 次循环后,(a = \prod_{d = 1}^{h} C_d)。计算该算法的乘法次数时,只计算两个乘数都不等于 1 的乘法。假设 (n \neq 0),有 (m) 个数字,所以 (b = b * g^{x_i}) 行最多执行 (m) 次,(a = a * b) 行执行 (h) 次,总共至少需要 (m + h - 2) 次乘法。
2.3 以 (b) 为基的表示
最常见的做法是以 (b) 为基表示指数 (n),最多使用 (m = \lceil \log_b N \rceil) 位数字,并预计算 (g^{b^k})((k = 1, \ldots, \lceil \log_b N \rceil - 1))。使用定理 1 的算法,(g^n) 最多可以用 (\lceil \log_b N \rceil + b - 3) 次乘法计算。对于随机选择的指数 (n),每个数字约有 (\frac{1}{b}) 的概率为零,这些乘法可以省略,因为 (a) 和 (b) 初始值为 1。平均而言,(b = b * g^{x_i}) 行预计执行 (\lceil \log_b N \rceil) 次,因此预计的乘法次数最多为 (\lceil \log_b N \rceil + b - 3)。
对于 512 位指数,(b) 的最优值为 26,该方法平均最多需要 127.8 次乘法,最坏情况下需要 132 次乘法,需要 109 个存储值。若转换指数从二进制到 (b) 进制的开销较大,也可以使用 (b = 32),此时平均最多需要 128.8 次乘法,最坏情况下需要 132 次乘法,同样需要 109 个存储值。
3 其他数制表示
3.1 特定数制表示
如果 (b > 1),每个满足 (|n| \leq \frac{b^k - 1}{2}) 的整数 (n) 可以表示为 (\sum_{i = 0}^{k - 1} a_i b^i),其中 (a_i \in [-\lfloor \frac{b - 1}{2} \rfloor, \lfloor \frac{b - 1}{2} \rfloor])。预计算 (g^{\pm b^i}) 后,可进行幂运算。此时,(m = \lceil \log_b (2N + 1) \rceil),(h = \lfloor \frac{b - 1}{2} \rfloor),最坏情况下需要 (\lceil \log_b (2N + 1) \rceil + \lfloor \frac{b - 1}{2} \rfloor - 2) 次乘法。平均而言,需要的乘法次数上限为 (\lceil \log_b (2N + 1) \rceil \times \frac{b - 1}{b} + \lfloor \frac{b - 1}{2} \rfloor - 2),需要存储 (2 \lceil \log_b (2N + 1) \rceil) 个值。对于 512 位指数,(b = 15) 是一个不错的选择,平均需要 111.91 次乘法,最坏情况下需要 114 次乘法,使用 188 个存储值。
3.2 不同 (h) 值的影响
- (h = 1) 的情况 :若 (h = 1),可以通过存储所有 (g^{d b^i})((1 \leq d < b),(0 \leq i \leq \lceil \log_b N \rceil - 1))的值,完全绕过 (\prod_{d = 1}^{h} C_d) 的计算。平均最多执行 (\lceil \log_b N \rceil \times \frac{h - 1}{b} - 1) 次乘法,最坏情况下执行 (\lceil \log_b N \rceil - 1) 次乘法。例如,当 (N = 2^{512}),(b = 256),(h = 1) 时,平均需要 62.75 次乘法,最坏情况下需要 63 次乘法,但该方法需要 ((b - 1) \lceil \log_b N \rceil) 个存储值,即 16320 个存储值或 1044480 字节的存储空间。
- (h = 2) 的情况 :通过稍微增加 (h) 的值,可以减少存储或时间开销。例如,当 (h = 2),设 (M_2 = {d | 1 \leq d < b, \omega_2(d) \equiv 0 \pmod{2}}),只需存储 ({g^{d b^i} | d \in M_2}) 的值。对于 (1 \leq u_i < b),(g^{u_i b^i}) 可以表示为 (g^{d b^i}) 或 (g^{2d b^i})((d \in M_2))。使用相同的基,该方法只增加一次乘法,但显著减少了存储空间。例如,当 (b = 256) 时,平均最多需要 63.75 次乘法,存储空间减少到 10880 个值或 696320 字节。
- 其他情况 :继续增加 (h) 或减小 (b) 会进一步增加时间开销,但降低存储空间。例如,对于 512 位指数,当 (b = 123),使用 (M_3 = {d | 1 \leq d < b, \omega_2(d) + \omega_3(d) \equiv 0 \pmod{2}}) 时,平均最多需要 74.32 次乘法,使用 5624 个存储值。
3.3 基本数字集
如果任何整数都可以用集合 (D) 中的数字以 (b) 为基表示,则称集合 (D) 是基 (b) 的基本数字集。寻找使用集合 (D) 中的数字表示的难度与寻找普通的 (b) 进制表示的难度几乎相同。Matula 提供了一种高效的算法来确定一个集合是否为基本数字集。
定理 3:假设 (D) 是模 (b) 的完全剩余系,设 (d_{min} = \min{s | s \in D}),(d_{max} = \max{s | s \in D}),则 (D) 是基 (b) 的基本数字集,当且仅当对于每个 (i) 都有使用 (D) 中数字的表示。
不同乘数集 (M) 和 (h) 的组合在计算 (g^n) 时的预期时间和最坏情况时间如下表所示:
| (M) | (h) | 预期时间 | 最坏情况时间 |
| ---- | ---- | ---- | ---- |
| ({1}) | 25 | 127.81 | 132 |
| ({ \pm 1}) | 22 | 111.91 | 114 |
| ({ \pm 1, \pm 2}) | 17 | 104.28 | 106 |
| ({ \pm 1, \pm 2, \pm 23}) | 16 | 98.72 | 100 |
| (M_3) | 3 | 85.66 | 87 |
| (M_3) | 3 | 74.39 | 75 |
| (M_2) | 2 | 63.75 | 64 |
对于 160 位指数和 512 位指数,不同参数选择下的计算情况如下表所示:
| 指数位数 | (b) | (M) | 预期乘法次数 | 最坏情况乘法次数 | 存储值数量 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 160 | 36 | ({ \pm 1, \pm 2}) | 36.11 | 134 | 109 |
| 160 | 64 | ({ \pm 1, 9, \pm 14, \pm 17}) | 31.14 | 319 | 188 |
| 160 | 128 | (M_2) | 36.58 | 32 | 362 |
| 160 | 256 | (M_3) | 23.82 | 620 | 512 |
| 512 | - | - | - | - | - |
| 512 | - | - | - | - | - |
| 512 | - | - | - | - | - |
对于给定的 (N) 和存储空间,很难证明一个方案是最优的,但上述方案是渐近最优的。当存储 (g^{r b^j})((r) 在固定的乘数集内)时,(b) 的最优值约为 (\frac{\log N}{(\log \log N)^2}),此时需要 ((1 + o(1)) \frac{\log N}{\log \log N}) 次乘法和 (O(\frac{\log N}{\log \log N})) 个存储值。
定理 4:如果存储值的数量小于 (\log^k N)((k \geq 1)),则所需的乘法次数至少为 ((\frac{1}{k} + o(1))(\frac{\log N}{\log \log N}))。
4 算法并行化
4.1 幂运算步骤
计算 (g^n) 的第一种方法主要包括以下三个步骤:
1. 确定 (n) 的表示 (n = a_0 + a_1 b + \ldots + a_{m - 1} b^{m - 1})。
2. 对于 (d = 1, \ldots, h),计算 (C_d = \prod_{j: a_j = d} g^{b^j})。
3. 计算 (g^n = \prod_{d = 1}^{h} C_d)。
4.2 并行化策略
Matula 算法使第一步变得容易,大部分时间花费在第二步和第三步。这两步都可以并行化。
假设我们有 (h) 个处理器:
-
第二步并行化
:每个处理器可以分别计算其 (C_d)。计算 (C_d) 所需的时间取决于等于 (d) 的 (a_j) 的数量。因此,第二步的时间取决于拥有最多等于 (d) 的 (a) 的那个 (d)。这相当于最大桶占用问题,即给定 (k + 1) 个球随机分布在 (h) 个桶中,预期的最大桶占用是多少。当 (b) 和 (h) 为 (O(\frac{\log N}{\log \log N})) 时,预期值为 (O(\frac{\log h}{\log \log N}))。
-
第三步并行化
:每个处理器可以使用标准加法链方法为一个 (d) 计算 (C_d),最多需要 (2 \log h) 次乘法。然后,通过反复成对相乘将 (C_d) 组合成 (g^n)(这在文献中称为二进制扇入乘法),需要 (\log h) 时间。
因此,当 (h = O(\frac{\log N}{\log \log N})) 时,我们可以使用 (O(\frac{\log N}{\log \log N})) 个处理器在 (O(\log \log N)) 时间内计算幂。例如,只存储 (b) 的幂,对于 140 位指数,使用 15 个处理器,取 (b = 16) 和 (M = {1}),可以在相当于 13 次乘法的时间内计算幂;对于 512 位指数,使用 27 个处理器,取 (b = 28),可以在相当于 17 次乘法的时间内计算幂。
4.3 并行化的另一种方法
上述方法的缺点是每个处理器需要访问每个 (g^{b^i}) 的幂,因此需要共享内存或在每个处理器上存储所有幂。另一种方法是每个处理器只存储一个幂。
对于这种方法,我们有 (k) 个处理器,每个处理器使用存储的值和 (a_i) 的加法链计算一个 (g^{a_i b^i}),最多需要 (2 \log h) 时间。然后,处理器使用二进制扇入乘法将结果相乘得到 (g^n),总时间最多为 (2 \log h + \log k),同样在 (O(\log \log N)) 时间内使用 (O(\frac{\log N}{\log \log N})) 个处理器。
如果处理器数量不是问题,最优的基选择是 (b = 2),此时需要 (\log N) 个处理器和 (\log \log N) 时间。例如,对于 512 位指数,使用 512 个处理器可以在相当于 9 次乘法的时间内计算幂;对于 140 位指数,使用 140 个处理器可以在相当于 8 次乘法的时间内计算幂。选择较大的基会减少处理器数量,但增加时间开销。
5 批量 Diffie - Hellman 密钥协商方案
5.1 RSA 与 Batch - RSA 概述
RSA 是当今最流行的公钥加密方案。Batch - RSA 是一种可以在接近一次正常解密的计算成本下,计算许多((n / \log_2(n)),(n) 是安全参数)RSA 解密操作的方法。它要求所有操作使用相同的模数,但不同的、两两互质的短公共指数。星型密钥协商方案可以使用这样的系统来降低中心的计算复杂度。
5.2 安全便携式电话示例
以安全便携式电话为例,Batch - RSA 在该系统中不能有效使用,因为 RSA 密钥交换的性质会产生延迟。
5.3 Batch - Diffie - Hellman 方案
类似于 Fiat 的数学思想可以引出 Batch - Diffie - Hellman 密钥协商方案。该方案不会受到 RSA 那样的延迟影响,并且在效率上与 Batch - RSA 相当。在采取一些预防措施的情况下,该系统的破解难度与具有短公共指数的 RSA 相当。
在实际应用中,与具有全尺寸指数和模数的(非批量)Diffie - Hellman 方案相比,该方法将中心的处理时间提高了 6 到 17 倍;与采用缩写指数的 Diffie - Hellman 方案相比,可获得较小的改进(约 1.6 到 3 倍)。
综上所述,通过优化幂运算方法和采用批量密钥协商方案,可以在密码学应用中显著提高计算效率,同时在一定程度上平衡时间和存储开销。在实际应用中,需要根据具体的需求和资源限制选择合适的参数和方法。
6 幂运算优化策略总结与对比
6.1 不同策略对比
为了更清晰地了解各种幂运算策略的优缺点,我们将之前介绍的几种方法进行对比,如下表所示:
| 策略名称 | 平均乘法次数 | 最坏情况乘法次数 | 存储值数量 | 优点 | 缺点 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 平方 - 乘法方法 | (\frac{3}{2} \lceil \log N \rceil) | (2 \lceil \log N \rceil - 2) | 较少 | 实现简单 | 乘法次数较多 |
| 预计算 2 的幂 | (v(n) - 1) | - | (\lceil \log N \rceil) | 计算相对简单 | 存储值依赖 2 的幂 |
| 以 (b) 为基表示((b = 26),512 位指数) | 127.8 | 132 | 109 | 乘法次数相对较少 | 可能需要指数进制转换 |
| 特定数制表示((b = 15),512 位指数) | 111.91 | 114 | 188 | 乘法次数较少 | 存储值数量较多 |
| (h = 1) 情况((b = 256),(N = 2^{512})) | 62.75 | 63 | 16320 | 乘法次数少 | 存储值数量极大 |
| (h = 2) 情况((b = 256)) | 63.75 | 64 | 10880 | 乘法次数少,存储值减少 | 计算稍复杂 |
从表中可以看出,不同的策略在乘法次数和存储值数量上有不同的表现。如果对存储资源要求不高,且希望尽量减少乘法次数,可以选择 (h = 1) 或 (h = 2) 的情况;如果存储资源有限,以 (b) 为基表示或特定数制表示可能是更好的选择。
6.2 策略选择流程
在实际应用中,我们可以根据具体的需求和资源限制来选择合适的幂运算策略。以下是一个选择策略的流程图:
graph TD
A[开始] --> B{存储资源是否充足?}
B -- 是 --> C{是否追求最少乘法次数?}
C -- 是 --> D[选择 \(h = 1\) 或 \(h = 2\) 情况]
C -- 否 --> E{对指数进制转换开销是否敏感?}
E -- 否 --> F[选择以 \(b\) 为基表示]
E -- 是 --> G[选择特定数制表示]
B -- 否 --> H{对乘法次数要求是否严格?}
H -- 是 --> I[选择预计算 2 的幂]
H -- 否 --> J[选择平方 - 乘法方法]
D --> K[结束]
F --> K
G --> K
I --> K
J --> K
这个流程图展示了根据存储资源、乘法次数要求和指数进制转换开销等因素来选择合适策略的过程。
7 批量 Diffie - Hellman 方案的应用场景与优势
7.1 应用场景分析
批量 Diffie - Hellman 方案在一些需要大量密钥协商的场景中具有重要的应用价值,例如:
-
大规模网络通信
:在一个包含众多节点的网络中,节点之间需要频繁进行密钥协商以保证通信的安全性。使用批量 Diffie - Hellman 方案可以显著提高中心节点的处理效率,减少通信延迟。
-
移动设备通信
:在移动设备与基站之间的通信中,由于移动设备的计算资源有限,批量 Diffie - Hellman 方案可以降低设备的计算负担,同时提高密钥协商的速度。
7.2 优势总结
与传统的 Diffie - Hellman 方案和 Batch - RSA 方案相比,批量 Diffie - Hellman 方案具有以下优势:
-
无延迟问题
:避免了 RSA 密钥交换中产生的延迟,能够更及时地完成密钥协商。
-
效率相当
:在效率上与 Batch - RSA 相当,同时在某些情况下能够提供更好的性能。
-
灵活性高
:可以根据具体的应用场景和资源限制,调整方案的参数,以达到最佳的性能和安全性。
7.3 应用步骤
在实际应用中,使用批量 Diffie - Hellman 方案进行密钥协商可以按照以下步骤进行:
1.
参数选择
:根据具体的应用场景和安全要求,选择合适的 (N)、(b)、(M) 等参数。
2.
预计算
:预计算所需的 (g^{r b^j}) 等幂值,存储在相应的位置。
3.
指数表示
:将指数 (n) 表示为合适的形式,如以 (b) 为基的表示或使用基本数字集的表示。
4.
并行计算(可选)
:如果有足够的处理器资源,可以采用并行化策略,加速幂运算的过程。
5.
密钥协商
:根据计算得到的幂值,完成批量的 Diffie - Hellman 密钥协商。
8 并行化算法的进一步探讨
8.1 并行化的挑战与解决方案
虽然并行化算法可以显著提高幂运算的速度,但也面临一些挑战,例如:
-
处理器资源分配
:如何合理分配处理器资源,以确保每个处理器的负载均衡,是一个关键问题。可以采用动态负载均衡算法,根据每个处理器的计算能力和当前负载情况,动态分配任务。
-
数据通信开销
:在并行计算过程中,处理器之间需要进行数据通信,这会产生一定的开销。可以通过优化通信协议和数据传输方式,减少通信开销。
8.2 并行化算法的性能评估
为了评估并行化算法的性能,我们可以使用以下指标:
-
加速比
:加速比是指并行算法的执行时间与串行算法的执行时间之比。加速比越高,说明并行化的效果越好。
-
效率
:效率是指加速比与处理器数量之比。效率越高,说明处理器的利用率越高。
8.3 并行化算法的选择流程
在选择并行化算法时,我们可以根据具体的情况进行选择,如下表所示:
| 情况 | 并行化算法选择 | 原因 |
| ---- | ---- | ---- |
| 处理器资源充足,对时间要求高 | 标准并行化策略((h = O(\frac{\log N}{\log \log N}))) | 可以在较短时间内完成计算 |
| 处理器资源有限,对存储要求高 | 每个处理器只存储一个幂的方法 | 减少存储开销 |
| 处理器数量无限制 | 基 (b = 2) 的并行化方法 | 可以达到最高的计算效率 |
9 总结与展望
9.1 总结
本文介绍了多种幂运算的优化策略,包括平方 - 乘法方法、预计算值方法、以 (b) 为基的表示、特定数制表示等,以及批量 Diffie - Hellman 密钥协商方案和并行化算法。通过对这些方法的分析和对比,我们可以根据具体的应用场景和资源限制,选择合适的策略来提高计算效率和密钥协商的速度。
9.2 展望
随着密码学技术的不断发展,对幂运算和密钥协商的效率要求也越来越高。未来,我们可以进一步研究以下方向:
-
新的数制表示方法
:探索更高效的数制表示方法,以减少乘法次数和存储值数量。
-
并行化算法的优化
:进一步优化并行化算法,提高处理器的利用率和计算效率。
-
与其他密码学技术的结合
:将幂运算和密钥协商方案与其他密码学技术相结合,如量子密码学、同态加密等,以提供更高的安全性和效率。
总之,通过不断地研究和创新,我们可以在密码学领域取得更好的性能和安全性,为各种应用场景提供更可靠的保障。


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



