Android Mifare Classic身份验证密钥A无效

时间:2015-09-24 09:37:06

标签: android authentication nfc rfid mifare

我在使用MifareClassic.autenticateSectorWithKeyA(int sector, byte[] keyA)方法的应用程序中遇到问题。我尝试了很多方法,但没有进行身份验证。

我的钥匙A是:

byte[] key = new byte[] { (byte) 0x3c, (byte) 0x55, (byte) 0x28,
                          (byte) 0x12, (byte) 0x5c, (byte) 0x61, (byte) 0x00,
                          (byte) 0x5C, (byte) 0x71, (byte) 0x00 };
  • 此密钥中的每个字节代表什么?
  • 如果我有一个像3c5528125c61这样的密钥,我应该如何编写字节数组进行身份验证,读取块2并获取字节?
  • 什么是AID(应用程序代码)?我应该什么时候使用它?

1 个答案:

答案 0 :(得分:4)

您的key字节数组作为MIFARE Classic密钥没有多大意义。 MIFARE Classic的密钥只包含6个字节。因此,这可能是密钥的可能值:

byte[] key = new byte[] { (byte)0x3c, (byte)0x55, (byte)0x28,
                          (byte)0x12, (byte)0x5c, (byte)0x61 };

如何对扇区进行身份验证并读取数据块?

为了阅读第2块(假设在使用上述key进行身份验证后可以读取),您可以执行以下操作:

  1. 对包含要读取的块的扇区进行身份验证(块2位于扇区0中,您可以使用helber方法MifareClassic.blockToSector()来获取给定块号的扇区号。
  2. 如果验证成功,您可以阅读该块。
  3. final MifareClassic mfc = MifareClassic.get(tag);
    mfc.connect();
    
    final int blockNumber = 2;
    if (mfc.authenticateSectorWithKeyA(mfc.blockToSector(blockNumber), key)) {
        final byte[] data = mfc.readBlock(blockNumber)
        // TODO: do something with data
    }
    
    mfc.close();
    

    什么是AID(应用程序标识符)?我什么时候应该使用它?

    MIFARE Classic本身具有线性内存布局。即一个基于块号寻址的,其中每个块包含16个字节。这些块被分组为具有单独访问条件和密钥的扇区。

    为了逻辑地将这些数据(块的扇区/组)分配给特定的应用程序(例如,物理访问控制系统的一些数据,电子钱包的一些数据等),因此,使用一张卡对于同一个应用程序,我们引入了MIFARE应用程序目录(MAD)。 MAD基本上是一个查找表(位于MIFARE Classic 1K的扇区0和MIFARE Classic 4K的扇区0和16)。该查找表将卡的每个扇区映射到一个应用程序。应用程序通过两个字节的值(MIFARE应用程序标识符(AID))进行标识。因此,如果卡使用MAD,则应用程序可以通过浏览MAD来查找其数据扇区。