宽度 - w NAF 方法实现小内存消耗
1. 提出的算法
1.1 数字定义
将数字 |0..0x| 中,当 x 为偶数或奇数时,分别称为偶数位或奇数位。以 w = 4 为例,奇数位有 0001、0011、0101、0111、1001、1011、1101 和 1111。
1.2 偶数位转换为奇数位
提出一种算法,通过考虑向相邻位的进位,将所有偶数位替换为奇数位。具体做法是观察低位的最高位。例如,对于偶数位 |0100|:
- 若序列为 |0100|01∗∗|,且前一位的最高位为 0,则可替换为 |0101|¯1¯1∗∗|。
- 若序列为 |0100|0¯1 ∗∗|,则可替换为 |010¯1|11 ∗∗|。
- 若前一位的最高位为 1,则可将 |0100|1 ∗∗∗| 转换为 |0101|¯1 ∗∗∗|。
通过这种转换,当前位 u[i] 和低位 u[i - 1] 会按照以下公式替换:
u[i] = u[i] + b
u[i - 1] = u[i - 1] - b2w
其中,b = sign(u[i - 1]) 是低位的符号,即当 u[i - 1] > 0 时,b = 1;当 u[i - 1] < 0 时,b = -1。
1.3 常见偶数位转换示例
|0010|∗ → |0011| ∗ 或 |001¯1|∗
|1000|∗ → |1001| ∗ 或 |100¯1| ∗
|0100|∗ → |0101| ∗ 或 |010¯1|∗
|1010|∗ → |1011| ∗ 或 |101¯1| ∗
|0110|∗ → |0111| ∗ 或 |011¯1|∗
|1100|∗ → |1101| ∗ 或 |110¯1| ∗
|1110|∗ → |1111| ∗ 或 |111¯1| ∗
1.4 处理低位为 |0000| 的情况
零序列 |∗∗∗0|0000|01∗∗| 可替换为 | ∗∗∗1|¯1¯1¯1¯1|¯1¯1 ∗∗| 或 | ∗∗∗¯1|1111|1 ∗∗∗|,使高位和低位都变为奇数位。这种转换可应用于低位非零的情况(如 | ∗∗∗0|0000|0001|)和更长的零序列 | ∗∗∗0|0000|0000|…|0000|01∗∗|,通过上述相同的算法实现。
1.5 算法流程
Algorithm SPA-resistant Width-w NAF with Odd Scalar
INPUT An odd n-bit scalar value d and k = ⌈n/w⌉
OUTPUT
dw[n], dw[n - 1], ..., dw[0].
1. u[0] ← d mod 2w
2. d ← d - u[0]
3. d ← d / 2w
4. For i = 1 to k
4.1. u[i] ← d mod 2w
4.2. if u[i] is even,
b ← sign(u[i - 1]), u[i] ← u[i] + b, u[i - 1] ← u[i - 1] - b2w
4.3. dw[(i - 1)w] ← u[i - 1], dw[(i - 1)w + 1] ← 0, ..., dw[(i - 1)w + w - 1] ← 0
4.4. d ← d - u[i], d ← d / 2w
5. dw[kw] ← u[k], dw[kw + 1] ← 0, ..., dw[kw + w - 1] ← 0
6. Return dw[n], dw[n - 1], ..., dw[0]
2. 最低有效位(LSB)和最高有效位(MSB)的处理
2.1 最低有效位(LSB)
提出的方法利用低位将偶数位替换为奇数位,最低位保持不变。若最低位为奇数,可使用预计算表,该表存储所有奇数点;若为偶数,为避免进行偶数点的加法和虚拟操作,采用以下技巧:
- 若标量 d 为偶数,则将其转换为 d′ = d + 1。
- 若标量 d 为奇数,则将其转换为 d′ = d + 2。
计算标量乘法 d′P,再通过减法 (d′P - P) 或 (d′P - 2P) 恢复标量乘法 dP。由于预计算表不存储偶数点,最终减法需要计算 2P,但在计算 d′P 时,预计算表已不再需要,可丢弃该表,使内存可重复使用,不会增加内存消耗。
2.2 最高有效位(MSB)
与某一标量的位长度相比,使用宽度 - w NAF 方法转换后的标量位长度可能会增加一位。例如,25 = (11001)₂ 使用宽度 - 2 NAF 转换为 10¯1001,位长度增加了一位;而 19 = (10011)₂ 的 NAF 表示为 1010¯1,与原长度相同。因此,可通过确认位长度是否扩展来检测高位。
使用与标量位长度互质的 NAF 宽度可以固定数字长度,特别是当标量的位长度为质数时,其数字长度不会扩展。
3. 内存消耗
3.1 预计算表选择
由于提出的算法中每个数字始终为奇数,可选择预计算表 Eodd = {P, 3P, 5P, …, (2w - 1)P}。该表的密度 #Eodd 为 2w - 1,小于 M¨oller 方案的 #EM = 2w - 1 + 1。
3.2 证明 Eodd 具有最小密度
命题:若 E 是一个代表类,则 #E ≥ 2w - 1 成立。
证明:假设 (u[i])i∈[0,k] 和 (u′[i])i∈[0,k] 分别与标量 d 和 d′ 相关联,即 d = ∑(i = 0 到 k) u[i]2wi,d′ = ∑(i = 0 到 k) u′[i]2wi,且 u[i] 或 -u[i](u′[i] 或 -u′[i])属于 E。若对于所有 i ∈[0, k] 都有 u[i] = u′[i],则 d = d′。这意味着所有宽度 - w NAF 表示的数量大于所有标量 d 的数量,因为对于任何标量 d 至少存在一种宽度 - w NAF 表示。另一方面,所有宽度 - w NAF 表示的数量为 (2 · #E)k + 1,所有标量的数量为 2n。由于 k + 1 = n/w,可得 #E ≥ 2w - 1。
M¨oller 方案及其增强版本在内存消耗方面并非最优,前者的代表类有 2w + 1 个点,后者有 2w - 1 + 1 个点,浪费了一个点。
4. 安全分析
4.1 简单功率分析(SPA)
提出的方法通过固定模式 |0…0x|0…0x|…|0…0x|(x 非零)计算标量乘法。攻击者可通过测量功耗区分椭圆加法和加倍操作,但对于所有标量,都会得到相同的序列 |D…DA|D…DA|…|D…DA|(A 表示椭圆加法,D 表示加倍),因此无法通过 SPA 检测到秘密标量。
4.2 差分功率分析(DPA)
使用投影随机化方法,如随机投影坐标或随机同构曲线,可防止 DPA 攻击。这些对策在每次执行时将输入点的值转换为其他不同的值,使攻击者难以预测计算中的特定值。
4.3 二阶 DPA
虽然提出的方法使用了预计算表,可能会受到二阶 DPA 攻击,但可采用表随机更新的对策。即每次加载表中的条目时,对该条目进行重新随机化并重写,确保每次加载的是不同的数据,从而防止二阶 DPA 攻击。
5. 计算成本
5.1 计算单个数字的成本
提出的方案中数字具有固定模式 |0…0x|(x 为非零整数),计算一个数字需要进行 w 次 ECDBL 和一次 ECADD,若预计算点的 Z 坐标转换为 1,则需要 (4w + 8)M + (4w + 5)S;否则需要 (4w + 12)M + (6w + 4)S。
5.2 SPA 抗性方案的计算时间
假设从最高有效位开始计算标量乘法,预计算点的生成公式为 3P = 2P + P,5P = 3P + 2P,…,(2w - 1)P = (2w - 3)P + 2P,所需时间为 (12M + 4S)(2w - 3)。将这些点转换为仿射坐标,使用 Montgomery 技巧后,计算时间为 (6M + 1S)(2w - 3) - 3M + 1I。使用预计算技巧可进一步减少计算时间,最终总计算时间为 (5·2w - 1 +(4k + 2)w + 8k + 9)M +(2w - 1 +(4k + 2)w + 5k + 6)S +(w + 1)I,其中 k = ⌈n/w⌉。
5.3 二阶 DPA 抗性方案的计算时间
生成预计算表需要 (12M + 4S)(2w - 3),在进行椭圆曲线加法前,需要对表的值进行随机化,需要 4M + 1S。主循环需要 k(4w + 12)M + k(6w + 4)S,后处理需要 16M + 10S,仿射转换需要 3M + 1S + 1I,总计算时间为 (12 · 2w + (4w + 16)k - 17)M + (4 · 2w + (6w + 5)k - 1)S + 1I。
假设 S = 0.8M,I = 20M,对于 160 位标量,不同 w 值下的计算时间如下表所示:
| w | SPA - 抗性方案(M) | 表大小(提出的方案,位) | 表大小(M¨oller 方案,位) | 二阶 DPA 抗性方案(M) | 表大小(提出的方案,位) | 表大小(M¨oller 方案,位) |
|----|----|----|----|----|----|----|
| 2 | 2205 | 640 | 960 | 3071 | 960 | 1440 |
| 3 | 1942 | 1280 | 1600 | 2929 | 1920 | 2400 |
| 4 | 1807 | 2560 | 2880 | 2453 | 3840 | 4320 |
| 5 | 1781 | 5120 | 5440 | 2537 | 7680 | 8160 |
提出的 SPA 抗性方案的计算时间与 NAF 相当,而二阶 DPA 抗性方案需要更多时间,因为预计算点必须进行随机化,且不能使用更快的加法公式 ECADDEZ = 1。
6. 与使用虚拟操作方案的关系
6.1 现有虚拟操作方案
实现 SPA 抗性方案的另一种方法是在标量乘法中插入虚拟操作,如 Coron 为标准二进制方法提出的带虚拟操作的方案,以及 Hitchcock 等人对 NAF 插入虚拟操作的方案(称为 HM 虚拟操作)。
6.2 提出的带虚拟操作的方案
提出一种基于虚拟操作的简单构造,将 Coron 的虚拟操作扩展到有符号宽度 - w NAF 方法。具体算法如下:
Algorithm SPA-resistant Width-w NAF with Dummy
INPUT A n-bit scalar value d, point P, and k = ⌈n/w⌉
OUTPUT d ∗ P.
1. For i = 0 to k
1.1. u[i] ← d mods 2w, d ← d - u[i], d ← d / 2w
2. Pre-compute (|u[i]|)P for all u[i] ((|u[i]|)P ← P for u[i] = 0)
3. Q[0] ← u[i]P
4. For i = k - 1 down to 0
4.1. Q[0] ← w-time ECDBL(Q[0])
4.2. Q[1] ← ECADD(Q[0], u[i]P)
4.3. Q[0] ← Q[δ(u[i])]
5. Return Q[0]
步骤 1.1 中的 “mods” 是有符号余数类,与宽度 - w NAF 相同。该方案会存储偶数点,预计算表的总大小为 2w - 1。在步骤 4.2 中,若 d[i] = 0,则计算一个虚拟椭圆曲线加法。步骤 4.3 中的 Q[0] ← Q[δ(u[i])] 选择标量乘法的合适值,其中 δ(u[i]) 在 u[i] = 0 时为 0,否则为 1。由于使用了虚拟操作,在整个标量乘法过程中应使用修改后的 Jacobian 坐标。
不同带虚拟操作的 SPA 抗性方案的效率比较如下表所示:
| 方案 | 效率 |
|----|----|
| Coron 虚拟操作 | n ECDBLs + n ECADDs,3096M |
| HM 虚拟操作 | (10n/9) ECDBLs + (5n/9) ECADDs,2459M |
| 提出的方案(w = 2) | n ECDBLs + (n/2) ECDBLs,2216M |
提出的方案比 HM 方案和 Coron 方案更快。
综上所述,基于宽度 - w NAF 的 SPA 抗性方案在效率和内存方面都具有优势,其内存需求小于 M¨oller 方案,且提出的带虚拟操作的方案简单且速度更快。
7. 方案流程总结
7.1 奇数标量 SPA 抗性宽度 - w NAF 算法流程
为了更清晰地展示奇数标量 SPA 抗性宽度 - w NAF 算法的执行过程,我们可以将其流程用 mermaid 流程图表示:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(输入奇数 n 位标量值 d 和 k = ⌈n/w⌉):::process
B --> C(u[0] ← d mod 2w):::process
C --> D(d ← d - u[0]):::process
D --> E(d ← d / 2w):::process
E --> F{i = 1 到 k}:::decision
F -- 是 --> G(u[i] ← d mod 2w):::process
G --> H{u[i] 是偶数?}:::decision
H -- 是 --> I(b ← sign(u[i - 1]), u[i] ← u[i] + b, u[i - 1] ← u[i - 1] - b2w):::process
H -- 否 --> J(跳过偶数处理):::process
I --> K(dw[(i - 1)w] ← u[i - 1], dw[(i - 1)w + 1] ← 0, ..., dw[(i - 1)w + w - 1] ← 0):::process
J --> K
K --> L(d ← d - u[i], d ← d / 2w):::process
L --> F
F -- 否 --> M(dw[kw] ← u[k], dw[kw + 1] ← 0, ..., dw[kw + w - 1] ← 0):::process
M --> N([返回 dw[n], dw[n - 1], ..., dw[0]]):::startend
这个流程图详细展示了算法从输入到输出的整个过程,包括对偶数位的处理以及循环迭代的步骤。
7.2 带虚拟操作的 SPA 抗性宽度 - w NAF 算法流程
同样,我们可以用 mermaid 流程图来表示带虚拟操作的 SPA 抗性宽度 - w NAF 算法的流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(输入 n 位标量值 d、点 P 和 k = ⌈n/w⌉):::process
B --> C{i = 0 到 k}:::decision
C -- 是 --> D(u[i] ← d mods 2w, d ← d - u[i], d ← d / 2w):::process
D --> C
C -- 否 --> E(预计算 (|u[i]|)P 对于所有 u[i] ((|u[i]|)P ← P 对于 u[i] = 0)):::process
E --> F(Q[0] ← u[i]P):::process
F --> G{i = k - 1 到 0}:::decision
G -- 是 --> H(Q[0] ← w - time ECDBL(Q[0])):::process
H --> I{是否 d[i] = 0?}:::decision
I -- 是 --> J(计算虚拟椭圆曲线加法):::process
I -- 否 --> K(正常椭圆曲线加法):::process
J --> L(Q[1] ← ECADD(Q[0], u[i]P)):::process
K --> L
L --> M(Q[0] ← Q[δ(u[i])]):::process
M --> G
G -- 否 --> N([返回 Q[0]]):::startend
这个流程图清晰地展示了带虚拟操作的算法在标量乘法过程中如何处理虚拟操作以及选择合适的结果。
8. 关键技术点分析
8.1 偶数位转换奇数位的原理
在提出的算法中,将偶数位转换为奇数位是核心步骤之一。其原理基于对相邻位进位的考虑,通过观察低位的最高位来决定如何替换偶数位。例如,对于偶数位 |0100|,根据前一位的最高位不同,有不同的替换方式。这种转换方式保证了在转换过程中,除最低位外,序列中的其他位都变为奇数位。具体的转换公式 u[i] = u[i] + b 和 u[i - 1] = u[i - 1] - b2w 确保了转换的准确性和一致性,其中 b 是低位的符号。
8.2 最低有效位和最高有效位处理的意义
- 最低有效位(LSB) :最低有效位的处理是为了避免使用偶数点进行加法和虚拟操作,从而减少内存消耗。通过将标量转换为奇数标量 d′,并在计算后通过减法恢复原始标量乘法,同时利用预计算表不再需要的特点,实现了内存的重复使用。
- 最高有效位(MSB) :最高有效位的处理涉及到位长度的扩展问题。使用与标量位长度互质的 NAF 宽度可以固定数字长度,避免位长度的扩展,从而提高方案的安全性和稳定性。
8.3 内存消耗优化的关键
内存消耗优化的关键在于选择合适的预计算表。提出的方案选择了 Eodd = {P, 3P, 5P, …, (2w - 1)P} 作为预计算表,其密度为 2w - 1,小于 M¨oller 方案的密度。通过证明 Eodd 具有最小密度,确保了在内存使用上的优势。
8.4 安全防护机制分析
- SPA 防护 :方案通过固定的计算模式 |0…0x|0…0x|…|0…0x| 使得攻击者在测量功耗时得到相同的序列,无法区分不同的标量,从而实现了对 SPA 的防护。
- DPA 防护 :使用投影随机化方法,如随机投影坐标或随机同构曲线,将输入点的值随机化,使攻击者难以预测计算中的特定值,有效防止了 DPA 攻击。
- 二阶 DPA 防护 :通过表随机更新的对策,每次加载表中的条目时进行重新随机化并重写,确保每次加载的数据不同,防止了二阶 DPA 攻击。
9. 应用建议
9.1 不同场景下的方案选择
- 对内存要求较高的场景 :如果系统的内存资源有限,建议选择基于宽度 - w NAF 的 SPA 抗性方案,其内存需求小于 M¨oller 方案,能够有效节省内存。
- 对计算速度要求较高且对安全有一定要求的场景 :可以选择提出的带虚拟操作的方案,该方案比 HM 方案和 Coron 方案更快,在保证一定安全性的同时提高了计算效率。
- 对安全要求极高的场景 :可以考虑使用二阶 DPA 抗性方案,虽然计算时间相对较长,但能够有效抵御二阶 DPA 攻击。
9.2 参数选择建议
- w 值的选择 :w 值的选择会影响计算成本和内存消耗。一般来说,较小的 w 值可能会导致计算时间较长,但内存消耗相对较小;较大的 w 值可能会减少计算时间,但内存消耗可能会增加。对于 160 位标量,可以参考前面给出的计算时间表格,根据实际需求选择合适的 w 值。
- 标量位长度与 NAF 宽度的关系 :为了固定数字长度,避免位长度的扩展,建议选择与标量位长度互质的 NAF 宽度。特别是当标量的位长度为质数时,更能保证数字长度的稳定性。
10. 总结
基于宽度 - w NAF 的 SPA 抗性方案在多个方面展现出了显著的优势。在效率上,提出的方案无论是 SPA 抗性方案还是带虚拟操作的方案,都具有较好的表现,计算时间与同类方案相比具有竞争力,甚至在一些情况下更快。在内存消耗方面,通过选择合适的预计算表,其内存需求小于 M¨oller 方案,实现了小内存消耗的目标。在安全性能上,该方案能够有效抵御 SPA、DPA 和二阶 DPA 攻击,为系统提供了可靠的安全保障。
同时,提出的带虚拟操作的方案简单且速度更快,为实现 SPA 抗性提供了一种新的有效途径。不同的应用场景可以根据自身的需求选择合适的方案和参数,以达到最佳的性能和安全平衡。未来,随着技术的不断发展,基于宽度 - w NAF 的方案有望在更多领域得到应用和进一步的优化。
超级会员免费看
14

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



