Mifare Ultralight C身份验证

时间:2014-07-14 12:57:03

标签: android authentication nfc mifare

我正在使用NFC标签(Mifare Ultralight C),但我在身份验证方面存在问题。

如果我在第42页上正确理解,则应该是有关受限页面的信息。有值04d83460所以第4页应该要求身份验证吗?

在第43页上,值为4a402b80。为什么会有这样的价值,这意味着什么?

我可以写入和阅读4-40页,但如果我尝试写第41页,那么没有任何事情发生。

修改

MifareUltralight mifare = MifareUltralight.get(tag);
        if(mifare == null){
            Log.e(LOG, "mifare null");
        } else {
            Log.e(LOG, "mifare not null");
            switch(mifare.getType()){
            case MifareUltralight.TYPE_ULTRALIGHT:
                Log.e(LOG, "ultralight");
                break;
            case MifareUltralight.TYPE_ULTRALIGHT_C:
                Log.e(LOG, "ultralight c");
                break;
            case MifareUltralight.TYPE_UNKNOWN:
                Log.e(LOG, "type unknown");
                break;
            }
        }


        try {
            mifare.connect();
            mifare.writePage(39, new byte[]{0x10, 0x02, 0x02, 0x02});

            Log.e(LOG, "read");

            byte[] resp = mifare.readPages(40);

            for(byte b : resp){
                Log.e(LOG, "resp: " + b);
            }



            mifare.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

1 个答案:

答案 0 :(得分:2)

标签似乎不是MIFARE Ultralight C标签。相反,它似乎是一个有42页的标签(这可能是,例如NTAG203)。

第一个指示是您从第42页读取的值:04d83460。这看起来像UID的开头,包括BCC0。 0x04看起来像恩智浦的制造商ID。此外,值0x60将是0x88(级联标记)XOR 0x04 XOR 0xD8 XOR 0x34的有效BCC0。因此,这可能是第0页的有效值。

对此的第二个指示是您阅读这些页面的方式:

byte[] resp = mifare.readPages(40);

使用此行,您可以从第40页开始读取四页。如果内存区域小于44页,此命令将翻转到内存区域的开头。因此,如果存储区域包含42个页面,则此命令将返回页面40,41,0和1.因此,您解释为页面42和43的实际上是页面0和1。

唯一奇怪的是,您的第2页包含值6f480000。如果第1页包含4a402b80(剩余的UID),那么第2页的第一个字节(BCC1)应为0x4A XOR 0x40 XOR 0x2B XOR 0x80 = 0xA1 0x6F