前号: No 415 / 次号: No 417 / 一覧(note.com)へ / ブログページに戻る

メールマガジン「がんばりすぎないセキュリティ」No416 (25/07/28)

パスキーが使う公開鍵暗号を世界一やさしく解説する(416号)


今回はパスキーの堅牢性を保証する機構である公開鍵暗号を、マジで「世界一やさしく」解説します。

公開鍵暗号ってのは、極めて理解するのが難しい技術なので、筆者も何度もトライしていますが、どうしても難しくなってしまいます。
ですが、今回の解説は違います。他に類を見ないものです。
どうぞ、期待してご覧ください。

今回も前々回からのパスキー続きです。

 パスキーはパスワードと何がちがうの?(414号)
 https://note.com/egao_it/n/nb797767ed93f

 実はパスキーは「電子署名」だった(415号)
 https://note.com/egao_it/n/n6f23853f03b5


1. 公開鍵暗号

公開鍵暗号というのは、前回までのパスキーのお話で、「秘伝のタレのレシピ」と「味の違いがわかるお客」という例えで説明をしてきました。 ですが、コンピュータは計算機です。 味なんてアナログで主観的なものはコンピュータの大の苦手です。 というわけで、「秘伝のタレのレシピ」は秘密鍵、「味の違いのわかるお客」は公開鍵という形で計算ができる仕組みがあり、これを公開鍵暗号と言います。 一般的に暗号といえば共有鍵暗号というもので、これは同じ鍵を双方が共有するやりかたです。 共有鍵暗号の難点は相方が気を付けて鍵をナイショにしないといけない点です。 鍵情報が盗まれれば、その鍵はもはや安全とは言えないからです。 一方で、公開鍵暗号では、秘密鍵であるレシピが門外不出である限り、公開鍵は秘密にする必要すらないという、にわかに信じがたいメリットのある暗号方式です

2. 復号は「逆算」じゃない!

いきなり、ワケわからないでしょうが「復号というのは、暗号化の逆算ではない」というのが今回の最大のポイントです。 フツーに考えればこう思いますよね。  暗号化: 平文(元のデータのこと)→(暗号化する)→暗号文  復号化: 暗号文→(暗号化の逆算)→平文 実際、同じ鍵を利用する共有鍵暗号はこの方式です。 ところが、公開鍵暗号は全く考え方が違います。  暗号化: 平文(元のデータのこと)→(暗号化する)→暗号文  復号化: 暗号文→(さらに暗号化する)→平文 「うそだー」と言いたくなりますが、これが公開鍵暗号というものなのです。 つまり、普通に思い浮かべるような逆算は行っていないのです。 その理由を皆さんもよく知っている「九九」を使って解説していきます。 おそらく、九九を使って公開鍵暗号を解説しているのは、私が初めてだろうと思います。 「世界一わかりやすい公開鍵暗号の解説」とはそういうことです。

3. 余りの巡回性

九九の3の段を思い出してください。  3×0=0  3×1=3  3×2=6  3×3=9  3×4=12  3×5=15  3×6=18  3×7=21  3×8=24  3×9=27 さて、上の答えのうち下1ケタを拾うと次のようになります。  0 3 6 9 2 5 8 1 4 7 下1ケタってことは、コンピュータ的には、10で割ったあまりを求めることと同じ意味になります。 余りの計算なんて小学生以来だ、という方も多いでしょうが、暗号理論ではこの余り(modulo:モジュロ)を使った剰余演算というのがめちゃくちゃ使われています。 ここには、0〜9の全ての数字が登場しています。 でも、何だか不思議ですよね。全ての数が登場するなんて。 (余談)  九九の中で、下1ケタで0〜9が出てくるのは一部。  1の段、3の段、7の段、9の段の4つ。  それ以外は10の約数の2か5を含むからです。  例えば、10で割ると下1ケタが0か5だけの5の段。  これを11で割った余りにすると、0〜10の全パターンが出ます。  5×0÷11= 0 あまり 0  5×1÷11= 0 あまり 5  5×2÷11= 0 あまり 10  5×3÷11= 1 あまり 4  5×4÷11= 1 あまり 9  5×5÷11= 2 あまり 3  5×6÷11= 2 あまり 8  5×7÷11= 3 あまり 2  5×8÷11= 3 あまり 7  5×9÷11= 4 あまり 1  5×10÷11= 4 あまり 6 (余談終わり) さて、3の段をさらに続けると、余りが同じ値に戻ります。  3×10÷10= 10 あまり 0  3×11÷10= 10 あまり 3  3×12÷10= 10 あまり 6  3×13÷10= 10 あまり 9 この「同じ値に戻る」というのが今回の最大のポイントです。 同じ計算を(3の段なら)10回繰り返せば元と同じ値が得られる、言い換えれば暗号化したものを復号できるわけです。 これを応用したのが、公開鍵暗号なのです。

4. 暗号化を重ねて元の値を得る

では、実際に、九九の3の段を使って、暗号化と復号を行ってみましょう。 ここでは、平文として"4"という値を送りたいとします。 また、秘密鍵は6、公開鍵を4としておきましょう。 なぜ6と4なのかについては、後で説明します。 また、暗号化の時も復号時も全く同じ計算式で計算を行います。 今回の場合は、(直前の結果+3)÷10の余り を求め続けることになります。 暗号化処理:処理を秘密鍵の回数(6回)くりかえす  ※元の値+3÷10 の余りを求める処理を繰り返す  1回目: (4+3)÷10= 0 あまり 7  2回目: (7+3)÷10= 1 あまり 0  3回目: (0+3)÷10= 0 あまり 3  4回目: (3+3)÷10= 0 あまり 6  5回目: (6+3)÷10= 0 あまり 9  6回目: (9+3)÷10= 1 あまり 2 →得られた暗号文は"2" となります。 実際の通信にはこの"2"だけが送信されるわけです。 さて、その"2"を受け取った時の処理も考えてみましょう。 暗号化処理:処理を公開鍵の回数(4回)くりかえす →与えられた暗号文は"2"  1回目: (2+3)÷10= 0 あまり 5  2回目: (5+3)÷10= 0 あまり 8  3回目: (8+3)÷10= 1 あまり 1  4回目: (1+3)÷10= 0 あまり 4 →復号結果は"4" いかがでしょうか。全く逆算をしていないのに、見事に4という平文を得ることができます。 3の段の九九では、10回計算を繰り返せば、必ず下1ケタ(つまり10で割った時の余り)が同じ値になります。 この性質をうまく利用すれば、一周して元の値を得るということが可能だ、というわけです。 こういった特定の計算をぐるぐると繰り返すことで元の値に戻るという性質は、九九以外にもさまざまなの計算で成立します。 このぐるぐると繰り返す性質を「位数」とか「剰余演算の巡回性」と呼びます。 これこそが「復号は暗号化の逆算ではない」の正体なのです。

5. 公開鍵から秘密鍵は計算できるのか?

さて、上のケースでは秘密鍵=6、公開鍵=4、と設定しました。 これは、実は合計が10になる値としています。つまり、6+4=10です。 では、なぜ10なのか?といえば、3の段の九九では、10回計算を繰り返すことで、必ず10で割ったあまりが元の値になるとわかっているからです。 ですので、秘密鍵と公開鍵は合計が10になるなら何でもいいのです。 1と9でもOKですし、7と3でも良いわけです。 ただし、秘密鍵と公開鍵は必ずペアになりますから、勝手に秘密鍵だけを更新してしまうと、サービス事業者側では本人確認できなくなってしまいます。 さて、今回は超シンプルな公開鍵暗号(もどき)で説明をしました。 これほど単純な方式だと、公開鍵が4だとわかっていれば、10-4=6と秘密鍵もすぐに計算できてしまいます。 こんな逆算ができるようでは、秘密鍵がちっとも秘密ではなくなってしまいます。 現実の公開鍵暗号では、公開鍵から秘密鍵の計算が事実上できない(時間がかかりすぎる)ような工夫がこらしてあります。 ですので、公開鍵を知ることができても、そこから秘密鍵を得ることはできないようになっています。 また、上記の計算では、1回の計算で3を加えるだけでしたが、これも現実の方式では鍵がめちゃくちゃ巨大(1の後に0がずらーっと600コくらい並ぶ)な数値を鍵とした上で、一回一回の計算ももっと複雑です。 このような技術を用いているから、パスキーはパスワードよりも安全だと言われるのです。

6. パスキーでのチャレンジ

前回(415号)の中で、共有鍵(双方が同じ鍵を持つ前提の暗号方式)を用いたチャレンジ&レスポンスのお話をしました。 その時に、パスキーでも公開鍵暗号で同様の仕組みを実現していると書きました。 具体的にはパスキーでは、次のような手順で本人認証を行います。  1. 利用者は「サービスを使いたい」とサービス提供側に伝えます。  2. サービス提供側は、チャレンジ(大きな数値)を送り返します。  3. 利用者の端末内で、パスキー(秘密鍵)でチャレンジを暗号化します。  4. 暗号化した結果をサービス提供側に送ります。  5. サービス提供側は、送られてきた暗号化データを公開鍵で復号します。  6. 復号の結果がチャレンジと一致していれば、本人確認完了です。 ここでのポイントは、2点。 ・通信上には、パスキーは一切出てきません。 ・秘密鍵がなくても、サービス提供側は復号が行えます。 この方式なら、前回提示した以下の課題がいずれもクリアできていることがわかります。 ・秘密情報を通信路上に流さないなんてことができるの? ・送信内容に秘密情報を含まずに「本人だ」なんて判断できるの?

7. まとめ

414号から、3号にわたってパスキーのお話をしました。 パスキーは現状のパスワードの課題を技術で解決しようとする意欲的なプロジェクトですが、その技術の大半が暗号技術であったりするため、非常にわかりにくいのが問題です。 今回は、その仕組みをできる限り易しく解説してみました。 特に九九を使った、公開鍵暗号の解説は他に類を見ないものと自負しています。 これを機に、皆さんもパスキーを利用してみてはいかがでしょうか。 次回もお楽しみに。 今回お話したこと:  ・公開鍵暗号での復号は「逆算」ではない。  ・逆算ではないから、公開鍵は公開しても問題は起きない。  ・通信上にも秘密鍵は登場しないので、安全度は非常に高い。 (本稿は 2025年7月に作成しました)

前号: No 415 / 次号: No 417 / 一覧(note.com)へ / ブログページに戻る