Processing math: 100%

アルゴリズム論特論(塩田) 2020年度教材 第11回

  • 出席代わりに、塩田 ( shiota@is.kochi-u.ac.jp ) 宛てにメールを出してください。
  • 件名は「アルゴリズム論特論第11回出席」としてください。

今日のテーマ

  • mod p の乗法構造
  • 離散対数問題
 公開鍵暗号の安全性の根拠となる問題は、 RSA 暗号では素因数分解問題でしたが、 もう一つ有名なものとして離散対数問題があります。 今日はその離散対数とは何者か、というお話です。

1. 観察

 RSA 暗号では、 鍵生成や暗号化関数・復号関数で xe%n という計算(法べき乗)が使われていました。 法べき乗は、法が素数のときには特徴的な振る舞いをします。 まずはそれを観察してみましょう。
 p を素数、a を法 p の既約剰余類とするとき ( a(Z/pZ)×, 第7回 Def.6 )、
a1, a2, a3,
はどんな振る舞いをするか観察せよ。
  • 例えば p=7, a=2 のときは
    21=2,  22=4,  23=1,  24=2,  25=4,  26=1
    となります。26=1 はフェルマの小定理でわかっていますが、 それまでの間は 2, 4, 1, 2, 4, 1 という数列になります。
  • p=7, a=3 のときはどうでしょうか。
    31=3,  32=2,  33=6,  34=4,  35=5,  36=1
    今度は 3, 2, 6, 4, 5, 1 という数列になりました。
  • 3p17 について表を作ってあります。 ここから download してしばらく自分で観察してみてください。

2. mod p の乗法構造

 1. の観察で e と書いた数はかなり重要な役割を果たしますので名前が付いています。
Def.1 p を素数、a(Z/pZ)× とするとき、 ae=1 となる最小の自然数を「a の位数 (いすう, order) 」と呼ぶ。
Ex.2 p=7 のとき
  • 1 の位数は 1
  • 2, 4 の位数は 3
  • 3, 5 の位数は 6
  • 6 の位数は 2
p=11 のとき
  • 1 の位数は 1
  • 2, 6, 7, 8 の位数は 10
  • 3, 4, 5, 9 の位数は 5
  • 10 の位数は 2
p=13 のとき
  • 1 の位数は 1
  • 2, 6, 7, 11 の位数は 12
  • 3, 9 の位数は 3
  • 4, 10 の位数は 6
  • 5, 8 の位数は 4
  • 12 の位数は 2
 「最小の」というところが効いて次の定理が成り立ちます。
Th.3 a(Z/pZ)× の位数を e とするとき、 af=1 であることと、fe の倍数であることは同値である。
証明 ) fe で割って
f=eq+r   ( 0r<e )
とおくと
1=af=(ae)q×ar=1q×ar=ar
となりますが、e の最小性から r=0. 従って fe の倍数になります。
) f=ek とおけるので af=(ae)k=1k=1.(証明終)

 1. の観察結果を定理として書いておきましょう。
Th.4 a(Z/pZ)× の位数を e とするとき、次が成り立つ。
  1. ep1 の約数である。
  2. a1, , ap1 は、ae から先は繰り返しになる。
  3. (2) の繰り返しの周期は a の位数 e に等しい。
  4. a1, , ap1 には同じ数が (p1)/e 回ずつ現れる。
証明 (1) フェルマの小定理より ap1=1 ですから Th.3 より。
(2)-(4) これは
ae+1=ae×a1=a1,
ae+2=ae×a2=a2,
より必然的にそうなります。(証明終)

 観察 (5) も証明されていて
Th.5 任意の素数 p に対して、 g1, , gp1 がすべて異なるような g(Z/pZ)× が必ず存在する。
 このような g にも名前がついています。
Def.6 Th.3g を mod p の生成元 ( generator )、あるいは原始根 ( primitive root ) と呼ぶ。
 さっきまで a と書いていたのに g と書いたのは generator の頭文字だからですが、 何故 generator と呼ぶかという理由は次の (3) です。
Th.7 次は同値である。
  1. g は mod p の生成元である。
  2. g1, , gp1 はすべて異なる
  3. g1, , gp1 は全体として 1, 2, , p1 に等しい。
  4. g の位数は p1 である。
この状態を群論用語では、「(Z/pZ)×g によって生成される巡回群である」と言う。
 g のべき乗が mod p のすべての既約剰余類を生成する、と言う意味です。 絵としては g のべき乗たちは巡回的に並んでいるので「巡回群」と呼びます。 p=7, g=3 の例では次の図のようになって、 36=30=1 から2周目に突入する、という感じです。
Th.7 の証明 (Z/pZ)× の要素は丁度 p1 個あるので (3) が言え、(4) は Th.2 (4) より従います。(証明終)

 Th.5 の証明は初等的にできますが、そんなに短くはないので省略します。 (初等整数論あるいは公開鍵暗号の教科書には大抵書いてあります。)


2. 離散対数

 指数関数 y=ax の逆関数を対数関数と呼ぶことの analogy で、 ygx(modp) の逆関数を考えます。
Def.8 g を mod p の生成元とするとき、 Th.7 よりすべての y(Z/pZ)× に対して
y=gx
を満たす指数 x が存在する。この x
x=loggy
と表し「 mod p における、底 g に対する y の離散対数」と呼ぶ。
Ex.9  p=11, g=2 のとき
  • log23=
  • log25=
  • log27=
p=13, g=2 のとき
  • log23=
  • log25=
  • log27=
答え
 実数と違って法演算の数には大きさの概念がないので、 離散対数の値は全く予測のつかないものとなっています。

 離散対数は 0loggy<p1 の範囲で必ずひとつ見つかりますが、 gp1=1 なので実は自由度があります。
Th.10 loggy は mod p1 で確定する。
証明 y=gx=gx となるための x, x の必要十分条件は何か、を考える。
gx=gx  gxx=1
  xxg の位数の倍数 ( Th.3 )
  xxp1 の倍数 ( Th.7 )
  xx(mod(p1))
(証明終)  この定理により、対数法則は mod 付きで成立することがわかります。
Th.11(対数法則) logg(yz)loggy+loggz(mod(p1)).
証明 y=gx, z=gx とすると yz=gx+x ゆえ、Th.10 より
logg(yz)x+xloggy+loggz(mod(p1)).
(証明終)
Ex.12 p=13, g=2, y=5, z=7 のとき、
logg(yz)=log235=log29=8,
loggy+loggz=log25+log27=11+9=20.
820 では食い違って見えますが mod 12 で一致しています。
Rem.13 実数の対数も、定義域は全ての正数の集合、値域は全ての実数の集合で、定義域と値域は別ものでした。 離散対数はそのずれが微妙で、定義域は mod p, 値域は mod p1 という訳です。

3. 離散対数問題

Def.14 素数 p, mod p の生成元 g, y(Z/PZ)× を与えたとき loggy を求める問題を離散対数問題 ( DLP = Discrete Logarithm Problem ) と呼ぶ。
Th.15 単純検索による mod p の離散対数問題の計算量は O(plog2p).
 計算量に p が掛かっていますので暗号に使うビット数では天文学的時間がかかります。

証明 g1, g2, y に一致するまで、
(×g)%p
という計算を、平均で p/2 回繰り返さなければならないので。(証明終)

 離散対数問題は一般に困難な問題と考えられていて、このことを利用した暗号技術を次回勉強します。

参考

  • 暗号ライブラリ crypto.py ... 以下のプログラムに引用
  • 単純検索による離散対数計算 DLP.py
    ... p が 25ビットあたりから実行時間が急激に増えていくはずです。

まとめ

  • 素数を法としたとき、その乗法構造は「巡回群」と呼ばれ、「生成元」と呼ばれる元のべき乗が全ての既約剰余類を生成する。
  • mod p の既約剰余類 y が生成元 g の何乗になるかを loggy と表して「離散対数」と呼ぶ。
  • mod p の離散対数は mod p1 の数になる。
  • p, g, y を与えて loggy を求める離散対数問題は困難な問題と考えられている。

自宅学習の例

  • サンプルプログラムを動かしてみる。

戻る