如何将APDU发送到Mifare Classic 1k卡?

Ops*_*ski 5 access-control apdu pcsc mifare contactless-smartcard

我想要实现的是将APDU命令发送到MIFARE Classic 1K卡以更改其A和B键.

我能够与卡建立连接并使用默认密钥(FFFFFFFFFFFF)来读取块0和块1.我使用了HID MifareSamples应用程序.

现在,我想将A键从默认更改为其他内容.我在这里找到了一个解决方案,在stackoverflow(Mifare Change KEY A和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
Run Code Online (Sandbox Code Playgroud)

但不幸的是,JSmartCard工具失败了,"命令不允许(没有当前的EF)".

我做错了什么?我该如何更改密钥?

Mic*_*and 6

首先,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
Run Code Online (Sandbox Code Playgroud)

XXYY块地址在哪里,ZZ...是要写入块的数据.

行业预告片的格式是(有关详细信息,请参阅此答案):

<key A> | access bits | general purpose byte | <key B>
Run Code Online (Sandbox Code Playgroud)

所以为了设定

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

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

FF D6 0003 10 001122334455 787788 69 66778899AABB
Run Code Online (Sandbox Code Playgroud)

请注意,您无法部分更新扇区预告片,您始终必须构建和编写整个扇区预告片.