MIFARE Classic - 什么会导致 "All-zero key" 和 "Unknown key" 错误?

MIFARE Classic - What could cause "All-zero key" and "Unknown key" error?

我开发了一个 C# 应用程序来写入 MIFARE Classic 卡。我使用默认密钥 (FF FF FF FF FF FF) 写入卡。

写入卡后,我注意到扇区 1 的块中没有数据。相反,扇区 1 如下图所示(使用 NXP TagInfo 读取时):

此外,我无法再验证扇区 1 内的块。

这是在我用我的应用程序写入卡后发生的。写入前,块没问题(可以读取)。

那么是什么导致了这个问题?

什么会导致 NXP TagInfo 出现 "All-zero key" 和 "Unknown key" 错误?

这些并不是真正的错误。这只是告诉您 NXP TagInfo 无法读取该扇区,因为它不知道(“Unknown key”)向扇区 1 进行身份验证所需的密钥。

什么会导致扇区变得不可读?

最明显的原因是您使用的卡已经包含一些受 non-standard 密钥保护的数据(既不是出厂默认密钥,也不是 NDEF 密钥,也不是 NXP TagInfo 提供的任何其他密钥)默认测试。在那种情况下,您的应用程序将无法首先写入该卡的扇区 1。

但是,既然你指出

This is happening after I write to the card with my application. Before writing, the blocks are fine (can be read).

我假设您的应用程序写入扇区 1 的最后一个块(块 7)。每个扇区的最后一个块是扇区尾部。该块包含该块的访问控制信息(身份验证密钥 A 和 B 以及访问位)。该块的格式如下:

XX XX XX XX XX XX  ZZ ZZ ZZ  GG  YY YY YY YY YY YY

其中XX XX XX XX XX XX(6字节)为密钥A,YY YY YY YY YY YY(6字节)为密钥B,ZZ ZZ ZZ(3字节)为访问条件,GG(1 个字节)是通用字节。

因此,如果您覆盖此块,您将更改该扇区的身份验证密钥和访问条件。因此,如果您向该块写入新的身份验证数据(新密钥 A/B 和新的访问位),则需要使用更新后的信息进行未来的身份验证尝试。

但是,如果您将部分数据写入该块,则很可能会将访问位设置为无效值。在这种情况下(访问位包含无效值),整个扇区永久 变得不可用。作为一项安全功能,MIFARE CLassic 卡将阻止访问具有无效访问条件的扇区。一旦扇区处于该状态,就无法恢复。

关于尾部块和访问位,另见这些问题:

  • MIFARE Classic: How to find to good Access Byte value

00 00 00 00 00 00 KeyA 可能在 2 种可能的条件下发生

  1. 0x00 写在扇区尾部的所有 16 个字节上

  2. 在扇区尾部写入完成之前,卡已从 reader 中移除。被称为卡撕裂,它可以导致所有 16 个字节中写入所有 0x00。

在上述任一情况下,Accces 位现在将为 00 00 00...这将不可逆转地锁定该扇区。