【问题标题】:Mifare 1K writing data in two blocksMifare 1K 分两块写入数据
【发布时间】:2021-04-21 13:36:54
【问题描述】:

您好,我正在使用 APDU 命令来读写 RFID 卡。我可以从块 num 2 中读取并写入 16 字节的数据。但是我在写入更长的数据时遇到了问题,所以我该如何管理我试图在两个块中写入但它不起作用。 这就是我在编写操作中实现代码的方式

// write...
//


if (nres == SM_SUCCESS)// &&
//bAPDURes )
{
nlenrcv = sizeof(btRcv);
nlencmd = 0;

btCmd[nlencmd++] = 0xFF;                // CLA
btCmd[nlencmd++] = 0xD6;                // INS
btCmd[nlencmd++] = 0x00;                // P1, Mifare Block Number MSB, for mifare it is always 0x00
btCmd[nlencmd++] = 0x04;                // P2, Mifare Block Number LSB
btCmd[nlencmd++] = 32;              // Lc, Data Length
memcpy(btCmd + nlencmd, btWrite, 32);
nlencmd += 32;

nres = m_Smart.RFTransmit(DEV_INTERNALRF, nlencmd, btCmd, (DWORD*)&nlenrcv, btRcv);

【问题讨论】:

  • 嗯,这个问题我们无法准确回答——我认为不可能发布一个最小的可重现示例。在我看来,这条消息的格式很好......这里有一些问题可能会帮助您找到答案:1.您确定 P1 和 P2 是大端(您是否尝试过交换它们?) 2.您确定 CLA + INS组合能写2个字节以上吗? 3.你确定这个RFTransmit库函数正在向卡发送正确的东西吗? 4.你怎么知道“它不起作用”? - 程序验证这个数据写入的方式会不会有问题?

标签: c++ nfc rfid apdu


【解决方案1】:

您需要单独发送每个块。 Mifare Classic Write 命令一次只会写入一个块。

请参阅Card's Data sheet 的第 12.3 节

所以 RFTransmit 前 16 个字节的写命令到第一个块,RFTransmit 后 16 个字节的写命令到下一个块。

【讨论】:

  • 我一直在尝试将一些数据写入我的 mifare 经典卡。首先我发送这两个返回 90 00 的命令: Load Mifare Keys: FF 82 20 01 06 FF FF FF FF FF FF Authenticate: FF 86 00 03 05 01 00 05 60 00 现在我将命令写入扇区 0 和块 3并通过此命令阻止 4 APDU_WRITE_data_1 : FF D 00 03 16 APDU_WRITE_data_1 : FF D 00 04 16 但它不起作用是不是 APDU 写错了?
  • 很难说问题出在哪里,因为您似乎在使用伪 APDU,因此您正在处理读卡硬件以及它如何将这些转换为卡理解的真实命令,而您却没有'没有指定读卡器的确切品牌和型号。我会打开一个新问题,详细说明您的新问题。
  • 感谢您的回复,实际上我已经测试过在块 2 中正确写入数据,但正如我之前提到的,我的数据长度超过 16 位,所以我试图在块 3 中分配数据和4.我对这个新问题提出了一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多