【问题标题】:Write password to Ntag213 using python and acr122u使用 python 和 acr122u 将密码写入 Ntag213
【发布时间】:2022-10-12 23:07:06
【问题描述】:

我正在尝试使用 acr 122u 读卡器将一些数据写入 NFC。到目前为止,我能够做到。我的问题是我还需要保护 NFC 密码。我可以使用 nfctools 之类的手机应用程序添加密码,但我需要这个过程在未来实现自动化。

为此,我使用 python smartcard.System 连接并写入 NFC 标签。我的问题是我在任何地方都找不到如何将密码保存到标签中。

from smartcard.System import readers
from smartcard.CardConnection import CardConnection
from smartcard.scard import SCARD_SHARE_DIRECT

reader = readers()[0]
print(reader)
connection = reader.createConnection()
connection.connect()
command = [0xFF, 0xD6, 0x00, 0x05, 0x04, 0x34, 0x03, 0x3d,0x91]
r, sw1, sw2 = connection.transmit(command)

这适用于写作。我已经尝试过这个进行身份验证:

auth= [0xFF, 0x00, 0x00, 0x00, 0x07, 0xd4, 0x42, 0x1b, 0x01, 0x01, 0x01, 0x01]
r, sw1, sw2 = connection.transmit(auth)
print(r)
print(sw1)
print(sw2)

auth2= [0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, 0x60, 0x00]
r, sw1, sw2 = connection.transmit(auth2)
print(r)
print(sw1)
print(sw2)

这不起作用。据我所知,这只会对我进行 NFC 身份验证,不会将密码写入 NFC 本身。

有小费吗?谢谢

编辑:我正在使用 acs 网站 http://www.acs.com.hk/download-manual/419/API-ACR122U-2.04.pdf 中的 API 文件

【问题讨论】:

  • 请指定 Mifare Ultralight 标签的确切型号,因为目前有 3 个不同的版本 (nxp.com/products/rfid-nfc/mifare-hf/mifare-ultralight:MC_53452),每个版本都有不同的密码/身份验证模型。设置密码的确切方法在我列出的 URL 中显示的数据表中定义。
  • @Andrew 原来我把手机放在钱包里,里面有一个 mifare ultralight ev1。我想读/写的 nfc 是 Ntag213。我也会为此检查数据表。
  • Ntag 21x 系列和 Ultralight EV1 使用非常相似的方法,将 PASSWORD 和 PAK 存储在正确的块地址,然后更改为正确的配置页块地址以启用。 stackoverflow.com/a/22723250/2373819 的 Java 中的详细示例将命令显示为正确的字节数组,但是当您使用 acr122u 时,您需要将它们包装在 Pseudo ADPU 中以让阅读器传输正确的命令字节数组
  • @Andrew我正在使用acs提供的直接传输。但是我写不出来。我正在发送一个简单的命令来读取块 0x05,但我得到“卡返回没有有效响应”。我发送的命令是 [0xff, 0x00, 0x00, 0x00, 0x02, 0x30, 0x05]。我错过了什么。
  • 好吧,使用直接 trasnmit 是正确的,但该命令不是用于 nfc 的命令,而是用于stackoverflow.com/a/25084763/15078755 中所述的 PN532

标签: python nfc acr122


【解决方案1】:

在@Andrew 和一些研究的帮助下,我找到了解决方案。

我正在使用 python 智能卡从 python 到 acr122u 进行通信,如下所示:

from smartcard.System import readers
from smartcard.CardConnection import CardConnection
from smartcard.scard import SCARD_SHARE_DIRECT

reader = readers()[0]
connection = reader.createConnection()
connection.connect()

为了将普通数据写入标签,我使用来自http://www.acs.com.hk/download-manual/419/API-ACR122U-2.04.pdf 的更新二进制块,如下所示:

command = [0xFF, 0xD6, 0x00, 0x05, 0x04, 0x34, 0x03, 0x3d,0x91]
r, sw1, sw2 = connection.transmit(command)
if (sw1,sw2) == (0x90,0x00):
    print("Correct command")
else:
    print("Error")

在为标签设置密码时,我们需要使用 ACS PDF 中的 Direct Transmit 命令。此命令会将我们的有效负载发送到 NFC 阅读器内的 PN532 芯片。因此,在我们的有效载荷中,我们需要有一个特殊的命令来告诉 PN532 将我们的命令发送到 NFC 标签,该特殊代码是 0x4d,0x42。

现在我们可以使用此处出现的 Ntag 213 支持的任何命令 https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf 我们只需要遵循以下布局:

[0xff, 0x00, 0x00, 0x00, 要发送的字节数, Payload]

其中有效载荷是:

[0xd4,0x42, ntag command] 例如读取是 [0xd4,0x42,0x30, 0x29]

总的来说,我们在直接传输中使用的命令将如下所示: [0xff, 0x00, 0x00, 0x00, 0x4, 0xd4,0x42,0x30, 0x29]

为了完成密码过程,我们需要按照NTAG212 Mifare Ultralight with Authentication 中描述的步骤进行操作,如下所示:

def createPseudoAPDU(payload, nBytes):
    #nBytes+0x2 to add the 0xd4 and 0x42 two bytes
    return np.concatenate(([0xff, 0x00, 0x00, 0x00, nBytes+0x2,0xd4,0x42], payload), axis=0).tolist() 


setPwd = createPseudoAPDU([0xa2, 0x2b,0x32,0x30,0x32,0x32],0x06)
setPack = createPseudoAPDU([0xa2, 0x2c,0x00,0x00,0x00,0x00],0x06)

setAuthLimAndProt = createPseudoAPDU([0xa2, 0x2a,0x00,0x05,0x00,0x00],0x06)

setauth0 = createPseudoAPDU([0xa2, 0x29,0x04,0x00,0x00,0x00],0x06)

r, sw1, sw2 = connection.transmit(setPwd)
print(r)
print(sw1)
print(sw2)

r, sw1, sw2 = connection.transmit(setPack)
print(r)
print(sw1)
print(sw2)

r, sw1, sw2 = connection.transmit(setAuthLimAndProt)
print(r)
print(sw1)
print(sw2)

r, sw1, sw2 = connection.transmit(setauth0)
print(r)
print(sw1)
print(sw2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多