UPDATE BINARY 并读回写入的块

Posted

技术标签:

【中文标题】UPDATE BINARY 并读回写入的块【英文标题】:UPDATE BINARY and read back the written block 【发布时间】:2016-01-21 17:30:33 【问题描述】:

我正在发送一个 UPDATE BINARY 命令来写入卡的内存,然后我想检查块是否正确写入。所以,我正在发送一个 READ BINARY 命令并比较这些值。

(C - 命令,R - 响应) C : FF820060067B296F123456 R : 9000 C : FFD600010401000080 R : 9000 C : FF820060067B296F123456 R : 9000 C:FFB0000104 R : 6C10

我期待收到01000080。你能帮帮我吗?

【问题讨论】:

【参考方案1】:

您对 READ BINRARY APDU 的响应非常清楚。状态字6Cxx 表示您应该使用xx 作为Le 值重新发出最后一个命令APDU。因此,您应该将 APDU 重新签发为

FFB0000110

由于您没有通过这些命令透露您正在访问什么类型的接触式或非接触式存储卡,我只能猜测您正在访问 NFC Forum Type 2 标签(MIFARE Ultralight、NTAG 或类似标签)。使用这些标签,每个页面有 4 个字节,您可以单独编写每个页面。因此,写命令正好接受 4 个字节。但是,该技术的读取命令始终读取一组 4 个页面,这意味着您始终读取 16 个字节。

还请注意,您在每个其他命令之前发送的 LOAD KEYS 命令实际上并没有多大意义。首先, LOAD KEYS 命令仅将密钥加载到读取器内存中,以供以后在 AUTHENTICATE(或评估者 GENERAL AUTHENTICATE)命令中使用,显然您在加载密钥后永远不会使用该命令。其次,您总是再次加载相同的密钥,这是完全没有必要的。第三,如果标签实际上是 MIFARE Ultralight 或 NTAG,则不存在具有 6 字节键值的标签。

【讨论】:

感谢您的解释迈克尔。那么,我应该如何继续验证数据是否正确写入?就我而言,我发送的是 FFD600010401000080,然后我想从智能卡中读取该数据并与之前读取命令中定义的数据进行比较。 @DeimosStudios 我不确定我是否理解您的问题。由于您一次只能读取 4 个块,您可以在每个写入命令之后读取并删除您收到的额外 3 个块(即仅比较接收数据的前 4 个字节),或者您可以仅在之后执行读取操作每 4 个块写入一次,并将收到的 16 个字节与最后 4 次写入操作写入的字节进行比较。 UPDATE BINARY命令(FF D6...)的响应为90 00,表示命令执行成功。那么这不保证所有数据都更新成功了吗?【参考方案2】:

尝试发送FFB000010104

CLA = FF INS = B0 P1 = 00 P2 = 01 LC = 01 数据 = 04

【讨论】:

是的。我想写,然后阅读和比较。这在其他命令中有效,但在那个命令中有效。例如:FF820061234 9000 FFD60012000CF029A9300000CO 9000 FF8200615031500000000000050000000000000000005000000000000000000500000000000000000050000000000000000005000000000000000000000000000000000000000000000000000000000CO 9000 FF82006150000F029A93000000F029A9300000000F029A9300000000F029A9300000000F029A9300000000F029A9300000000F029A9300000000F029A9300000000FF029A930000000000F029A9300000C0900000CS SPAN> 嗯,你的命令有问题,更具体地说是'FFB0000104'命令,当卡返回6C10时,这意味着你传递了错误的长度。 你是对的佩德罗,这就是我的观点!我正在写 FFD6 0001 04 [01 00 00 80] 并且我想检查它是否写得正确,所以,我正在阅读 FFB0 0001 [04] 并期望得到 [01 00 00 80]。我不明白。 CLA = D6 - 更新二进制命令,INS = 00, P1 = 01, P2 = 04, LC = 01, DATA = 0000, LE = 80,所以你想写 0000,对吧? 其实CLA = FF, INS = D6, P1 = 00, P2 = 01, LC = 04 and data 01000080.

以上是关于UPDATE BINARY 并读回写入的块的主要内容,如果未能解决你的问题,请参考以下文章

序列化 numpy 数组列表并读回/反序列化为 Javascript

libnfc:从 NTAG 写和读回自定义数据

读取和写入 NSMutableDictionary 到 plist 文件

允许写入/读取的在线 C++ 编译器

如何将 OrderedDicts 写入文件并将其读回列表?

Perl - 格式化输出和读取格式化数据