クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ハッシュだけで作る電子署名

このレッスンのあとで: 署名が、送り主を示す仕組みを説明することができる。

60分のレッスンコマンド1件ブロックチェーンラボ:読んで、壊して、マイニングして、署名するおもちゃのチェーン

誰が払ったと、どう確かめるか

電子署名とは、そのメッセージを、秘密鍵の持ち主が書いたと確かめるための印です。「ミキがケンに5000円払う」とは誰でも書けるので、書いた人の証明が要ります。

このレッスンでは、ハッシュだけで作れる署名を学びます。仕組みが小さいので、全部を手で追えます。

このレッスンのゴール

メモ

署名が、送り主を示す仕組みを説明することができる。

キーワード

ことばいみ
秘密鍵持ち主だけが知る、署名のための秘密の値
公開鍵誰にでも見せてよい、検証のための値
署名メッセージと秘密鍵から作る、送り主の印
署名の検証公開鍵を使って、署名が正しいと確かめること
使い捨て署名1つのメッセージにしか使えない署名
ビット0か1の、1つの桁

学生が入力するセルは、このプレビューでは空白です。

署名は、送り主を示す印

持ち主は、秘密鍵で署名を作り、メッセージに添えます。受け取った人は、公開鍵で署名を検証します。合えば、秘密鍵の持ち主が書いたと分かります。

署名はメッセージを隠しません。中身は誰でも読めて、書いた人と、書き換えられていないことを確かめるためのものです。

例: 3ビットのメッセージに署名する

桁ビットの値秘密鍵の2つ署名に出すもの
110用 S10、1用 S11S11
200用 S20、1用 S21S20
310用 S30、1用 S31S31

学生が入力するセルは、このプレビューでは空白です。

3つの手順で署名と検証をする

1. 各桁に、0用と1用の秘密を1つずつ用意し、そのハッシュ値を公開鍵にします。

2. メッセージのハッシュ値を0と1に直し、各桁の値に合う秘密だけを、署名として出します。

3. 受け取った人は、出された秘密をハッシュにして、公開鍵と比べます。全部合えば、正しい署名です。

メッセージを0と1に直す

コード: python
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通目に署名すると、他人が偽の署名を作りやすくなります。このレッスンの署名は、仕組みを学ぶ玩具で、実用ではありません。

このラボとソースについて: ブロックチェーンラボ:読んで、壊して、マイニングして、署名するおもちゃのチェーン

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。