Android入門 MifareClassicの認証に関して


KeyAとKeyB

前回見たように、あるセクタはその中にデータ領域とそのセクタを読み書きするための認証情報で成り立っています。
こんな感じです



これは前回話したことと同じですね。ブロック0〜ブロック2の48バイトが、
セクタの一番後ろにある16バイトの情報により守られています。
今回はこの16バイトの話。
画像ではここにKeyAとアクセスbitsとKeyBというのがありますね。その通り、ここにはその3つの情報が入っています。
KeyAとKeyBというのが正しく鍵で、このセクタの情報を読み書きするのに必要なやつです。
2つあるのは何故かって?玄関の二重鍵みたいにKeyAとKeyB両方ないとアクセス出来ないとかそういうわけじゃないです。
詳しく見て行きましょう


KeyAとKeyBとアクセスbits

実際に16バイトの中をみてみるとこのようになっています(PHILIPSのMF1 IC S70 Specificationより)

KeyAとKeyBというのはどちらも6バイトの鍵情報だということがわかります。
ではAccessBitsとは何でしょうか。
突然ですがこの資料を見て下さい。


KeyAとKeyBのアクセス制限ですね。
実はKeyが2つあるのはそれぞれの役割をこんなかんじでAccessbitsで制御できるからです。
例えばC1C2C3というのを101にしたらKeyAは何もできませんが、KeyBなら読むことだけはできます。
100にしたら、KeyAとKeyBは読むことができますが、書き込めるのはKeyBだけとなります。
そしてこのC1C2C3をこんなふうにAccessbitsに設定します。


こっから分かるようにブロック0ブロック1ブロック2そしてこの鍵領域への読み書きは独立して設定出来ます。
例えばブロック0はKeyABどっちでも読めるけど書けない。一方ブロック1はKeyBを使えば書き込むことが出来る。と言った風に
個別に設定出来ます。
面白いでしょ?
ただし、鍵領域への読み書きは他のやつとはちょっと違います

こんな風になってます。
例えば 100にした場合KeyBでKeyBを上書きできますし、KeyAも上書きできちゃいます。ただし読み込めないですね。
111なら鍵は読めないし二度と書き込めないですね。一度設定したら元に戻せない設定です。

試しに鍵を設定してみましょう。
ブロック0〜2は読み取り専用で、鍵の書き換えを出来ないようにする という状態にしてみましょう。
読み取り専用に出来るのは101ですね。そして読み取れるのはKeyBだけということになります。
そして鍵を読み書きできないようにするのは111ですね。Keyも適当に設定してみましょう。するとこんな感じです

KeyA = 01-02-03-04-05-06
KeyB = 01-02-03-04-05-06

データ領域のC1C2C3 = 101
鍵領域のC1C2C3 = 111
以上からaccessbitsは
 Byte6 = 01110000 = 0x70
 Byte7 = 11110000 = 0xF0
 Byte8 = 11111000 = 0xF8

と言うことは以上から鍵領域に
01-02-03-04-05-06-70-F0-F8-00-01-02-03-04-05-06
を書き込むとこのセクタの鍵は読み書き不可となりデータ領域はKeyBによる読み込みしか出来ない ということになりますね。

と、こんだけ散々書きましたがじっさいにやってみないとよくわからないですよね。
では実際に次からタグの情報を読み込んでみましょう。

 

ホームへ