Mifare 4K 更改尾随块中的键返回错误"99"使用 ACR1252 和 pyscard



我们从供应商处收到Mifare 4k卡,该供应商对每个扇区拖车进行预编码,如下所示:

FFFFFFFFFFFFFF078069FFFFFFFFFFFF

在此过程中,供应商将访问位设置为FF0780,读取密钥(密钥 A)和写入密钥(密钥 B)保持出厂默认FFFFFFFFFFFF

尝试使用 pyscard 和编码器ACR1252写入新的读取密钥(密钥 A)和写入密钥(密钥 B)和访问位时,我收到响应代码"99",这是一个未记录的错误代码。我认为发生这种情况是因为访问位已更改,因为直接从工厂发送的空白卡不会生成此错误。

在此示例中,我们更新尾部块,以便密钥 A 和密钥 BFFFFFFFFFFFF,访问位787788

write_data = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x77, 0x88, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
write_key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# load write key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x82, 0x00, 0x01, 0x06, *write_key])
# authenticate write key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, block, 0x61, 0x01])
# write data
_, response_code, _ = cardservice.connection.transmit([0xFF, 0xD6, 0x00, block, 0x10, *write_data])

知道为什么供应商设置了访问位的卡返回响应代码 99 吗?

注意:身份验证工作正常,只是写入步骤失败。

事实证明,供应商随后设置的访问位ff0780意味着您需要对read_key进行身份验证(密钥 A)才能写入拖车块。非常违反直觉,但适用于Mifare 4K卡,其中访问位以前设置为ff0780

write_data = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x78, 0x77, 0x88, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
read_key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
# load read key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x82, 0x00, 0x00, 0x06, *read_key])
# authenticate read key
_, response_code, _ = cardservice.connection.transmit([0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, block, 0x60, 0x00])
# write data
_, response_code, _ = cardservice.connection.transmit([0xFF, 0xD6, 0x00, block, 0x10, *write_data])

我还发现您需要在编写之前立即验证密钥。对两个密钥进行身份验证,先读取然后写入返回相同的99响应代码。此外,错误代码99似乎从MifareIC级联,而不是读卡器,这就是为什么错误代码99不会出现在ACR1252文档中的原因。

我发现以下文档很有帮助:

  • ACR1252应用程序编程接口 https://www.acs.com.hk/en/products/342/acr1252u-usb-nfc-reader-iii-nfc-forum-certified-reader/
  • Mifare 4K 应用笔记 https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-classic/mifare-classic-ev1-1k-4k:MF1S50YYX_V1?tab=Documentation_Tab

最新更新