最終更新:2013-02-02 (土) 13:59:03 (4324d)
FeliCa/MAC
Message Authentication Code
メッセージ認証コード?
- 通信データの改ざんの有無を検知し、完全性を保証するために通信データから生成する固定長のコードの総称
- MAC値を作り出すのに元データだけでなく、送信者と受信者のみが共有する鍵を使う
- MAC値を、読み出した人が自分でも計算してみて、同じ値になったら「自分が発行したカードだ」と認識する
使うブロック
FeliCa/ブロック/RC (0x80)
- MAC生成機能に用いる乱数を書き込むブロック
- このブロックに書き込まれた値からMAC生成に用いるセッション鍵を生成
FeliCa/ブロック/MAC (0x81)
- FeliCa Liteに搭載されているMAC用ブロック。読み込み時のMAC生成
- MACは同時に読みだしたデータに対して生成される
- 経路上の改ざん検知とかに使う
FeliCa/ブロック/MAC_A (0x91)
- FeliCa Lite-Sで追加。読み/書き時のMAC生成
- ライトアクセス権制御、及びライトデータの改ざん検知などに使える。
- 書き込まれたブロックデータとブロック番号及びWCNT値からMACを生成
- 生成したMACとMAC_Aに書き込まれたMACを比較して、一致した場合のみデータを格納
動作
- IC内に格納されたカード鍵(FeliCa/ブロック/CK)とリーダ/ライタから指定される乱数(FeliCa/ブロック/RCに書き込む)からMAC生成用の鍵(セッション鍵)を生成
- セッション鍵とIDmなどの読み出すデータからMACを生成
- リーダ/ライタ側でもカード鍵からセッション鍵を生成→受け取ったデータとセッション鍵からMACを生成して比較する。
- MAC値はRead Without Encryptionコマンドで読み出したブロックのデータに対して常に生成され、MACブロックとMAC_Aブロックに格納される。(どっちかから読み取る)
FeliCa/カード鍵
- FeliCa/ブロック/CK
- 発行時に書き込む
- カード鍵は書き込み専用レジスタなので直接読み出すことはできない
FeliCa/セッション鍵 (SK1,SK2)の生成
MACの生成
- セッション鍵(SK1,SK2)を鍵、読みだしたブロックのデータを平文、ランダムチャレンジ(RC1)を初期値とする2-key Triple DES-CBCで生成
- MACは読みだしたブロックのデータに対して生成される
- 1ブロックに対して生成されたMACは次のブロックに対するMAC生成の初期値となる