SM9 算法中的塔式扩张公式推导
本篇记录一下在实现 SM9 算法时塔式扩张部分的公式推导与代码实现. 由于没有系统学习过相关数学理论, 因此只是根据有限的认识完成了推导, 可能存在不严谨之处.
SM9 扩域元素的表示
以下来自 GB/T 38635.1-2020 A.2 部分 "扩域元素的表示" 小节原文内容.
$F_{q^{12}}$ 的 $1\text{-}2\text{-}4\text{-}12$ 塔式扩张:
$$
\begin{align*}
& F_{q^{2}}[u] = F_{q}[u]/(u^2 - \alpha), && \alpha = -2 \\
& F_{q^{4}}[v] = F_{q^{2}}[v]/(v^2 - \xi), && \xi = u \\
& F_{q^{12}}[w] = F_{q^{4}}[w]/(w^3 - v), && v^2 = \xi
\end{align*}
$$
其中, 第一次的 2 次扩张约化多项式为: $x^2 - \alpha, \alpha=-2$;
第二次进行 2 次扩张的约化多项式为: $x^2 - u, u^2 = \alpha, u = \sqrt{-2}$;
第三次进行 3 次扩张的约化多项式为: $x^3-v, v^2=u, v = \sqrt{\sqrt{-2}}$.
$u$ 属于 $F_{q^{2}}$, 表示为 $(1, 0)$.
$v$ 属于 $F_{q^{4}}$, 表示为 $(0, 1, 0, 0)$, 也可以用 $F_{q^{2}}$ 元素表示为 $((0, 1), (0, 0))$.
公式推导
加法和减法就是类似于向量运算, 每个位置进行加减并模 $p$ 即可, 因此只需要推导乘法和模逆运算.
2 次扩域
设 $X = (x_1, x_0), Y = (y_1, y_0), Z = (z_1, z_0)$, 且 $Z = X \cdot Y$, 约化多项式为: $u^2 - \alpha, \alpha=-2$.
则 $Z$ 可以表示为:
$$
\begin{align*}
(z_1, z_0) &= (x_1, x_0) \cdot (y_1, y_0) \\
~ &= (x_1u + x_0)(y_1u + y_0) \\
~ &= x_1y_1u^2 + (x_1y_0 + x_0y_1)u + x_0y_0 \\
~ &= (x_1y_0 + x_0y_1)u + (\alpha x_1y_1 + x_0y_0) \\
~ &= (x_1y_0 + x_0y_1, \alpha x_1y_1 + x_0y_0)
\end{align*}
$$
所以:
$$
\left\{
\begin{align*}
z_1 &= x_1y_0 + x_0y_1 \\
z_0 &= \alpha x_1y_1 + x_0y_0
\end{align*}
\right.
$$
然后设 $Y = X^{-1}$, 也就是求 $X$ 的模逆:
$$
(0, 1) = (x_1, x_0) \cdot (y_1, y_0)
$$
即解二元一次方程组:
$$
\left\{
\begin{align*}
0 &= x_1y_0 + x_0y_1 \\
1 &= \alpha x_1y_1 + x_0y_0
\end{align*}
\right.
$$
解得:
$$
\left\{
\begin{align*}
y_1 &= \frac{x_1}{\alpha x_1^2 - x_0^2} \\
y_0 &= \frac{-x_0}{\alpha x_1^2 - x_0^2}
\end{align*}
\right.
$$
上述公式将 $F_{q^{2}}$ 中的运算全部变成 $F_{q}$ 中的运算, 所有元素计算后均需要模 $p$.
4 次扩域
设 $X = (X_1, X_0), Y = (Y_1, Y_0), Z = (Z_1, Z_0)$, 且 $Z = X \cdot Y$, 约化多项式为: $v^2 - u, u^2 = \alpha, u = \sqrt{-2}$.
其中 $X = (X_1, X_0) = (x_3, x_2, x_1, x_0)$ 是 $F_{q^{4}}$ 上的元素, $X_1, X_0$ 都是 $F_{q^{2}}$ 上的元素, $Y$ 和 $Z$ 同理.
仿照第一次 2 次扩张的过程, 则 $Z$ 可以表示为:
$$
\left\{
\begin{align*}
Z_1 &= X_1Y_0 + X_0Y_1 \\
Z_0 &= u X_1Y_1 + X_0Y_0
\end{align*}
\right.
$$
其中 $u X_1Y_1 = (1, 0) \cdot X_1 \cdot Y_1$, 可以直接使用上一节中 $F_{q^{2}}$ 上的运算完成.
同理可得模逆运算为:
$$
\left\{
\begin{align*}
Y_1 &= \frac{X_1}{u X_1^2 - X_0^2} \\
Y_0 &= \frac{-X_0}{u X_1^2 - X_0^2}
\end{align*}
\right.
$$
其中 $u X_1^2 = (1, 0) \cdot X_1 \cdot X_1$.
12 次扩域
设 $X = (X_2, X_1, X_0), Y = (Y_2, Y_1, Y_0), Z = (Z_2, Z_1, Z_0)$, 且 $Z = X \cdot Y$, 约化多项式为: $w^3-v, v^2=u, v = \sqrt{\sqrt{-2}}$.
其中 $X = (X_2, X_1, X_0) = (x_{11}, x_{10}, \ldots, x_0)$ 是 $F_{q^{12}}$ 上的元素, $X_2, X_1, X_0$ 都是 $F_{q^{4}}$ 上的元素, $Y$ 和 $Z$ 同理.
则 $Z$ 可以表示为:
$$
\begin{align*}
(Z_2, Z_1, Z_0) &= (X_2, X_1, X_0) \cdot (Y_2, Y_1, Y_0) \\
~ &= (X_2 w^2 + X_1w + X_0)(Y_2 w^2 + Y_1w + Y_0) \\
~ &= X_2Y_2w^4 + (X_2Y_1 + X_1Y_2)w^3 + (X_2Y_0 + X_1Y_1 + X_0Y_2)w^2 + (X_1Y_0 + X_0Y_1)w + X_0Y_0 \\
~ &= (X_2Y_0 + X_1Y_1 + X_0Y_2)w^2 + (vX_2Y_2 + X_1Y_0 + X_0Y_1)w + (vX_2Y_1 + vX_1Y_2 + X_0Y_0) \\
~ &= (X_2Y_0 + X_1Y_1 + X_0Y_2, vX_2Y_2 + X_1Y_0 + X_0Y_1, v(X_2Y_1 + X_1Y_2) + X_0Y_0)
\end{align*}
$$
所以:
$$
\left\{
\begin{align*}
Z_2 &= X_2Y_0 + X_1Y_1 + X_0Y_2 \\
Z_1 &= vX_2Y_2 + X_1Y_0 + X_0Y_1 \\
Z_0 &= v(X_2Y_1 + X_1Y_2) + X_0Y_0
\end{align*}
\right.
$$
其中 $v = ((0, 1), (0, 0)) = (0, 1, 0, 0)$, 可以用 $F_{q^{4}}$ 完成计算.
设 $Y = X^{-1}$, 求 $X$ 的模逆:
$$
(\mathbf{0}_{F_{q^4}}, \mathbf{0}_{F_{q^4}}, \mathbf{1}_{F_{q^4}}) = (X_2, X_1, X_0) \cdot (Y_2, Y_1, Y_0)
$$
即解三元一次方程组:
$$
\left\{
\begin{align*}
\mathbf{0}_{F_{q^4}} &= X_2Y_0 + X_1Y_1 + X_0Y_2 \\
\mathbf{0}_{F_{q^4}} &= vX_2Y_2 + X_1Y_0 + X_0Y_1 \\
\mathbf{1}_{F_{q^4}} &= v(X_2Y_1 + X_1Y_2) + X_0Y_0
\end{align*}
\right.
$$
解得:
$$
\left\{
\begin{align*}
Y_2 &= \frac{X_1^2 - X_2X_0}{\mathbf{det}_{F_{q^4}}} \\
Y_1 &= \frac{vX_2^2 - X_1X_0}{\mathbf{det}_{F_{q^4}}} \\
Y_0 &= \frac{X_0^2 - vX_2X_1}{\mathbf{det}_{F_{q^4}}}
\end{align*}
\right.
$$
其中 $\mathbf{det}_{F_{q^4}} = v^2X_2^3 + vX_1^3 + X_0^3 - 3 \cdot (vX_2X_1X_0)$, 符号 $\cdot$ 表示 $F_{q^4}$ 上的标量乘法运算.
代码实现
用 python 简单实现一下上述涉及的所有运算.
1 | from typing import Tuple |
参考
- 信息安全技术 SM9标识密码算法 第1部分:总则
- 伽罗瓦域(有限域)GFq^12上元素的1→2→4→12塔式扩张(1)------第一次扩张
- 伽罗瓦域(有限域)GFq^12上元素的1→2→4→12塔式扩张(2)------第二次扩张