如何向Mifare Classic 1k卡发送APDU?

7
我想要实现的是向MIFARE Classic 1K卡发送APDU命令,以更改其A和B密钥。我能够与该卡建立连接并使用默认密钥( FFFFFFFF FFFF )读取块0和块1。我使用了HID MifareSamples应用程序。现在,我想将A密钥从默认更改为其他内容。我在stackoverflow上找到了一个解决方案(Mifare Change KEY A and B),它建议我发送以下APDU:新密钥A = 00 11 22 33 44 55 访问位未被覆盖 密钥B未使用(因此FF FF FF FF FF FF)=>写入扇区尾部00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF。我发现了一个很好的工具JSmartCard Explorer,它允许您向卡发送APDU。然后我阅读了PCSC规范3.2.2.1.4加载密钥命令章节,并理解该命令应该类似于这样:
FF 82 00 00 18 00 11 22 33 44 55 FF 0F 00 FF FF FF FF FF FF FF

但不幸的是,JSmartCard工具出现了“命令不允许(没有当前EF)”的错误。
我做错了什么?我该如何更改密钥?

你尝试过使用RFIDIoT库吗? - Ellipticat
1个回答

8
首先,MIFARE Classic卡不使用APDU命令。因此,您不会向卡发送APDU,而是发送给读卡器(它将其转换为MIFARE Classic命令)。通常情况下,要由读卡器处理的APDU命令以类字节FF开头。
在MIFARE Classic卡中,密钥(A和B)和每个扇区的访问条件存储在扇区尾部(每个扇区的最后一个块)。MIFARE Classic 1K卡有16个扇区,每个扇区有4个块。
因此,如果您想设置第0个扇区的密钥和访问条件,您需要将它们写入第3个块(第0个扇区的最后一个块)。PC/SC标准为存储卡定义了写命令(UPDATE BINARY)。
FF D6 XXYY 10 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

其中XXYY是块地址,ZZ...是要写入块的数据。

扇区尾的格式为(更多细节请参见此答案):

<key A> | access bits | general purpose byte | <key B>

因此,为了设置

  • 密钥A = 00 11 22 33 44 55
  • 密钥B = 66 77 88 99 AA BB
  • 访问位 = 787788(扇区尾只能使用密钥B进行写入; 可以使用密钥A或B读取访问位/GPB; 数据块只能使用密钥B进行写入; 数据块可以使用密钥A或B进行读取)
  • GPB设置为69

对于扇区0,您将使用以下写入命令:

FF D6 0003 10 001122334455 787788 69 66778899AABB

请注意,您无法部分更新扇区尾部,您总是需要构建并写入整个扇区尾部。

清晰明确的回答! - ManuelH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接