0 / 4
二重署名(Dual Signature)
顧客は注文情報をショップに、決済情報をカード会社に送る。ショップはカード番号を見てはならず、カード会社は何を買ったかを見る必要がない。それでも、この決済とこの注文が一対であることは両方が確かめられなければならない。二重署名は二つの情報のハッシュ値を一つにまとめて一度だけ署名し、これらの条件を一度に満たす。
例: 顧客がショップで20万円のノートPCを買い、カードで支払う。
1 / 4
顧客: 二つの原文をそれぞれハッシュ
顧客が決済情報の原文と注文情報の原文を別々にハッシュ関数に入れる。決済ハッシュ値7d2eと注文ハッシュ値a41cが出てくる。
2 / 4
顧客: 二つのハッシュ値をつなげる
決済ハッシュ値7d2eの後ろに注文ハッシュ値a41cをつなげる。二つの値を足すのではなく、順番どおりにつなげる。確かめる側も同じ順番でつなげないと同じ値にならない。
3 / 4
顧客: つなげた値をもう一度ハッシュ
つなげた値をもう一度ハッシュ関数に入れて結合ハッシュ値c93fを作る。注文か決済の情報が一文字でも変わると、この値はまったく別のものになる。
4 / 4
顧客: 秘密鍵で一度だけ署名
顧客が結合ハッシュ値c93fを自分の秘密鍵で署名し、二重署名5f1b80を作る。署名はこの一回だけだ。秘密鍵は顧客だけが持っているので、ほかの人は同じ署名を作れない。
1 / 5
ショップ: 受け取ったもの
ショップは顧客から注文情報の原文、決済ハッシュ値7d2e、二重署名5f1b80を受け取る。決済情報の原文はカード会社だけが開けられる封筒に封じられたまま一緒に届く。ショップはこの封筒を開けられず、そのままカード会社に渡す。
2 / 5
ショップ: 注文の原文をハッシュ
ショップは受け取った注文情報の原文をハッシュ関数に入れ、注文ハッシュ値a41cを自分で作る。
3 / 5
ショップ: つなげてもう一度ハッシュ
受け取った決済ハッシュ値7d2eの後ろに自分で作ったa41cをつなげる。つなげた値をもう一度ハッシュするとc93fが出る。カード番号を知らなくても、顧客と同じ値が得られる。
4 / 5
ショップ: 二重署名を復号
受け取った二重署名を顧客の公開鍵で復号すると、顧客が署名した結合ハッシュ値c93fが出てくる。
5 / 5
ショップ: 二つの値を比べる
自分で計算したc93fと署名から出たc93fが同じだ。これで三つのことを確かめる。顧客本人が署名した。注文情報は変わっていない。この注文はハッシュ値が7d2eの決済と一対だ。
1 / 5
カード会社: 受け取ったもの
カード会社はショップから渡された封筒を開け、決済情報の原文、注文ハッシュ値a41c、二重署名5f1b80を取り出す。注文情報の原文は受け取らないので、顧客が何を買ったかは知らない。
2 / 5
カード会社: 決済の原文をハッシュ
カード会社は決済情報の原文をハッシュ関数に入れ、決済ハッシュ値7d2eを自分で作る。
3 / 5
カード会社: つなげてもう一度ハッシュ
自分で作った7d2eの後ろに受け取った注文ハッシュ値a41cをつなげる。つなげた値をもう一度ハッシュするとc93fが出る。注文内容を知らなくても、顧客と同じ値が得られる。
4 / 5
カード会社: 二重署名を復号
受け取った二重署名を顧客の公開鍵で復号すると、顧客が署名した結合ハッシュ値c93fが出てくる。
5 / 5
カード会社: 二つの値を比べる
自分で計算したc93fと署名から出たc93fが同じだ。これで三つのことを確かめる。顧客本人が署名した。決済情報は変わっていない。この決済はハッシュ値がa41cの注文と一対だ。だから決済を承認する。
1 / 5
カード会社: 確かめるもの
カード会社の手元には決済情報の原文と顧客の二重署名5f1b80がある。そこにショップがタブレットの注文書を提示した。二つの注文は金額が同じなので、それだけでは見分けられない。
2 / 5
カード会社: 二つの原文をそれぞれハッシュ
決済情報の原文からは7d2eが出る。ショップが提示した注文書からは、本来の注文(a41c)とは違うe508が出る。
3 / 5
カード会社: つなげてもう一度ハッシュ
7d2eの後ろにe508をつなげてもう一度ハッシュすると1f6dが出る。
4 / 5
カード会社: 二重署名を復号
二重署名を顧客の公開鍵で復号するとc93fが出る。顧客が署名したときに使った結合ハッシュ値だ。
5 / 5
カード会社: 二つの値を比べる
再計算した1f6dと署名から出たc93fが違う。顧客が署名した注文はこの注文書ではないということだ。ショップは顧客の秘密鍵を持っていないので、この注文書に合う署名を新しく作ることもできない。