ぺんぎんさんのおうち

日記です。たまに日記じゃないこともあります。

Euler's criterion 平方剰余の判別

整数論において奇素数\(p\)をModulusとしたとき, \(a \in GF(p)\)について $$ x^{2} \equiv a \, mod \, p $$

となる \(x\)が存在するとき\(a\)を\(p\)の平方剰余であるという.
\(a\)が平方剰余であるかどうか(上式で解を持つかどうか)を判定するのに使われるのがEuler's criterion(オイラーの基準)である.

式はシンプルで, \(a \in GF(p)\)を入力に取り, 出力は\(\{0,1,-1\}\)のどれかである. (ルジャンドル記号の話は割愛する)
0が出力されるのは\(a\)が\(p\)で割り切れる場合であり, この記事内では扱わない.

$$ a^{\frac{p-1}{2}} \, mod \, p = \begin{cases} 0 \newline 1 \newline -1
\end{cases} $$

上式で1が出力されれば\(a\)は平方剰余である(\(x^{2} \equiv a \, mod \, p\)の解が存在する).

なぜ1を得たときに\(a\)が平方剰余となるのかを解説していこう.
まずフェルマーの小定理より, modulusは素数なので任意の \(a \in GF(p)\)について

$$ a^{p-1} \equiv 1 \, mod \, p $$

これを変形していく.

\begin{eqnarray} a^{p-1} & \equiv & 1 \, mod \, p \newline a^{p-1} - 1 & \equiv & 0 \newline (a^{\frac{p-1}{2}} - 1)(a^{\frac{p-1}{2}} + 1) & \equiv & 0 \newline \end{eqnarray}

2つの因数が得られ, これらを別々に考える.

・ \((a^{\frac{p-1}{2}} - 1) \equiv 0\)

\begin{eqnarray} a^{\frac{p-1}{2}} - 1 & \equiv & 0 \, mod \, p \newline a^{\frac{p-1}{2}} & \equiv & 1 \, mod \, p \newline \end{eqnarray}

ここで, \(x^{2} \equiv a \)とすると

\begin{eqnarray} {x^{2}}^{\frac{p-1}{2}} & \equiv & 1 \, mod \, p \newline x^{p-1} & \equiv & 1 \, mod \, p \newline \end{eqnarray}

\(a\) と \(p\) は互いに素であり \(x\) と \(p\) も同様に互いに素であるためフェルマーの小定理に従う.
したがって, \(x^{2} \equiv a \, mod \, p\)を満たす\(x\)は存在し, \(a\)は平方剰余であることがいえる.

言い換えると, \(a^{\frac{p-1}{2}} \, mod \, p = 1\) であれば \(x^{2} \equiv a \, mod \, p\)を満たす\(x\)が必ず存在する.


・ \((a^{\frac{p-1}{2}} +1) \equiv 0\)

\begin{eqnarray} a^{\frac{p-1}{2}} + 1 & \equiv & 0 \, mod \, p \newline a^{\frac{p-1}{2}} & \equiv & -1 \, mod \, p \newline (& \equiv & p-1 \, mod \, p) \end{eqnarray}

先ほどと同様に, \(x^{2} \equiv a \)とすると

\begin{eqnarray} {x^{2}}^{\frac{p-1}{2}} & \equiv & -1 \, mod \, p \newline x^{p-1} & \equiv & -1 \, mod \, p \newline \end{eqnarray}

\(x\) と \(p\) は互いに素であるため, フェルマーの小定理に従うはずである. このような\(x \in GF(p)\)は存在しない.
これは \(x^{2} \equiv a \, mod \, p\)を満たす\(x\)が存在せず, \(a\)は平方剰余でないことを意味している.


楕円曲線の整数点

Euler's criterionを利用すると, \((x, y) \in GF(p)\)で総当たりをしなくても, \(x \in GF(p)\)で右辺を計算した結果が平方剰余かどうか判定すれば, ある\(x\)について曲線の式を満たす\(y\)が存在するか判別できる.

Euler's criteriionはあくまで平方剰余かどうかを判別するだけで, 実際の解を得るわけではない点に注意. 解を得るには Tonelli–Shanks algorithm を読むと良い.

近況

ykm11.hatenablog.com

 

学校から卒業証書をぶんどってきました. これで本当に終わりです.

あとは引っ越し準備.

 

 

 

そういえば学会に参加してました. 

全国規模で, ある程度ドメインが絞られている分野の学会だと, やはり聞きに来る人は"その道のプロ"って感じがして怖いですね, 先端恐怖症になるかと思いました. めちゃくちゃ人多いし.

これから長きに渡って研究をやっていくことになるので(おそらく), 早いうちに学会の雰囲気を知っておけたのは良かったと思ってます.

 

今年は学会発表をすることはないので(研究室配属もまだ先ですし), どうしようかなといったところですね. 

 

 

楕円曲線入門 番外編

第4話に追記するには少々長く, また第5話として書くような内容でもない気がしたため番外編とした.

前回, 楕円曲線上でのデジタル署名(ECDSA)の解説をした.
ECDSAでは, 署名にある適当な乱数\(k\)を使用するが, この\(k\)が乱数ではなく全て固定値として署名されていた場合どうなるのか, について本稿で解説する.
先に答えを言うと, 秘密鍵が漏洩するので絶対に固定値を利用してはいけない.

2010年に, ECDSAの実装に問題のあったPS3秘密鍵の取得が可能であることが報告されている.
Hackers Describe PS3 Security As Epic Fail, Gain Unrestricted Access.

Proof

メッセージM1, M2に対するハッシュ値を \(e1, e2\)
それぞれの署名を \((r_{1}, s_{1}),(r_{2}, s_{2})\)
共通の固定値を\(k\)として秘密鍵\(d\)を解読していく.

本稿では, \(r\)は既に導出されているものとし, \(s\)の計算から解説を始める.

\begin{eqnarray} s_{1} &=& k^{-1}(e_{1} + r_{1}d) \newline s_{2} &=& k^{-1}(e_{2} + r_{2}d) \newline \end{eqnarray}

\(k\)は共通の定数なので, 両辺に\(k\)をかけ\(k = \)の形にすると

$$ k = \frac{e_{1} + r_{1}d}{s_{1}} = \frac{e_{2} + r_{2}d}{s_{2}} $$

\(k\)にご退場いただき, 秘密鍵\(d\)について解くように式を変形していく.

\begin{eqnarray} s_{2}(e_{1} + r_{1}d) &=& s_{1}(e_{2} + r_{2}d) \newline s_{2}e_{1} + s_{2}r_{1}d &=& s_{1}e_{2} +s_{1}r_{2}d \newline s_{2}r_{1}d - s_{1}r_{2}d &=& s_{1}e_{2} - s_{2}e_{1} \newline (s_{2}r_{1} - s_{1}r_{2})d &=& s_{1}e_{2} - s_{2}e_{1} \newline \end{eqnarray}

よって $$ d = \frac{s_{1}e_{2} - s_{2}e_{1}}{s_{2}r_{1} - s_{1}r_{2}} $$

署名が2つあれば, 以上の計算で秘密鍵を得ることができる.
署名用の秘密鍵を得るとたとえばどのようなことができるのかについては, 逮捕されたくないのでコメントを控える.

実は, \(k\)が固定値なので\(r_{1} = r_{2}\)である.

検証

6年通ったNITACを卒業しました

2013年に中卒からの入学でNITACに入り, 6年間お世話になりました.

クラスメイトや先輩, 後輩, そして先生方に恵まれ, 高●専プロコンやドイツへの留学など様々な経験をさせてもらいました. ありがとうございました. 

 

卒業式当日, 私は学会参加のため式には出席していませんが, おそらく卒業証書が発行されているでしょう.

 

NITACを卒業した理由

卒業要件である

  • 卒業に必要な履修・修得単位の獲得
  • 学外発表(学会発表)
  • 卒業研究の最終発表

を達成し, 条件を満たしたからです.

 

f:id:ushiromiya3:20190314234036j:plain

 

そんな感じでNITACを卒業しました.

進学先はUECで, 今年の4月からII類のセキュリティ情報学所属となります.

引き続きよろしくお願いします. 

 

希望の研究室に配属されるよう努力しつつ, 自分のしたい勉強をする年にしたいと思います. バイト先も探しているのでよろしくお願いします.

楕円曲線入門 (4)

前回(第3話)までで基本的な楕円曲線の解説を終えた(多分).

本稿では, 楕円曲線を用いた署名アルゴリズムについて解説する.


Elliptic Curve Digital Signature Algorithm

楕円曲線を使ったデジタル署名(DSA)のアルゴリズム.
まずはデジタル署名とは何か, また何のために使われるのかを解説する.


デジタル署名

先にデジタル署名の役割を言うと, 送り主が誰であるかとデータが改ざんされていないことを証明する.

データの送り主について着目し, 次のようなシナリオを考える.
AliceがBobになにか重要なファイル(データ)を送信したとする. この例ではファイルが暗号化されているかどうかは考慮しない.

Bobが受け取ったファイルが, Aliceから送られてきたものなのかを本人に確認すると,

Bob 「これお前が送ったデータやんな?」

Alice 「ちゃうでw(違わない)」

違うと言われてしまった. どうやら違うようだ.

このような否認がインターネット上で自由に行われることは, 到底許されるべきではない. そこでデジタル署名を用いることで, 否認の対策を行うこととした.
これで, Aliceがいくら自分が送ったファイルではないと言い張っても, デジタル署名がAliceのものであると立証してくれているので嘘がつけなくなった. めでたしめでたし.
実際に使われる署名アルゴリズムとしてはRSAなどが有名である.

ECDSA

さて, 話を楕円曲線に戻す.
これより楕円曲線を使ってデジタル署名を行う手順を解説する.

準備

利用する楕円曲線 \(EC := y^{2} = x^{3} + Ax + B\) を定義.
\(EC\)上の点を\(G\), \(G\)の位数を\(n\)とする. 位数が\(n\)なので, \([n]G = O\)が成り立つ.

ただし, \(n\)は素数である必要がある. \(Modulus\)でなく位数が素数である点に注意.
つまり, \(Modulus\)と\(n\)が両方とも素数である楕円曲線(とベースポイント\(G\))を選択する必要がある.

次にAliceは\([1, .., n-1]\)の中から適当な\(d_{A}\)を選択して, \(Q_{A} := [d_{A}]G\) を計算しておく.

\((Curve, G, n, Q_{A})\)が公開されている情報である.

署名

mをメッセージとする.

\begin{eqnarray} e &:=& SHA256(m) \newline k &:=& randint(1, n-1) \newline (x_{1}, \, y_{1}) &:=& [k]G \newline r &:=& x_{1} \, mod \, n \end{eqnarray} \(r\)は楕円曲線上の計算の時点で\(x_{1} < n\)だが念の為.

$$ s := k^{-1}(e + rd_{A}) \, mod \, n $$

\((r, s)\)が署名となる.

\(e\)の導出にSHA256を使用しているが, 署名/検証で同じハッシュ関数を使用するのであれば他のものを利用しても良い.

検証

受け取ったメッセージを復号したものをmとする.

\begin{eqnarray} e &:=& SHA256(m) \newline w &:=& s^{-1} \, mod \, n \newline u &:=& ew \, mod \, n \newline v &:=& rw \, mod \, n \newline \end{eqnarray}

\((u, v)\), ベースポイント\(G\)とAliceが署名した\(Q_{A}\)を使って $$ (x_{2}, \, y_{2}) := [u]G + [v]Q_{A} $$

\(r \equiv x_{2} \, mod \, n\)であれば署名は有効である.

正当性

以上の手順で正しく検証ができることを確かめる.
先ほどの式を変形していこう.

\begin{eqnarray} [u]G + [v]Q_{A} &=& [u]G + [v][d_{A}]G \newline &=& [u + vd_{A}]G \newline &=& [ew + rwd_{A}]G \newline &=& [w(e + rd_{A})]G \newline &=& [s^{-1}(e + rd_{A})]G \newline &=& [(k^{-1})^{-1}(e + rd_{A})^{-1}(e + rd_{A})]G \newline &=& [k(e + rd_{A})^{-1}(e + rd_{A})]G \newline &=& [k]G \newline &=& (x_{2}, \, y_{2}) \end{eqnarray}

以上より, 署名と検証とで\(e\)が同じならば \(r \equiv x_{1} \equiv x_{2} \, mod \, n \) なので, 正しく署名の検証ができていることが示せた.

以下のコードでは\((e, d)\)を自分で作為的に選んでいるが, 署名については正しく検証できている.

ここではsageMathを使ったコードを載せているが, Golangで実行したものもあるので併せて載せておく. ECDSA by Golang (曲線や演算の定義により, 少し長いのでリンクだけ)

参考文献


To Be Continued..

乱数を使わない場合のECDSA -> 番外編
次->まだ