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

时间:2015-09-18 19:03:40

标签: access-control mifare apdu contactless-smartcard pcsc

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

我能够与卡建立连接并使用默认密钥(FFFFFFFFFFFF)来读取块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)”。

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

1 个答案:

答案 0 :(得分:6)

首先,MIFARE Classic卡不使用APDU命令。因此,您不会将APDU发送到卡,而是发送到读卡器(将其转换为MIFARE Classic命令)。要由阅读器处理的APDU命令通常以类字节FF D6 XXYY 10 ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 开始。

在MIFARE Classic卡中,密钥(A和B)以及每个扇区的访问条件都存储在扇区尾部(每个扇区的最后一个块)中。 MIFARE Classic 1K卡有16个扇区,每个扇区有4个块。

因此,如果您想设置按键和&对于扇区0的访问条件,您需要将它们写入块3(扇区0的最后一个块)。 PC / SC标准将存储卡的写命令(UPDATE BINARY)定义为:

XXYY

其中ZZ...是块地址,<key A> | access bits | general purpose byte | <key B> 是要写入块的数据。

行业预告片的格式是(见this answer for further details):

00 11 22 33 44 55

所以为了设置

  • 键A = 66 77 88 99 AA BB
  • 键B = 787788
  • 访问位= 69(扇区尾部只能使用密钥B写入;访问位/ GPB可以用密钥A或B读取;数据块只能使用密钥B写入;数据块可以用密钥读取A或B)
  • GPB设置为FF D6 0003 10 001122334455 787788 69 66778899AABB

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

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get -y upgrade

RUN mkdir -p /root/.ssh
RUN touch /root/.ssh/known_hosts

RUN ssh-keyscan github.com >> /root/.ssh/known_hosts

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