アルゴリズム論特論(塩田)第14回 (1) Pohlig-Hellman 法
戻る / 次へ
$\newcommand{\ol}[1]{\overline{#1}}$
$\newcommand{\znz}[1]{\mathbb{Z}/#1 \mathbb{Z}}$
$\newcommand{\znzc}[1]{(\mathbb{Z}/#1 \mathbb{Z})^{\times}}$
$\newcommand{\inv}[1]{\displaystyle{\frac{1}{#1}}}$
復習
- 離散対数問題 ( DLP ) とは
$\left\{\begin{array}{l} \\ \\ \\\end{array}\right.$ | $p$ : 素数の法 |
$g$ : $\bmod p$ の生成元 |
$y \in (\ZZ/p\ZZ)^{\times}$ |
を与えたとき、離散対数
$x = \log_g y$
を求める問題。ここで $x = \log_g y$ は $\bmod (p-1)$ の数になる。
- $m_1$, $\cdots$ $m_k$ が互いに素な法のとき、
$\bmod (m_1\times\cdots\times m_k)$ の情報
一対一 CRA
$\bmod m_1$, $\cdots$, $\bmod m_k$ の情報たち
Pohlig-Hellman 法
$\bmod p$ の離散対数問題を上の (1), (2) を利用して解くアイデアは割とシンプルです。
Algorithm 1(Pohlig-Hellman 法)
- 入力:素数 $p$, $\bmod p$ の生成元 $g$, $\znzc{p}$ の要素 $y$
- 出力:離散対数 $x = \log_g y$
( ここでは $x$ は $0 \leqq x \lt (p-1)$ の範囲の整数値とする。)
- $p-1$ を素因数分解し
$p-1=q_1^{e_1} \times \cdots \times q_k^{e_k}$
とする。
- 各 $i$ について、次に述べる Alg.2-3 を用いて
$x_i = x \,\%\, q_i^{e_i}$
を求める。
- 中国剰余アルゴリズムを用いて連立合同式
$x \equiv x_i \pmod{ q_i^{e_i}}$
の解 $x$ を求め、出力する。
離散対数 $x$ は $\bmod (p-1)$ の数なので、
$p-1$ が互いに素な法 $q_i^{e_i}$ に分解できて $x \,\%\, q_i^{e_i}$ の値が求められれば、
中国剰余アルゴリズムで $x$ が求められる、という展開です。
Algorithm 2(Alg.1 のステップ 2° simple version )
簡単のため $q_i^{e_i}$ を $q^e$ と書く。
- $n=(p-1)/q^e$ とおく。
- $(g^n)^0$, $(g^n)^1$, $\cdots$, $(g^n)^{q^e-1}$ のリスト $L$ を作る。
- $y^n = (g^n)^a$
を満たす $a$ ( $0 \leqq a \lt q^e$ ) を、2° のリスト $L$ を検索して求めると $x_i=a$ になる。
証明
まず、$x=x_i+q^e X$ とおけますので
$n x = n x_i + n q^e X = n x_i + (p-1) X.$
合同式で書くと
$nx \equiv n x_i \pmod{(p-1)}.$
べき指数は $\bmod{(p-1)}$ の数なので
$y^n = \left(g^x\right)^n = g^{nx} = g^{nx_i} = \left(g^n\right)^{x_i}.$
(証明終)
※ このままでは、$q^e$ が大きいときは検索に掛かる時間が膨大になりますので、
もうひと工夫します。
( 例えば $p = 2^{513} \times 3^{328} + 1$ は素数で、このときは検索幅は $3^{328}$ ( 520ビット ) になります。)
Algorithm 3(Alg.1 のステップ 2° )
$x_i$ の $q$-進数展開を $x_i = a + bq + cq^2+ \cdots$ とし、
$a$, $b$, $c$, $\cdots$ を次の順に求める:
- $m=(p-1)/q$, $m_2=(p-1)/q^2$, $m_3=(p-1)/q^3$, $\cdots$ とおく。
- $(g^m)^0$, $(g^m)^1$, $\cdots$, $(g^m)^{q-1}$ のリスト $L'$ を作る。
- $y^m = (g^m)^a$
を満たす $a$ ( $0 \leqq a \lt q$ ) を、2° のリスト $L'$ を検索して求める。
- $\left(y \times g^{-a} \right)^{m_2} = (g^m)^b$
を満たす $b$ ( $0 \leqq b \lt q$ ) を同様にして求める。
- $\left(y \times g^{-(a+bq)} \right)^{m_3} = (g^m)^c$
を満たす $c$ ( $0 \leqq c \lt q$ ) を同様にして求める。
- $\left(y \times g^{-(a+bq+cq^2)} \right)^{m_4} = (g^m)^d$
を満たす $d$ ( $0 \leqq d \lt q$ ) を同様にして求める。
以下同様。
証明
まず、$x=a+q X$ とおけますので
\begin{align}
m x &= m a + m q X = m a + (p-1) X \\
\therefore m x &\equiv m a \pmod{(p-1)} \\
\therefore y^m &= \left(g^x\right)^m = g^{mx} = g^{ma} = \left(g^m\right)^{a} \\
\end{align}
次は、$x=a+qb + q^2 Y$ とおけますので
\begin{align}
x - a &= qb + q^2 Y \\
m_2 (x - a) &= m_2 q b + m_2 q^2 Y = m b + (p - 1) Y \\
\therefore m_2 (x - a) &\equiv m b \pmod{(p - 1)} \\
\therefore \left(y \times g^{-a} \right)^{m_2} &= \left(g^{x-a}\right)^{m_2} = g^{mb} =\left(g^m\right)^{b} \\
\end{align}
その次は、$x=a+qb + q^2 c + q^3 Z$ とおけますので
\begin{align}
x - (a + bq)& = q^2 c + q^3 Z \\
m_3 (x - (a + bq)) &= m_3 q^2 c + m_3 q^3 Z = m c + (p - 1) Z \\
\therefore m_3 (x - (a+bq)) &\equiv m c \pmod{(p - 1)} \\
\therefore \left(y \times g^{-(a+bq)} \right)^{m_3} &= \left(g^{x-(a+bq)}\right)^{m_3} = g^{mc} =\left(g^m\right)^{c} \\
\end{align}
以下同様です。(証明終)
小さい実行例
アルゴリズムの実行例を見てみましょう。
Ex.3 $p=101$, $g=2$, $y=26$ として $x = \log_2 26$ を求めます。
(もちろんこのような小さい数なら全検索でも一瞬で答えが出ます。)
$p-1=100=2^2 \times 5^2$
ですから
$x \,\%\, 2^2$ と $x \,\%\, 5^2$ を求める部分が肝心 なところです。
- $x\,\%\, 2^2$ を求める。
- $q=2$ なので $m=(p-1)/q=50$, $m_2=(p-1)/q^2=25$.
- $(g^{50})^0 = 1$, $(g^{50})^1 = 100$.
- $y^{50} = (g^{50})^{a}$ に $y=26$ を入れると
$100 = (g^{50})^a$
となりますが、2° のリストと比較して $\require{color}\textcolor{red}{a=1}$.
- $\left\{y \times g^{-1}\right\}^{25} = (g^{50})^{b} $
に $y=26$, $g^{-1}=51$ を入れると
$100 = (g^{50})^{b}$
となりますが、再び 2° のリストと比較して $\textcolor{blue}{b=1}$.
従って $x \,\%\, 2^2 = \textcolor{red}{a} + \textcolor{blue}{b} \times 2 = \textcolor{red}{1} + \textcolor{blue}{1} \times 2 = 3$.
- $x\,\%\, 5^2$ を求める。
- $q=5$ なので $m=(p-1)/q=20$, $m_2=(p-1)/q^2=4$.
- $(g^{20})^0 = 1$, $(g^{20})^1 = 95$, $(g^{20})^2 = 36$, $(g^{20})^3 = 87$, $(g^{20})^4 = 84$.
- $y^{20} = (g^{20})^{a}$ に $y=26$ を入れると
$36 = (g^{20})^{a}$
となりますが、2° のリストと比較して $\textcolor{red}{a=2}$.
- $\left\{y \times (g^{-1})^2\right\}^{4} = (g^{20})^{b}$
に $y=11$, $g^{-1}=51$ を入れると
$87 = (g^{20})^{b}$
となりますが、再び 2° のリストと比較して $\textcolor{blue}{b=3}$.
従って $x \,\%\, 5^2 = \textcolor{red}{a} + \textcolor{blue}{b} \times 5 = \textcolor{red}{2} + \textcolor{blue}{3} \times 5 = 17$.
-
中国剰余アルゴリズムを用いて連立合同式
$x \equiv 3 \pmod{4}$, $x \equiv 17 \pmod{25}$
を解いて $x=67$ が得られます。
- 検算をしておくと $2^{67} \,\%\,101=26$. 御明算です。
計算量
Th.5 $p-1$ の素因数分解がわかっているとき、
Pohlig-Hellman 法の計算量は、$Q=\max_i q_i$ として $\max(O(Q), O(\log^3 p))$.
証明 高速べき乗法、逆数計算、中国剰余アルゴリズムの計算量は高々 $O(\log^3 p))$ であり、
Alg.2 におけるリストとの比較が $O(Q)$ です。(証明終)
Cor.6 $p-1$ が小さい素因数しか持たなければ、
$\bmod p$ の離散対数は Pohlig-Hellman 法によって高速に求めることができる。
証明 $Q$ が小さいので。(証明終)
※ 従って、
$\bmod p$ の離散対数を利用する暗号では $p-1$ が大きな素因数を持つような $p$ を選択する必要があります。