我在使用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并获取字节?答案 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
进行身份验证后可以读取),您可以执行以下操作:
MifareClassic.blockToSector()
来获取给定块号的扇区号。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();
MIFARE Classic本身具有线性内存布局。即一个基于块号寻址的,其中每个块包含16个字节。这些块被分组为具有单独访问条件和密钥的扇区。
为了逻辑地将这些数据(块的扇区/组)分配给特定的应用程序(例如,物理访问控制系统的一些数据,电子钱包的一些数据等),因此,使用一张卡对于同一个应用程序,我们引入了MIFARE应用程序目录(MAD)。 MAD基本上是一个查找表(位于MIFARE Classic 1K的扇区0和MIFARE Classic 4K的扇区0和16)。该查找表将卡的每个扇区映射到一个应用程序。应用程序通过两个字节的值(MIFARE应用程序标识符(AID))进行标识。因此,如果卡使用MAD,则应用程序可以通过浏览MAD来查找其数据扇区。