,(*) : 筆者
: ChatGPT
: Gemini
: Claude
: Notebook
前記事ではパスキー認証の理解のために暗号方式RSAについて述べた。 パスキー(Passkey)について➁
しかし、WebAuthn(*)ではRSAも使えるが、ECDSA(ES256)が標準的に使われ、RSAは互換性のための選択肢の位置づけという。
| 比較項目 | RSA方式 | ECDSA方式 |
|---|---|---|
| 暗号方式 | 素因数分解の困難さを利用する公開鍵暗号方式 | 楕円曲線上の離散対数問題の困難さを利用する公開鍵暗号方式 |
| 鍵の構成 | 公開鍵と秘密鍵のペア | 公開鍵と秘密鍵のペア |
| 認証の仕組み | 秘密鍵で電子署名を作成し、公開鍵で検証する | 秘密鍵で電子署名を作成し、公開鍵で検証する |
| 安全性の根拠 | 大きな整数の素因数分解が難しいこと | 楕円曲線上の離散対数問題を解くことが難しいこと |
| 鍵のサイズ | 比較的大きい(例:2048ビット) | 小さい(例:256ビット) |
| 処理速度 | 署名の生成は比較的遅い。検証は高速 | 署名の生成・検証ともに効率的 |
| 通信・保存容量 | 鍵や署名のデータサイズが大きい | 鍵や署名のデータサイズが小さい |
| パスキーでの利用 | 利用可能 | 広く利用されている代表的な方式 |
| 代表的な仕様 | RSASSA-PKCS1-v1_5、RSA-PSS | ECDSA with P-256(ES256) |
なんとかECDSAを分かりやすく説明できないものかと思い、なんどもAIに食い下がってようやく、光が見えたような気がするので解説しておく。
AIにECDSAの説明をさせると数学の公式とECDSAでのルールが入り混じり、途中から理解できなくなる。
ここでは適度に掘り下げ、しかし数学的な公式の証明までは深入りせずに説明してみた。
※ここで使用している説明用画像はイメージを掴むためのグラフ(実数)である。実際の計算は「余りの世界(有限体)」で行われるため点が楕円曲線上から外れて見えるものもあるが、数式上はすべて楕円曲線上に存在している。
※ECDSAでは、すべての計算を素数で割った余りで行う。これにより、数が巨大になりすぎず正確に計算できるうえ、点の位置が規則性なく散らばるため、逆算が極めて難しくなる。
秘密鍵と公開鍵を作る 楕円曲線は、 y2 = x3 + ax + b という方程式で表される、X軸に対して上下対称なグラフ。このグラフの上で点の座標を使った特別な「足し算」のルールを定義することで、暗号の仕組みが作られる。
グラフの曲線上に2つの点を取って直線を引くと、必ず曲線の別の場所でもう1回交わる(*)。その交点のX軸に対して上下反転させた場所を「足し算の答え」と決める。
(*)2点しか交わらないように見えることもある場合: 楕円曲線の数学では、無限遠まで考えることで、3番目の交点が存在するように扱う。 同じ点どうしを足す場合(P + P)は、2点を通る直線が1本に決まらないため、楕円曲線の方程式を微分して、その点での曲線の「傾き」を代数的に計算して接線を引き、同じように交点を反転させる。この計算を何万回、何億回と繰り返すと、点はグラフ上をビリヤードの球のように全く不規則な位置へと飛び回る。 楕円曲線暗号では、「足し算の回数」と「最終的な到達点」がペアになって暗号鍵の仕組みを作る。
今回「5回足して 5P(9, 16)に到達した」という仮定の例で当てはめる。
秘密鍵(回数=5): 持ち主だけが知っている秘密の数字。
公開鍵(到達点=X:9, Y:16): 5回足し算した結果の座標。 一方通行のカラクリ出発点となる点に秘密の回数(秘密鍵)だけ足し算を繰り返し、最終的な到達点(公開鍵)を計算することは、近道となるアルゴリズムがあるため一瞬で終わる。 しかし、到達点と出発点の座標だけを見せられても、「何回足し算をしたか」を逆算する数式は存在しない。点は不規則に移動しているため、1回ずつ順番に足して確かめる総当たり戦しか解法がない。 秘密の回数として256ビット(10の77乗以上)という天文学的な桁数の数字を使うため、最新のスーパーコンピュータを使っても宇宙の寿命以上の時間がかかる。この計算の非対称性が、鍵の安全性を守る壁になっている。![]()
最初の移動だけ説明 (P + P = 2P )
使う数式とルール 方程式: y2 = x3 + 2x + 2(mod 17) (*) ルール:すべての計算結果は「17で割った余り」にする(17以上になったら0から数え直す)(*)17と19について: 17は、暗号の仕組みを手計算で追えるようにするため、仮に選んだ小さな数字です。暗号の基礎となる空間を作るためには、この数字を「素数」にするという数学的な決まりがある。 (19は署名で使うがここで触れておく。) 現実のパスキーで使われる規格では、この17の代わりに78桁にもなる天文学的な大きさの素数が指定されている。 17と19のそれぞれの役割と関係性は以下の通り。 17の役割(空間と座標の時計) グラフのX座標とY座標の限界値を決める数字。すべての計算結果が17以上になったら0から数え直すというルールを作り、グラフの空間の広さを定義する。 19の役割(移動回数の時計) グラフ上で点の足し算を何回繰り返すと元の状態にリセットされるかという、ループの周期を決める数字。秘密鍵や使い捨ての鍵など「何回移動するか」という回数の計算をするときだけ、この19の時計を使う。 17と19のつながり 19という数字は、17のように仮に選んだ数字ではない。 空間の広さを「17」とし、方程式を「y2 = x3 + 2x + 2」と決めた時点で、数学的に自動で導き出された結果である。 17の時計の世界でこの方程式の左右の計算結果が一致する座標のペアを総当たりで探すと全部で18個(*)見つかる。そこに数学的な仮想の点(無限遠点)を1つ加えた「グラフ上に存在する点の総数」がちょうど19個になる。 このように、空間の広さ(17)と数式を決定すると、その空間内に存在できる点の総数(19)が確定し、それがそのまま足し算のループ周期として使われる、というのがこの2つの数字の関係である。 (*)計算結果が一致する座標のペアを総当たりで探すと全部で18個の説明 方程式 y2 =x3+2x+2 を「17で割った余り」のルール(モジュロ17)で総当たり計算し、左右の計算結果がピタリと一致する (x,y) の組み合わせを探すと、以下の18個の点が見つかる。 x=0 のとき: (0,6),(0,11) x=3 のとき: (3,1),(3,16) x=5 のとき: (5,1),(5,16) ※これまでの計算で使った出発点P を含むペア x=6 のとき: (6,3),(6,14) ※到達点 2P を含むペア x=7 のとき: (7,6),(7,11) x=9 のとき: (9,1),(9,16) x=10 のとき: (10,6),(10,11) ※到達点 3P を含むペア x=13 のとき: (13,7),(13,10) x=16 のとき: (16,4),(16,13) 楕円曲線はX軸を基準に上下対称になる性質があるため、Y座標の数字は「足すとちょうど17になるペア」(例:1と16、3と14など)で必ず出現する。 この18個の座標に、グラフのリセットボタンの役割を果たす「無限遠点」という仮想の1点を加えたものが、点の総数「19」となる。 【補足:なぜここで「17」ではなく「19」を使うのか?】 これまでのグラフの座標(X, Y)は「17で割った余り」で計算してきたが、署名の計算では「19で割った余り」を使っている。これは、2つの数字の役割が全く違うためである。 「17」:グラフの広さ(座標の範囲)を決めるルール 「19」:点がループする周期(ジャンプの回数)を決めるルール 秘密鍵や署名のデータは、グラフ上の位置ではなく「点を何回ジャンプさせるか」という回数を表す数字である。この曲線のジャンプは19回でスタート地点にリセットされるため、回数同士の計算はすべて「19の時計」に合わせる必要がある。出発点(P)を決める まずグラフ上の適当な点として x=5 を数式に入れてみる。 5×5×5+2×5+2=125+10+2=137 これを17で割ると「8余り1」なので、この世界での値は「1」になる。 y2 =1 なので、y=1 。 これで出発点 P (5, 1) が見つかった。 Pを2倍して移動先を計算する(P + P = 2P) 点Pから接線を引いて交点を反転させる「足し算」を1回行う。これがグラフ上の移動。接線の傾きを求める(*1) 微分の公式を使うが、この世界特有の割り算ルールを当てはめると、傾きは「13」になる。 新しいX座標(*2) 傾きの2乗から、元のX座標を2回引く。 13×13−5−5=169−10=159 159を17で割ると「9余り6」なので、新しいX座標は 6。 新しいY座標 傾きとXの移動距離を掛けて、元のY座標を引く。 13×(5−6)−1=−13−1=−14 時計の針を逆に14目盛り戻すと「3」の位置になるため、新しいY座標は 3 。
(*1)接線の傾きは「13」になる理由 方程式 y2 = x 3+ 2x +2 上の点 (5,1) における接線の傾きが「13」になる理由は、通常の微分の公式と「17で割った余り(モジュロ演算)」のルールを組み合わせて計算するからである。 微分の公式に数値を当てはめる 楕円曲線の接線の傾きm を求める公式は m = (3x2 + a) / 2y である。(a は x の係数なので今回は2)。 ここに点 (5,1) を代入すると、分子は 3×52+2=77、分母は 2×1=2 となり、傾きは 77÷2 になる。 17の世界の数字に変換する すべての数字を「17で割った余り」に直す。 分子の77は、77÷17=4 余り 9 なので「9」になる。これで式は 9÷2 になる。 時計の世界の割り算ルール この世界には小数が存在しないため、「2で割る」代わりに「掛けると時計が1周して1余る数(逆数)」を使う。 2に順番に数字を掛けていくと 2×9=18 となり、18を17で割った余りはぴったり「1」になる。つまり、この世界では「2で割る」ことと「9を掛ける」ことは全く同じ計算操作になる。 最終的な傾きの導出 計算式 9÷2 の割り算を掛け算に置き換えると 9×9=81 になる。 最後に81を17で割ると81÷17=4 余り 13 となるため、接線の傾きは「13」と導き出される。 (*2)新しいX座標 この計算式は、直線と曲線が交わる「3つの交点のX座標の合計」から、すでに分かっている出発点のX座標を引き算して、未知の交点を見つけ出す引き算のパズルである。 1. 傾きの2乗(13×13)の意味 数学の法則(3次方程式の解と係数の関係)により、楕円曲線に直線を引いてできる3つの交点のX座標をすべて足し合わせると、必ず「直線の傾きを2乗した値」になるというルールがある。 今回の接線の傾きは 13 なので、3つの交点のX座標の合計値は 13×13=169 になると確定する。 2. 元のX座標を「2回」引く(−5−5)理由 今回は出発点 P(5,1) に接線を引いて「P + P」という同じ点同士の足し算を行っている。接線は曲線にピタリと「接して」いるため、数学的には出発点の場所に「交点が2つ重なっている(重解)」とみなされる。 つまり、合計3つの交点のうち、2つはすでに「5」と「5」であることが分かっている。 3. 引き算で残り1つを逆算する 合計値(169)から、すでに分かっている2つの交点(5と5)を引き算すれば、残る3つ目の交点(移動先)のX座標が逆算できる。 169−5−5=159 これにより、新しい交点のX座標のベースとなる数字が「159」と導き出される。 4. 17の時計の世界(モジュロ17)へ変換する この暗号グラフの座標はすべて「17で割った余り」で表すルールのため、最後に159を時計の数字に変換する。 159÷17=9 余り 6 したがって、新しい交点のX座標は「6」になる。P + P = 2P は座標 (6,3) になる。同様に進めると、3P は (10,6)、4P は (3,1)、5P は (9,16) となり、これが到着点となる。 秘密鍵: 5 , 公開鍵: (9,16)となる。
【詳細解説】具体的な数値で見る!電子署名(ECDSA)の仕組み 事前準備 出発点: P(5, 1) 秘密鍵: 5 公開鍵: P を5倍した最終地点 (9, 16)(あらかじめサイトに登録済み) ※ 秘密鍵の「5」はスマホから外に出ることはない。 1. スマホ側で署名を作る スマホの内部で、本人であることの証明書(デジタル署名)を計算する。
メッセージと使い捨ての鍵を決める 送りたいメッセージ(ハッシュ値)を 「2」 とする。 さらに、今回の署名のためだけに使う、ランダムな使い捨ての回数を 「3」 と決める。 署名の前半(r)を作る(17の時計の世界) 出発点 P(5, 1) に対し、使い捨ての回数である「3回」だけグラフ上で足し算(P+P+P)を行う。 計算すると、グラフ上の到達点は (10, 6)になる。 この到達点のX座標である 「10」 が、電子署名の前半部分(r)になる。 署名の後半(s)を作る(19の時計の世界) メッセージ「2」、秘密鍵「5」、前半の「10」を、回数のルール(19の時計)を使って混ぜ合わせる。 1.メッセージ + (前半部分 × 秘密鍵) を計算します。2 + (10 x 5) = 52 2. 52を「19で割った余り」に直すと、「14」 になる。 3. これを使い捨ての回数「3」で割る。(19の時計の世界では、3で割ることは 13を掛けることと同じになる)14 x 13 = 182 4. 182を「19で割った余り」にすると、「11」 になります。これが署名の後半部分 (s)である。
➜ 【送信】 こうして完成した署名 「(10, 11)」 とメッセージ 「2」 を、インターネットを通じてWebサイトへ送信する。 2. Webサイト側で確かめる Webサイトは、送られてきたデータと、あらかじめ預かっていた公開鍵 (9, 16) を使って、署名の正しさを検証する。メッセージと署名を受信 サイトは、メッセージ 「2」 と、署名 「(10, 11)」 を受け取る。 署名を確かめる(検証) サイト側は「19の時計」を使って、預かっている公開鍵 (9, 16) と、メッセージ「2」、署名(10, 11)をグラフ上で掛け合わせる特別な計算を行う。(*) スマホ側が「正しい秘密鍵(5)」を使って署名を作っていれば、サイト側の検証計算の答えは、必ずスマホが「使い捨ての鍵(3)」でたどり着いた一時的な点と同じになるように数学的に設計されている。 答え合わせ! 計算の結果、グラフ上に (10, 6) という点が浮かび上がる。
この点のX座標 「10」 が、送られてきた署名の前半部分 r = 10 とピッタリ一致した! これで、「確かにこのメッセージは、秘密鍵『5』を持っている本人が送ったものだ」と完全に証明され、ログインが許可される。👌(*) サイト側が行う「特別な計算」とは、送られてきた署名やメッセージの数字を使って、グラフ上の2つの点を別々に何回か動かし、最後にそれを足し合わせるという操作である。 サイト側は秘密鍵(5)も使い捨ての鍵(3)も知らないが、以下の手順で計算すると、見事にスマホ側が作った点と一致する。 1. 署名の後半(s)の「逆数」を求める まず、署名の後半「11」を使って、19の時計の世界で「掛けると1になる数字(逆数)」を探す。 11に順番に数字を掛けていくと、7を掛けたときに 11 × 7 = 77 になる。 77を19で割ると「4余り1」になるため、この世界での11の逆数は 「7」 になる。 2. 点を動かす回数(2つの係数)を計算する 求めた逆数「7」を使って、グラフ上の点をそれぞれ何回動かすかを決定する。この計算も19の時計で行う。 ・係数A(メッセージ用): メッセージ「2」× 逆数「7」= 14 ・係数B(署名前半用): 署名前半「10」× 逆数「7」= 70。70を19で割ると「3余り13」なので 13 3. グラフ上で点を動かして足し合わせる ここで、あらかじめ全員が知っている「出発点 P(5,1)」と、サイトが預かっている「公開鍵 Q(9,16)」の登場。先ほど求めた係数を使って、グラフ上で次の点の足し算を行います。「出発点を14回足した点(14P)」 + 「公開鍵を13回足した点(13Q)」 サイト側が行う計算作業はこれで完了。この計算結果が、不思議なことに必ず一時的な点 (10,6) になる。 4. なぜ秘密の数字を知らないのに一致するのか?(種明かし) サイト側は知らないが、公開鍵Qの正体は、秘密鍵「5」で作った「5P」である。これをサイト側が計算した式にこっそり代入してみると、カラクリが分かる。 14P + 13 × (5P) 14P + 65P = 79P (出発点Pを合計79回足した点になる) ここで「19の時計(19回で元の位置にリセットされるルール)」を当てはめる。 79を19で割ると、79 ÷ 19 = 4 余り 3 になる。グラフを4周してリセットされ、最後に3回足した状態が残るため、79Pは 「3P」 と全く同じ場所になる。 この「3P」とは、まさにスマホ側が最初に「使い捨ての鍵(3)」で作った一時的な点 (10,6) のこと。 このようにECDSAは、「秘密の数字を知らなくても、公開された数字を決まったルールで混ぜ合わせると、必ず秘密の回数(使い捨ての鍵3)で移動した点に合流する」という、パズルのような数学の仕組みによって検証を行っている。
AIでECDSAの仕組みについて高校生レベルの説明を求めると概念的には理解できても、実際には高等数学を使うので、分かりにくい。
以下Googleコメント 暗号化・電子署名方式の ECDSA(Elliptic Curve Digital Signature Algorithm:楕円曲線デジタル署名アルゴリズム) は、大学レベルやそれ以上の高等数学(代数幾何学、有限体上の数論、群論)の理論を使っています。 高等数学が使われているポイント • 楕円曲線(代数幾何学): y^2 = x^3 + ax + b という形の代数曲線(および有限体上の楕円曲線)という高度な幾何学的・代数的対象を用います。 • 群構造と演算(群論・抽象代数学): 楕円曲線の上の「点」同士を足し合わせる独自の加算演算を定義し、それが「アーベル群」という数学的構造を持つことを利用して計算を行います。 • 離散対数問題(数論・代数): 楕円曲線の基準となる点 (G) を何回も足し合わせるスカラー倍算 (Q = dG) は簡単に行えますが、結果の点 (Q) と基準点 (G) から元の整数 (d)(秘密鍵)を逆算するのが極めて困難(楕円曲線離散対数問題:ECDLP)であるという性質を安全性の根拠にしています。(Google)