誰が払ったと、どう確かめるか
電子署名とは、そのメッセージを、秘密鍵の持ち主が書いたと確かめるための印です。「ミキがケンに5000円払う」とは誰でも書けるので、書いた人の証明が要ります。
このレッスンでは、ハッシュだけで作れる署名を学びます。仕組みが小さいので、全部を手で追えます。
このレッスンのゴール
メモ
署名が、送り主を示す仕組みを説明することができる。
キーワード
| ことば | いみ |
|---|---|
| 秘密鍵 | 持ち主だけが知る、署名のための秘密の値 |
| 公開鍵 | 誰にでも見せてよい、検証のための値 |
| 署名 | メッセージと秘密鍵から作る、送り主の印 |
| 署名の検証 | 公開鍵を使って、署名が正しいと確かめること |
| 使い捨て署名 | 1つのメッセージにしか使えない署名 |
| ビット | 0か1の、1つの桁 |
学生が入力するセルは、このプレビューでは空白です。
署名は、送り主を示す印
持ち主は、秘密鍵で署名を作り、メッセージに添えます。受け取った人は、公開鍵で署名を検証します。合えば、秘密鍵の持ち主が書いたと分かります。
署名はメッセージを隠しません。中身は誰でも読めて、書いた人と、書き換えられていないことを確かめるためのものです。
例: 3ビットのメッセージに署名する
| 桁 | ビットの値 | 秘密鍵の2つ | 署名に出すもの |
|---|---|---|---|
| 1 | 1 | 0用 S10、1用 S11 | S11 |
| 2 | 0 | 0用 S20、1用 S21 | S20 |
| 3 | 1 | 0用 S30、1用 S31 | S31 |
学生が入力するセルは、このプレビューでは空白です。
3つの手順で署名と検証をする
1. 各桁に、0用と1用の秘密を1つずつ用意し、そのハッシュ値を公開鍵にします。
2. メッセージのハッシュ値を0と1に直し、各桁の値に合う秘密だけを、署名として出します。
3. 受け取った人は、出された秘密をハッシュにして、公開鍵と比べます。全部合えば、正しい署名です。
メッセージを0と1に直す
import hashlib
message = "ミキがケンに5000円払う"
first = hashlib.sha256(message.encode()).digest()[0]
print(format(first, "08b"))
# 5000 を 6000 に変えて、もう一度実行しましょう。
# 0と1の並びが、変わります。
ラボで署名と検証をする
次の Run は、本物の大きさ(256ビット)で署名と検証をします。表示は英語です。public key は公開鍵、signature は署名、checks out は検証が通ることです。True は通った、False は通らなかった意味です。
署名を作り、検証する
docker exec jupyter python3 steps/sign.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の読み方
公開鍵は256組のハッシュ値で、署名は256個の公開された秘密です。元のメッセージの検証は True になります。
メッセージを1文字だけ変えて、同じ署名で検証すると、False になります。ビットが変わると、署名に出ていない秘密が必要になるからです。
よくある間違い
注意
「同じ鍵で、何通でも署名してよい」と考える人がいます。この署名は使い捨てで、1通で半分の秘密が公開されます。2通目に署名すると、他人が偽の署名を作りやすくなります。このレッスンの署名は、仕組みを学ぶ玩具で、実用ではありません。