ハローワールド。
予め断っておくと、筆者はここらへんの数学を専攻していたわけでもなんでも無いので、理論に穴だらけの可能性があります。
また、私がそうなので、数学についてほとんど知らない人でもある程度理解できる内容になっています。そのつもりです。
DH法の安全性
DH法やDSAでは離散対数問題を基として、鍵交換やデジタル署名しています。
特にDH法やDSAは剰余群(剰余環)での計算の非対称性を利用しています。
DH法では公開鍵は秘密鍵より下記の式で導くことが出来ました。
この時は任意の自然数、は十分大きな素数です。具体的な値は筆者によるDH法をまとめた記事を参照ください。
累乗の余りの計算
このというのはしばしば累乗、は剰余と呼ばれます。更には、このという式のことを「合同式」と呼んだりもするらしいです。
剰余にはという性質があります。累乗でも同じようにできるため、を求めてからとの剰余を計算するよりかは大きな数を扱わなくて良くなる分簡単に値を求めることが出来ます。
累乗はバイナリ法と呼ばれるアルゴリズムで計算回数を抑えて計算が可能です。具体的なアルゴリズムはここでは省略するので、将来の私が書くのをまつか、グーグルで検索すると良いです。
またバイナリ法の処理で都度剰余をとってあげることで高速に累乗における余りの演算が可能です。
このバイナリ法ですが、ここではの数、特にを2進数に直した際、1の数だけ追加で計算が発生します。1の数だけ追加で処理が走り、処理時間が変化するということは、つまりサイドチャネル攻撃[1]に対して脆弱になってしまいます。
サイドチャネル攻撃に強いとされるアルゴリズムでは「モンゴメリ累乗余演算」と呼ばれるものがあります。「モンゴメリ乗算」または「モンゴメリ法」は巨大な数における除算を加算、減算、乗算、ビット演算のみで行う方法で、多倍長整数演算などでよく用いられるものです。
このモンゴメリ累乗余計算はバイナリ法より計算数は多くなりますが、それでも高速に求められサイドチャネル攻撃に強い攻撃です。
離散対数の計算
累乗余、つまりの計算は高速にできるアルゴリズムがあります。
しかし、の値がわかっているときに秘密鍵を求めるのはどうでしょうか。
まずはpを法とする世界[2]から離れ、からを求めます。
これは対数で簡単に求められますね。つまりを求めればいいのです。とくにが全て整数である事が分かっているので、が2の場合はを2進数に直して桁数を数えてあげれば良くて、が任意の値でもという対数の性質(底の変換公式)を使えば簡単に求められます。おそらく。
しかしpを法とする世界に来ると途端に難しくなります。すなわちとなるをから計算する効率的なアルゴリズムは見つかっていません。嘘です、量子アルゴリズムの世界なら見つかってます。ipaがアルゴリズムを記載しています。私には1mmも理解できませんでした。
この時、効率的なアルゴリズム、というのは「多項式時間」で解けることを指します。対義語は「指数関数時間」です。多項式時間は要素数に対して(ここでは定数)で解けることを指し、指数関数時間はで解けることを指します[3]。
量子コンピューターは近年話題に尽きませんが、未だ現実的に解を得ることは出来ていません。そのため、DH法やDSAは累乗余を求めるのと離散対数を求めるのとの計算の非対称性さを基として暗号の強さを担保しています。
離散対数問題…の前に群
離散対数問題にちゃんと取り組む前に群について復習しておきます。DH法だけを学ぶためにはあまり必要はないかもしれませんが。
群。ここからはずいぶん数学チックとなります。このあたりは高専で少し学んだかな…という感じですね。
これらは数学の基礎の基礎となる概念とも言えるでしょう。基本的に実数とか行列とかなんとかとか色々の中から共通となるものを抜き出したもの、みたいな雰囲気でしょうか。
ここからは必要な部分だけピックアップしていくので殆どを網羅していないことに注意してください。
集合
群を学ぶ前に集合についておさらいです。
集合はものの集まりのことで、集合を構成するもののことを「要素」または「元」と呼びます。集合については下記の記号を用いて表現されます。
特にDH法やDSA、RSA全体では整数全体の集合であるを用いる場合が多いです。
で囲うことでも集合を表すことができます。
また、ある性質で集合を表現するときは下記のようになります。
例えば偶数の集合は下記のように表現できます。
ちなみに集合では必ずやという記号が用いられます。それぞれ「すべての」「ある特定の」みたいなニュアンスの記号ですが、なんとなく顔文字っぽく見えるので本記事では利用しません。
部分集合
これは直感的に分かる話で、ある集合とにおいて集合の任意の要素がすべての要素に属していた場合、はの部分集合と呼びます。
またこのときまたはと記載します。
例えば、自然数の集合の要素はすべて整数の集合に含まれています。そのためはの部分集合と呼べます。なのでですね。
写像
ある集合の要素を別の集合の要素と一対一で対応させるような規則を集合から集合への写像と呼びます。記号で表すと下記の様な書き方があるようです。
特にをAの変換と呼びます。例えばに対してとすると1は-1へ、-2は2へなるので最終的な集合はと同じになりますね。
この写像、実数の世界では関数と呼ばれることが多いですね。集合や群などは実数の世界以外へも広がるためかなり抽象的な見た目をしていますが、基本的には関数と同じものです。
であるとき、の要素がの要素に対応するとき、をによるの像と呼びます。このときすべての要素に紐づく必要はありませんし、の要素に対するが同じ値になる可能性もあります。
直積集合
集合と集合のそれぞれの元、をそれぞれ対にしたものを順序対と呼びます。を第1成分、を第2成分とし、となるにはであると定義します。
この順序対の全体の集合をとの直積集合と呼び、下記の式で表します。
群
集合や写像には上記の他にも色々覚えるべきことはありますが、とりあえず「群」を学ぶためには上記だけで十分です。これ以上記載しても書いてる僕が眠くなるだけですからね。
では群の定義について見てみましょう。
群の定義
- 集合の直積集合からGへの写像が1つ与えられているとする()。この写像をの2項演算と呼ぶ。の元のこの写像による像をとの積と呼び、記号またはを表す。このとき、集合に1つの2項演算(単純に演算と呼ぶこともある)が与えられると呼び、と表す。
ちなみに演算が明らかである場合は単にと記載される場合があります。
-
集合に1つの演算が与えられていて、次の条件を満たす場合、はこの演算に関して群をなす、または群であるという。
- 結合律: の中の任意の元に対して常にが成立する。
- 単位元: の中の任意の元に対してを満たす特別な元が存在する。この時aは可逆であると呼ぶ。
- 逆元: の中の任意の元に対してを満たすが存在する。
3.の逆元の存在ですが、この逆元はが決まれば一位に決まります。またこの逆元をと表記します。
ちなみに、1だけを満たす集合を「半群」、1と2を満たす集合を「モノイド」と呼びます。なんかH(askell)な気持ちになりますね。自然数の積は1を単位元としたモノイドです。
これに加えて「交換法則: の中の任意の元に対してを満たす」が成り立つ場合は、アーベル群(可換群)と呼びます。しばしば加法群と呼ばれてします。
巡回群
任意の群のある要素を選択します。そのと演算のみで生成される群を巡回群と呼びます。…なにそれ。
すなわち
ということです。
例えばであり、となります。
ちなみにこの要素のことを生成元と呼びます。
例えば群は要素1を生成元とした巡回群です。(ここで は3回「かける」ではなく3回「演算、つまりをすること」になることに注意)ですし、となり、無限に繰り返すことで整数となりますね。
ちなみに無限に続くときは無限巡回群、有限の場合は有限巡回群と呼ばれます。
位数 vs 位数
巡回群から少しだけ離れて、位数について。群の中には2つの異なる「位数」が存在します。実際には「群の位数」と「元の位数」ですが。
「群の位数」は群の要素の数です。
「元の位数」はその元を何回演算することで単位元になるか、の「何回」の回数です。
ここで、生成元を複素数とし、演算を「」つまり「かける」とした巡回群を考えてみましょう。こうなりますね。
単位元は「1」であることは自明かと思います。
このとき「群の位数」は4です。要素数は4つなので。
次に元の位数ですがこれは元によって異なります。の場合はiを4回演算することで単位元の1になります。-1では2回、-iでは3回なのでそれぞれ2, 3が元の位数となります。単位元の場合は演算をする必要がないので0です。
生成元の位数 = 郡の位数となりますので、もしかしたら位数自体はあまり区別されるものではないかもしれません。
ちなみに無限巡回群では位数は「無限」です。
準同型写像
今度は写像に戻ります。
準同型写像(じゅんどうけいしゃぞう)はある群の任意の元に対して下記を満たす写像のことです。
単射・全射・同型写像
じゃあ同型写像もあるのかと思いますが、当然存在します(言葉的にね?)。
その前に準同型写像の中で更に2つの性質で分けて考えます。下記では群と準同型写像を暗に利用します。
1つは単射です。これはが必ず一位のの元に紐づくことです。すなわちとを一対一で対応させる写像です。これはの元の中には紐付かない元があっても問題ありません。すなわちの位数の位数となります。
次に全射です。これはを射影した結果となるものです。これはのある元に2つ以上対応するの元があっても問題ありません。すなわちの位数の位数となります。
同型写像は上の2つをミックスしたものです。全単射とも呼ばれます。すなわちとの要素が一対一でひも付き、要素に過不足がない状態です。
同型写像はの元からの元に一対一でかつ過不足無く紐づく為、からを求めるための逆関数の存在も存在します。存在するはずです。
剰余類群
Wikipediaの離散対数問題の記事や、その他様々なWeb上の記事を見るとという記載があります。具体的な名称が色々あり「nを法とした整数の加法群」だったり「整数の加法群」だったり「循環加法群」って呼ばれているものです。これが、今回ここまで長々と記載してきたものの着地点の1つです。
(ここでは剰余類群と読んでおくことにします)は下記のように求めていきます。
剰余類
まず剰余類とはなんぞ、という話です。難しい書き方は下記になります。
とします。このときの空ではない部分集合において
を満たすとき、を剰余類と呼びます。
簡単に記載すると、これはで割ったあまりの集合です。また、mで割ったあまりの集合は加法において群となります(の中で)。剰余群または剰余類群とも呼ばれます。ここに「mを法とする」と付く場合もありますが。
この剰余類はとも記載されます。mで割ってる感じが出てわかりやすいですね。また、と記載されたり、が素数である場合やと記載される場合もあります[4]。
既約剰余類群
mを法とする剰余類の中で、積()において可逆である元 = 逆元を持つ元の集合のことを既約剰余類と呼びます。と表現します(mを法とした場合)。右上は演算を表しているので人によってはだったりだったりだったりするかもしれません。またそれらは乗法において群となるため、それを既約剰余類群と呼びます。
パッと想像するのは難しいかと思いますが、適当な値で考えてみます。
とします。そうなると既約剰余類群はと表現できますね。
まず剰余類を書き出してみます。アマノジャクだからと書いても一応定義的には間違っていません。
次にそれぞれの要素が可逆であるかどうかを確認してみます。この時演算はただの乗算ではなくm(=6)を法とした乗算です。すなわちとなります。ちなにみに当然ですが単位元は1です。
以下の式はすべて6を法とするためを省いて記載します。
ちなみにですが、可逆ではない要素はすべて零因子です。零因子は群の要素においてとなるを除く要素が存在するということです。2であれば3()だったり、4であれば3であったりします。
既約剰余類であるには元が法であると互いに素である必要があります。すなわち割り切れない数であり、最大公約数が1となる必要があります。また0だけは必ず既約剰余類にはなりません。
本章の参考文献
- 新妻弘, 木村哲三.(2007).「群・環・体入門」第10版. 共立出版株式会社.
離散対数問題
離散対数問題の定義を書くまでの前提知識が多すぎる。
離散対数の定義は次のようになります。
任意の素数と生成元により生成される巡回群を考える。この時、への同型写像をとする。このの逆写像を計算する問題のことを離散対数問題と呼ぶ。
DH法では秘密鍵を利用してで公開鍵を計算しました。このは2以上未満の任意の数と記載していましたが、正確にはとなります。ただし1は単位元であり、がそのまま出てきてしまうため実質的に省かれています。が素数の場合は実質的に同じです。
また、はです。そしてこの逆関数こそです。
ここまで来ると十分に一般化されたので、このが楕円曲線の何らかの処理にすればそのまま楕円曲線における離散対数問題になります。私も調べてないので詳しくはないですが、楕円曲線ではが加法群になるので見かけは全く異なります。
最後に
力尽きた。
サイドチャネル攻撃は暗号装置を外部から物理的手段で観察することで鍵などの情報を取得しようとする攻撃。バイナリ法の場合は秘密鍵を2進数に直したときの1の数だけ追加で計算が発生することから、処理時間を計測することで秘密鍵を類推する攻撃とります。
処理時間に対するサイドチャネル攻撃はタイミング攻撃とも呼ばれます。 ↩︎のことをしばしばnを法とすると記載されます。かっこいいですね。 ↩︎
当ブログではじめてで言葉なので注釈を入れておきます。はオーダー記号、またはランダウの記号と呼ばれざっくりとした計算量を求めるのに利用します。特にコンピューターの世界ではアルゴリズムの有用性の指標であり、特にソートの分野ではよく見ますね。
簡単にいれば、要素数の増加量とともに増えていく計算量の指標で、はnが増えていくとnの2乗のペースで計算量が増えていくというものです。
例えば連続した2つの要素があった場合 のほうが大きければ要素を交換する、というアルゴリズムであるバブルソートは、純粋に作るとです。また最も高速であるクイックソートは平均計算量がです(データの並びが悪いととなります)。
ここで注意する必要があるのはオーダーが同じだから同じ計算量であるとか、オーダーが小さいから早い、というわけではないです。例えばクイックソートに1年でお株を奪われてしまった高速ソートの1つである「ヒープソート」もですが、クイックソートよりは遅いとされています。
また、クイックソートも十分に大きな要素数では高速ですが、前準備がある為要素数が十分に小さければバブルソートの方が早くなります。
ちなみにクイックソートは要素のグループを細かく分けて分けて分けて…とやっていくのですが、十分小さくなったらバブルソートでソートすることでさらなる高速化が出来ます。 ↩︎やは有限体やガロア体と呼ばれるものです。 ↩︎