0 / 4
メッセージ認証コード(MAC、Message Authentication Code)
メッセージの原文と秘密鍵Kを一緒にハッシュ関数に入れると、固定長の値が出てくる。この値がMAC値だ。送る側は原文の後ろにMAC値を付けて送り、受け取る側は同じ鍵でMAC値を自分で計算し直して、付いてきた値と比べる。
例:AliceがBobに「1000円送金」というメッセージを送る。原文はそのまま送り、後ろにMAC値を付ける。
1 / 4
Alice:MAC値を作る
Aliceが原文「1000円送金」と秘密鍵Kを一緒にハッシュ関数に入れて、MAC値3f9aを作る。鍵が混ざるので、Kを知らなければ同じ値は作れない。
2 / 4
Alice → Bob:原文にMAC値を付けて送る
Aliceが原文の後ろにMAC値を付けて一緒に送る。2つを足すのではなく、並べて付けて送る。秘密鍵Kは送らず、原文は暗号化しないので途中で誰でも読める。
3 / 4
Bob:MAC値を計算し直す
Bobが受け取った原文と、自分が持つ同じ秘密鍵Kをハッシュ関数に入れて、MAC値を自分で計算し直す。結果は3f9aだ。
4 / 4
Bob:2つの値を比べる
計算し直した値(3f9a)と原文に付いてきたMAC値(3f9a)が同じだ。原文が変わっておらず(完全性)、同じ鍵を持つAliceが送った(メッセージ認証)ことを確かめて受け入れる。
1 / 6
Alice:MAC値を作る
Aliceが原文「1000円送金」と秘密鍵Kを一緒にハッシュ関数に入れて、MAC値3f9aを作る。
2 / 6
Alice → Mallory:横取り
Aliceが原文にMAC値を付けて送ったが、途中で攻撃者Malloryが横取りした。
3 / 6
Mallory:原文を書き換える
Malloryが原文を「9000円送金」に書き換える。書き換えた原文に合うMAC値を作るには秘密鍵Kを入れて計算する必要があるが、MalloryはKを持っていない。だから付いていたMAC値3f9aはそのままにする。
4 / 6
Mallory → Bob:送る
書き換えた原文と元のMAC値3f9aがBobに届く。
5 / 6
Bob:MAC値を計算し直す
Bobが受け取った原文「9000円送金」と同じ秘密鍵Kをハッシュ関数に入れると、81c2が出てくる。
6 / 6
Bob:2つの値を比べる
計算し直した値(81c2)と付いてきたMAC値(3f9a)が違う。途中で原文が書き換えられたことに気づき、メッセージを捨てる。
1 / 6
Alice:ハッシュ値を作る
Aliceが原文「1000円送金」だけをハッシュ関数に入れて、ハッシュ値3f9aを作る。鍵は入れない。
2 / 6
Alice → Mallory:横取り
Aliceが原文にハッシュ値を付けて送ったが、途中で攻撃者Malloryが横取りした。
3 / 6
Mallory:原文とハッシュ値を差し替える
Malloryが原文を「9000円送金」に書き換える。ハッシュ関数は鍵なしで誰でも計算できるので、書き換えた原文のハッシュ値c71eを自分で作り、元の値の代わりに付ける。
4 / 6
Mallory → Bob:送る
書き換えた原文と新しく作ったハッシュ値c71eがBobに届く。
5 / 6
Bob:ハッシュ値を計算し直す
Bobが受け取った原文「9000円送金」をハッシュ関数に入れると、c71eが出てくる。
6 / 6
Bob:2つの値を比べる
計算し直した値(c71e)と付いてきたハッシュ値(c71e)が同じなので、Bobは書き換えられたメッセージをそのまま受け入れる。鍵がなければ改ざんを見破れない。