Android Mifare Classic 身份验证密钥 A 无效
Android Mifare Classic authentication Key A not working
我在使用 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(应用程序代码)?我应该什么时候使用它?
您的 key
字节数组作为 MIFARE Classic 密钥没有多大意义。 MIFARE Classic 的密钥仅包含 6 个字节。因此,这将是 key:
的可能值
byte[] key = new byte[] { (byte)0x3c, (byte)0x55, (byte)0x28,
(byte)0x12, (byte)0x5c, (byte)0x61 };
如何验证一个扇区并读取一个数据块?
为了读取块 2(并假设在使用上述 key
进行身份验证后它是可读的),您将执行如下操作:
- 验证到包含要读取的块的扇区(块2位于扇区0,您可以使用helber方法
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();
什么是 AID(应用程序标识符)?我应该什么时候使用它?
MIFARE Classic 本身具有线性内存布局。 IE。一种基于块号寻址,其中每个块包含 16 个字节。这些块被分组为具有单独访问条件和密钥的扇区。
为了将此数据(块的 sectors/groups)逻辑分配给特定应用程序(例如,物理访问控制系统的一些数据,电子钱包的一些数据等),因此,为了同时将一张卡用于多个应用程序,引入了 MIFARE 应用程序目录 (MAD)。 MAD 基本上是一个查找 table(MIFARE Classic 1K 位于扇区 0,MIFARE Classic 4K 位于扇区 0 和 16)。此查找 table 将卡的每个扇区映射到一个应用程序。应用程序通过一个两字节的值来识别,即 MIFARE 应用程序标识符 (AID)。因此,如果卡使用 MAD,应用程序可以通过浏览 MAD 查找其数据扇区以查找其 AID。
我在使用 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(应用程序代码)?我应该什么时候使用它?
您的 key
字节数组作为 MIFARE Classic 密钥没有多大意义。 MIFARE Classic 的密钥仅包含 6 个字节。因此,这将是 key:
byte[] key = new byte[] { (byte)0x3c, (byte)0x55, (byte)0x28,
(byte)0x12, (byte)0x5c, (byte)0x61 };
如何验证一个扇区并读取一个数据块?
为了读取块 2(并假设在使用上述 key
进行身份验证后它是可读的),您将执行如下操作:
- 验证到包含要读取的块的扇区(块2位于扇区0,您可以使用helber方法
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();
什么是 AID(应用程序标识符)?我应该什么时候使用它?
MIFARE Classic 本身具有线性内存布局。 IE。一种基于块号寻址,其中每个块包含 16 个字节。这些块被分组为具有单独访问条件和密钥的扇区。
为了将此数据(块的 sectors/groups)逻辑分配给特定应用程序(例如,物理访问控制系统的一些数据,电子钱包的一些数据等),因此,为了同时将一张卡用于多个应用程序,引入了 MIFARE 应用程序目录 (MAD)。 MAD 基本上是一个查找 table(MIFARE Classic 1K 位于扇区 0,MIFARE Classic 4K 位于扇区 0 和 16)。此查找 table 将卡的每个扇区映射到一个应用程序。应用程序通过一个两字节的值来识别,即 MIFARE 应用程序标识符 (AID)。因此,如果卡使用 MAD,应用程序可以通过浏览 MAD 查找其数据扇区以查找其 AID。