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アプリでみてみると

こんなふうにデータ領域も鍵領域も何もかも見れなくなっています。

 

ホームへ