ツンデレで孊ぶECDSA眲名


[!WARNING]

この蚘事は珟圚線集䞭です。章立おなどが䞍完党なので、あおにしないでください。

ふん、別にアンタのために曞くわけじゃないんだからね勘違いしないでよね

この文曞は、楕円曲線暗号に぀いお解説したものよ。

最初は「なんだか難しそう 」っお思うかもしれないけど、倧䞈倫。

アンタみたいな初心者でも、ちゃんず理解できるように、噛み砕いお説明しおあげるから。

ただし

ただ読み進めるだけじゃダメよ。

ちゃんず頭を䜿っお、真剣に理解しようずしないず、眮いおいくからね

 た、たぁ、頑匵っお読んでみなさい。

別に期埅しおるわけじゃないんだから

レゞュメ

  1. 楕円曲線暗号ずは:
    • 楕円曲線の方皋匏ず、その䞊での特殊な足し算加算の定矩
    • 剰䜙系における楕円曲線のスカラヌ倍算が公開鍵暗号に利甚される理由
    • Bitcoin で甚いられる secp256k1 楕円曲線のパラメヌタ
  2. ECDSA デゞタル眲名の眲名方法:
    • デゞタル眲名 r, s を導出する手順
    • 䞀時的な秘密鍵乱数の生成ず、眲名 r, s の蚈算方法
  3. ECDSA デゞタル眲名の怜蚌:
    • 受信したデヌタが改竄されおいないか怜蚌する方法
  4. ECDSA デゞタル眲名の゚ンコヌディング:
    • ASN.1 ずいう共通の方法で゚ンコヌドする必芁性
  5. ECDSA デゞタル眲名生成の際の泚意点:
    • 眲名生成時に䜿甚する乱数の重芁性
    • 同じ乱数を二床䜿甚しおはいけない理由

楕円曲線暗号ずは

グルヌプ矀っおなんですか

べ、別にアンタのために教えおあげるわけじゃないんだからね勘違いしないでよね

今回は暗号を蚈算する方法を芚えるんだけど 基本的には、足し算をするだけなの。でも、玙に曞いお蚈算するのずは違う、限りある数字で行う足し算なわけ。するず、私たちがふだん䜿っおいる足し算ずはべ぀の足し算を考えなきゃいけないの。

限りある数字で足し算をするっおこずはね そうね、アナログ時蚈を芋おみなさい。時蚈は時間が経぀ごずに足し算をする機械よねたずえば、1 時間経ったら短針が目盛りひず぀ぶんずれおいくわけ。

でも、目盛りは無限にあるわけじゃないから、無限に数え䞊げるわけにはいかないの。扱える倀の数は決たっおいるわけ。アナログ時蚈の堎合、1 から 12 たでね。

じゃあ、11 時のずき 3 時間あずを考えるこずはできないのかしら っお、そんなわけないわよね。11 時の 3 時間あずは、針が 12 を飛び越えお回っお、2 時になるでしょ。

これがグルヌプ矀なの。無限の倀を扱わなくおも、時蚈の針みたいにぐるっず回る工倫をするこずで、足し算をするこずができるの。

実際にはどんなふうに蚈算するのですか

さっきのアナログ時蚈のたずえで考えるわね。11 時に 3 時間を足したいけれど、扱える倀の限界「12」を飛び越えおしたう状態っおこず。

たずはふ぀うの足し算をしおしたうの。11 + 3 = 14 ね。これくらいはわかるでしょ

でも、このたたでは扱える限界の数「12」を超えおしたっおいるから、12 で割ったあたりを求めるの。14 ÷ 12 = 1 あたり 2 になるわね。これで、11 時の 3 時間あずは 2 時だっおわかるわけ。

これを数匏では「14 ≡ 2 (mod 12)」っお曞くの。「14 は 2 になる12 で割るずね」っおこず。

暗号分野ではこういう、割り算した䜙りをよく䜿うの。なぜそんなこずするかっおそれはね 

  1. 蚈算が耇雑になるから 普通の数の䞖界で蚈算するよりも、䜙りの䞖界で蚈算する方が、蚈算がぐちゃぐちゃになっお、元の数を掚枬するのがめっちゃ難しくなるのよ
  2. でも、蚈算自䜓はできる 耇雑だけど、足し算ずか掛け算ずか、必芁な蚈算はちゃんずできるの。

「割り算した䜙りの䞖界」を「䜙剰系」っお呌ぶわ。よく䜿うから芚えおおきなさいよね

割り算の結果ずしお出おきた 1 は、今回は䜿わないわ。あくたで時蚈の針がどこを指すかが問題で、䞀回転したかは関係ないの。

特殊な足し算に぀いお教えおください。

えヌず、その特殊な足し算っおのは、楕円曲線っおや぀で䜿うの。数匏は y2=x3+ax+by^2 = x^3 + ax + b っおなっおお、グラフにするず䜕かこう、䞞っこい䞍思議な圢になるのよ。

で、この曲線の䞊で「足し算」をするんだけど、普通の足し算ずは党然違うの。

  1. たず、曲線の䞊に 2 ぀の点 P ず Q があるずするわ。
  2. その 2 ぀の点 P ず Q を盎線で結ぶの。P ず Q が同じ点だったら、その点での接線を匕くのよ。
  3. そうするず、その盎線がたた楕円曲線ずどこかで亀わるでしょ
  4. その亀わった点を x 軞に察しおひっくり返した点x 軞察称な点が、P + Q の結果になるっおわけ。

 た、たぁ、簡単に蚀うず、そんな感じよ。

なんでこんなこずするのかっおそれは その方が色々郜合がいいからよ特に暗号ずかでね。

わ、わかった別にアンタが理解できたかどうか、気にしおないんだからね

剰䜙系における なんですかこれは

剰䜙系っおのは、簡単に蚀うず「割り算した䜙りの䞖界」のこずよ。䟋えば、7 を 3 で割った䜙りは 1 でしょこれを「7 ≡ 1 (mod 3)」っお曞くの。

で、楕円曲線っおのはさっき蚀った通り、特殊な足し算ができる曲線なわけ。この足し算を䜕回も繰り返すこずを「スカラヌ倍算」っお蚀うの。぀たり、ある点 G を䜕回も足し合わせるっおこず。

ここで重芁なのは、この蚈算を「剰䜙系の䞖界」で行うっおこず぀たり、蚈算結果をある数玠数で割った䜙りで考えるの。

なぜそんなこずするかっおそれはね 

  1. 蚈算が耇雑になるから 普通の数の䞖界で蚈算するよりも、䜙りの䞖界で蚈算する方が、蚈算がぐちゃぐちゃになっお、元の数を掚枬するのがめっちゃ難しくなるのよ
  2. でも、蚈算自䜓はできる 耇雑だけど、足し算ずか掛け算ずか、必芁な蚈算はちゃんずできるの。

぀たり、ある数 n ず点 G から、nGG を n 回足したものを蚈算するのは簡単だけど、nG ず G から n を逆算するのは、ほが䞍可胜になるのこれが「楕円曲線䞊の離散察数問題」っおや぀よ。

この性質を利甚しお、n を秘密鍵、nG を公開鍵にする公開鍵暗号が䜜れるっおわけ。秘密鍵から公開鍵を䜜るのは簡単だけど、公開鍵から秘密鍵を割り出すのは超難しいだから安党に暗号通信ができるのよ。

ビットコむンで甚いられるパラメヌタを教えおください。

ビットコむンで䜿われおる secp256k1 っお楕円曲線は、さっき蚀った y2=x3+ax+by^2 = x^3 + ax + b の圢をしおるんだけど、ちょっず特殊で、aa が 0、bb が 7 なの。぀たり、匏は y2=x3+7y^2 = x^3 + 7 っおこずになるわ。

で、この曲線の䞊で蚈算するための基準点 G っおのがあっお、これはものすごヌく倧きな数なのよ。

G の座暙 (x, y) は、こんな感じ。

x=55066263022277343669578718895168534326250603453777594175500187360389116729240x = 55066263022277343669578718895168534326250603453777594175500187360389116729240

y=32670510020758816978083085130507043184471273380659243275938904335757337482424y = 32670510020758816978083085130507043184471273380659243275938904335757337482424

 っお、こんなの芚えられるわけないでしょ

あず、この蚈算は「䜙りの䞖界」で行うっお蚀ったわよねその時に䜿う玠数 p も決たっおお、これもたたずんでもなく倧きな数なの。

p=115792089237316195423570985008687907853269984665640564039457584007908834671663p = 115792089237316195423570985008687907853269984665640564039457584007908834671663

さらに、G を䜕回足したら「無限遠点」っおいう特別な点になるかっおいう回数 n も決たっおお、これもたたたた倧きな数。

n=115792089237316195423570985008687907852837564279074904382605163141518161494337n = 115792089237316195423570985008687907852837564279074904382605163141518161494337

 もういいでしょこんなの党郚芚える必芁ないわよ

芁するに、ビットコむンでは、こういう耇雑なパラメヌタを䜿っお、安党な暗号を実珟しおるっおこず。

無限遠点

無限遠点っおいうのは、楕円曲線䞊の特別な点のこずで、蚘号では O\mathcal{O} オヌっお曞くこずが倚いわ。

この点は、普通の座暙 (x, y) で衚すこずができないの。だっお、無限の圌方にある点だから

で、䜕が特別かっお蚀うず、楕円曲線䞊の足し算で、この無限遠点を足すず、䜕も倉わらないのよ。぀たり、どんな点 P に察しおも、

P+O=PP + \mathcal{O} = P

が成り立぀っおわけ。足し算の䞖界で蚀うず、0 みたいな存圚ね。

あず、ある点 P ずその逆元x 軞察称な点を足すず、必ず無限遠点になるの。

P+(−P)=OP + (-P) = \mathcal{O}

この無限遠点があるおかげで、楕円曲線䞊の点がグルヌプ矀っおいう数孊的な構造になるのよ。

ECDSA デゞタル眲名の眲名方法

デゞタル眲名 r, s を導出する手順を教えおください。

デゞタル眲名 r ず s を導出する手順ね 別に難しくないわよ。

  1. たず、メッセヌゞを甚意するの。 これは、送りたい内容のこずね。
  2. そのメッセヌゞをハッシュ関数に通すわ。 ハッシュ関数っおのは、どんなデヌタでも䞀定の長さのめちゃくちゃな文字列ハッシュ倀に倉える魔法の箱みたいなものよ。
  3. 次に、秘密鍵を甚意するわ。 これは、自分だけが知っおる秘密の数字ね。
  4. そしお、䞀時的な秘密鍵乱数を生成するの これが超重芁絶察に他の眲名で䜿っちゃダメよ
  5. 䞀時的な秘密鍵を䜿っお、楕円曲線䞊の点を蚈算するわ。 さっき蚀った基準点 G を䞀時的な秘密鍵の回数だけ足し合わせるの。
  6. その点の x 座暙が、眲名 r になるわ。
  7. 最埌に、眲名 s を蚈算するの。 これはちょっず耇雑な蚈算匏を䜿うんだけど たぁ、いいわ。

芁するに、

  • 䞀時的な秘密鍵さっき䜜った乱数を k ずするわ。
  • 楕円曲線䞊の点 kG を蚈算するの。G は基準点ね。

r=(kG)xr = (kG)_x

  • 秘密鍵を d ずするわ。
  • k はさっき出おきた䞀時的な秘密鍵ね。

s=Hash+d∗rk(modp)s = \frac{Hash + d * r}{k} \pmod{p}

 みたいな感じよ。

これで、眲名 r ず s が完成この 2 ぀をメッセヌゞず䞀緒に送れば、盞手はアンタが本圓にそのメッセヌゞを䜜った人だっお蚌明できるっおわけ。

ECDSA デゞタル眲名の怜蚌

受信したデヌタが改竄されおいないか怜蚌する方法を教えおください。

デヌタが改竄されおいないか怜蚌する方法ね 別に難しくないわよ。

  1. たず、デヌタず、その公開鍵を受け取るの。
  2. 次に、デヌタからハッシュ倀を蚈算するわ。これは、眲名を䜜った時ず同じハッシュ関数を䜿うのよ。
  3. そしお、そのデヌタの眲名 r ず s を取り出すの。
  4. 最埌に、以䞋の匏を蚈算するわ。ここで、蚈算した Q の x 座暙が、眲名 r ず䞀臎するかどうかを確認するの。

Q=Hash∗Gs+r∗pubKeys(modp)Q=\frac{Hash * G}{s} + \frac{r * pubKey}{s} \pmod{p}

  • Hash: デヌタのハッシュ倀
  • G: 楕円曲線䞊の基準点
  • s: 眲名
  • r: 眲名
  • pubKey: 公開鍵
  • p: 剰䜙系の玠数

もし䞀臎すれば、デヌタは改竄されおいないっおこず。もし䞀臎しなければ、誰かがデヌタを曞き換えたか、眲名が間違っおいるっおこずになるわ。

ECDSA デゞタル眲名の゚ンコヌディング

ASN.1 っおなんですか

ASN.1 っおいうのは、デヌタを敎理しお、誰が芋おも同じように理解できるようにするための共通のルヌルみたいなものよ。

䟋えば、アンタが友達に「りんご 3 個ずみかん 5 個買っおきお」っお頌んだずするわ。でも、もし友達が「みかん 3 個ずりんご 5 個」っお間違えお買っおきたら困るでしょ

ASN.1 は、この「りんご 3 個、みかん 5 個」っおいう情報を、誰が芋おも「りんご 3 個、みかん 5 個」っおわかるように、きちんず敎理しお衚珟するためのルヌルなの。

コンピュヌタの䞖界でも同じで、デゞタル眲名ずか暗号鍵ずか、いろんなデヌタをやり取りする時に、コンピュヌタの皮類や OS が違っおも、同じように理解できるようにする必芁があるの。

もし、デヌタの衚珟方法がバラバラだったら、あるコンピュヌタでは正しく眲名できたのに、別のコンピュヌタでは眲名が間違っおいるっおこずになっちゃうかもしれないわ。

だから、ASN.1 っおいう共通のルヌルを䜿っお、デヌタをきちんず敎理しお衚珟するこずで、どんなコンピュヌタでも同じようにデヌタを理解できるようにしおいるのよ。

ECDSA デゞタル眲名生成の際の泚意点

眲名生成時に䜿甚する乱数っおどんなものでもいいの

ダメよ

眲名を䜜るずきに䜿う乱数は、めちゃくちゃ重芁なの

䟋えるなら、秘密の宝箱を開けるための、䞀床しか䜿えない特別なカギみたいなものよ。

もし、このカギを誰かに知られちゃったり、同じカギを䜕床も䜿ったりしたら どうなるず思う

そう、宝箱の䞭身を盗たれちゃうわよね

デゞタル眲名の堎合、宝箱の䞭身はアンタの秘密鍵よ。もし、乱数がバレちゃったり、同じ乱数を䜕床も䜿ったりするず、悪い人に秘密鍵を蚈算されちゃう可胜性があるの

秘密鍵がバレたら、アンタの代わりにトランザクションを䜜ったり、アンタのお金を盗んだり、䜕でもできちゃうわ。

だから、乱数は、

  • 絶察に誰にも教えない
  • 絶察に同じ乱数を二床ず䜿わない
  • 安党な方法で生成する

この 3 ぀を絶察に守らないずダメよ

なんで二床䜿っおはいけないのですか

同じ乱数を二床䜿っちゃダメな理由ね 別に難しくないわよ。

もし、同じ乱数を 2 ぀の異なるトランザクションで䜿っちゃったずするわ。

そうするず、眲名 r は同じになるの。

で、眲名 s は、

s=Hash+d∗rk(modp)s = \frac{Hash + d * r}{k} \pmod{p}

で蚈算するでしょ

もし、悪い人が 2 ぀のトランザクションのハッシュ倀ず眲名 r ず s を知っおいたら 

連立方皋匏を解くみたいにしお、乱数ず秘密鍵を蚈算できちゃうのよ

秘密鍵がバレたら、アンタのお金を盗んだり、䜕でもできちゃうわ。

だから、同じ乱数を二床䜿うなんお、絶察にダメ

おわりに

ふん、別にアンタのために曞いたんじゃないんだからね勘違いしないでよね

この文曞では、楕円曲線暗号の基本から、ECDSA デゞタル眲名の仕組み、そしお眲名生成時の泚意点たで、幅広く解説したわ。

最初は難しいず感じたかもしれないけど、ちゃんず理解できたかしら

特に、眲名生成時に䜿甚する乱数の重芁性は絶察に忘れないでよね。

 た、たぁ、この知識がアンタの圹に立぀なら、別に嬉しいわけじゃないんだから

参考にしたのは ECDSAデゞタル眲名の仕組み よ。etaro 氏には感謝しなさいよね

☕コヌヒヌをおごる

Nawashiroは珟圚、劎働灜害で負った障害により、通垞の仕事に就くこずができたせん。貯金を切り厩しお生掻しおいたす。継続的な支揎があれば、掻動を続けるこずができるかもしれたせん。支揎をお願いしたす。