SM2 算法中底层模块抗侧信道
标量乘 ( [ k ] G [k]G [k]G) 运算过程中需要用到大量的倍点运算与点加运算。传统倍点运算与点加运算之间由于需要的运算次数不同,功耗存在明显区别,攻击者可以通过功耗波形特征分析密钥信息。传统算法如下图所示:

在传统算法中, d i d_i di 等于 0 0 0 和 1 1 1 对应不同的执行指令,图中符号 Π 0 \Pi_0 Π0 代表倍点运算,符号 Π 1 \Pi_1 Π1 代表点加运算。可参考侧信道原子算法,调整点加和倍点运算过程中寄存器运算顺序,采用原子块形式将点加运算和倍点运算都划分为若干个原子小块,每个小块先进行模乘运算,再进行模加运算,最后进行模减运算,其结构表示为 Γ \Gamma Γ。用 '☆’表示不影响最终结果的一次加/减的空操作。如此,实际计算过程中总在执行一组组相同操作,点加和倍点之间的功耗曲线将变得更加连续,从而达到抗SPA攻击的目的。以固定参数倍点运算和固定点加运算为例,如表1所示是改进的原子小块点加运算,如表2所示是改进的原子小块倍点运算。
表1 改进的原子小块点加运算

表2 改进的原子小块倍点运算

SM2 算法中标量乘抗侧信道模块
NAF 标量乘法算法是标量乘法算法的一种增强,该算法使用了非邻接形式(Non-Adjacent Form)表达,减少了算法的期望运行时间。下面是具体算法细节:
将 标量表示为 k = ∑ i = 0 l − 1 k i × 2 i k =\sum_{i=0}^{l-1}k_i\times 2^i k=∑i=0l−1ki×2i,其中 k i ∈ { 0 , + , − } k_i\in \{0,+,-\} ki∈{
0,+,−}。一个十分有用的有符号整数表达,规定 k l − 1 ≠ 0 k_{l-1}\neq 0 kl−1=0,且没有两个相邻的 k i = 0 k_i = 0 ki=0。
NAF 表示有如下性质
- 每个正整数 k k k 都有独一无二的 NAF 表达。记作 N A F ( k ) NAF(k) NAF(k);
- N A F ( k ) NAF(k) NAF(k) 有所有 k k k的有符号表达最少得非零数字;
- N A F ( k ) NAF(k) NAF(k) 的长度最多比二进制表达多1位;
- 如果 N A F ( k ) NAF(k) NAF(k)长度为 l l l,那么有 2 l 3 < k < 2 l + 1 3 \frac{2^l}{3}<k<\frac{2^{l+1}}{3} 32l<k<32l+1;
- 在所有长度为 l l l 的 NAF中,非零系数的概率约为 1 / 3 1/3 1/3
N A F ( k ) NAF(k) NAF(k) 能够通过以下算法计算
输入 : 正整数 k k k
输出 : N A F ( k ) NAF(k) NAF(k)
i ← 0 i\leftarrow 0 i←0
当 k ≥ 0 k \geq 0 k≥0 执行
若 k k k 为奇数,则
k i ← 2 − ( k m o d 4 ) k_i\leftarrow 2-(k \mod 4) k

最低0.47元/天 解锁文章
1404

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



