Android入門 鍵とアクセスコントロールを変えてみる
今回は鍵とアクセスビットを変えてみましょう。
変え方は簡単で、ここもデータブロックと同じように書き込みができるので、
鍵とアクセスビットを書き込んだ16バイトのバイト列で4つ目のブロックを書き込むだけです
書き込むデータは前の方で紹介した例を使いましょう
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
これですね。
boolean writemode = false; int sector = 1; if(tag!=null) { Log.i("nfc","nfc tagid="+stringFromBytes(tagid)); MifareClassic mfc = MifareClassic.get(tag); try { if(!mfc.isConnected())mfc.connect(); if(writemode) { if(mfc.authenticateSectorWithKeyA(sector,MifareClassic.KEY_DEFAULT)){ byte[] data = new byte[16]; data[0] = (byte)0x01; data[1] = (byte)0x02; data[2] = (byte)0x03; mfc.writeBlock(sector*4+0,data); for(int i=0; i<6; i++)data[i] = (byte)(i+1); data[6] = (byte)0x70; data[7] = (byte)0xF0; data[8] = (byte)0xF8; for(int i=0; i<6; i++)data[i+10] = (byte)(i+1); mfc.writeBlock(sector*4+3,data); Log.i("nfc","nfc written"); }else{ Log.i("nfc","nfc auth fail"); } }else{ byte[] keyB = new byte[16]; for(int i=0; i<6; i++)keyB[i] = (byte)(i+1); if(mfc.authenticateSectorWithKeyB(sector,keyB)){ byte[] Block0 = mfc.readBlock(sector*4+0); String Block0String = stringFromBytes(Block0); Log.i("nfc","nfc Block0="+Block0String); }else{ Log.i("nfc","nfc auth fail"); } } mfc.close(); }catch (Exception e) { Log.i("nfc","nfc connection fail"); }finally{ } } |
もう余裕ではないでしょうか。
今回は通常の鍵で入って鍵を書き換える”書き込みモード”とオリジナルの鍵で入って情報を持ってくる”読み込みモード”
を用意しました。
まず、書き込みにしてビルドして書き込んだら =trueを=falseにして読み込みモードにして読んでみて下さい。いけるはずです。
鍵情報の書き込みは
for(int i=0; i<6; i++)data[i] = (byte)(i+1);
data[6] = (byte)0x70;
data[7] = (byte)0xF0;
data[8] = (byte)0xF8;
for(int i=0; i<6; i++)data[i+10] = (byte)(i+1);
mfc.writeBlock(sector*4+3,data);
ここのところです。data配列にKeyAとaccessbitsとKeyBを入れて4番目のブロックに書き込んでいます。
これを書き込んだ段階から鍵は01-02-03-04-05-06に切り替わりました。
なので、読み込むために
for(int i=0; i<6; i++)keyB[i] = (byte)(i+1);
if(mfc.authenticateSectorWithKeyB(sector,keyB))
こんなふうに鍵を生成して、さらにKeyAだったのをKeyBでの認証に切り替えて入っています。
これでこのセクタはKeyBで保護されたのを確認できました。
試しにTagInfoアプリでみてみると
こんなふうにデータ領域も鍵領域も何もかも見れなくなっています。