【问题标题】:ISO 15693: read multiple security blocksISO 15693:读取多个安全块
【发布时间】:2013-12-18 20:36:34
【问题描述】:

我正在尝试将当前从 ISO 15693 附近 RFID 卡 (TI Tag-it HF) 读取一个安全状态/块的现有 SCardTransmit() 命令 (C#) 修改为将检索所有安全状态的命令卡上有 64 个块。现有代码如下:

Byte[] sendHeader = { 0xFF, 0x30, 0x00, 0x03, 0x05, 0x01, 0x00, 0x00, 0x00, Convert.ToByte(blockNum), 0x01 };

Byte[] sendBuffer = new Byte[255]; //Send Buffer in SCardTransmit
int sendbufferlen;                 //Send Buffer length in SCardTransmit

SmartCardData pack = new SmartCardData();

sendHeader.CopyTo(sendBuffer, 0);
sendbufferlen = Convert.ToByte(sendHeader.Length);

SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendbufferlen);

按照我的理解,Convert.ToByte(blockNum) 前面的字节表示获取安全状态的命令,后跟有问题的块,以及要读取的块数。我看到的关于安全状态读取的唯一参考是在"Contactless Smart Card Reader Dev Guide"

中的第 10.3.4 节

注意:SmartCardTransmit 负责使用正确的卡句柄和其他所需参数调用 SCardTransmit。我对表示对安全块 0 到 63 的请求的发送标头的格式更感兴趣。

【问题讨论】:

  • 您使用的是什么 RFID 卡?该主题表明您正在使用某种类型的 MIFARE 卡。但是,您所指的命令(10.3.4:获取安全状态)是特定于 ISO 15693 邻近卡的命令。没有 MIFARE 卡属于这种类型。
  • 我的错误,经过进一步调查,我使用的是德州仪器 Tag-it™ 卡和 OMNIKEY 非接触式智能卡读卡器。
  • 话虽如此,我不确定如何将上面的字节数组转换为导致返回所有 64 个安全块的字节数组。

标签: rfid pcsc contactless-smartcard winscard iso-15693


【解决方案1】:

很遗憾,这是不可能的。 HID/Omnikey 智能卡读卡器的获取安全状态命令只能通过每个命令检索一个块的安全状态。因此,无论您尝试提供什么 Le 字节,阅读器将始终只返回您使用 blockNum 指定的块的安全状态。

因此,获取所有块的安全状态的唯一方法是遍历所有块并为每个块发出命令:

bool moreBlocks = true;
int blockNum = 0;
while (moreBlocks) {
    byte[] sendBuffer = {
        0xFF, 0x30, 0x00, 0x03,
        0x05,
        0x01,
        0x00, 0x00,
        (byte)((blockNum>>8) & 0xFF), (byte)(blockNum & 0xFF),
        0x00
    };
    SCardTransmitReceived rxBuf = SmartCardTransmit(sendBuffer, sendBuffer.Length);
    moreBlocks = check_if_rxBuf_ends_with_sw9000(rxBuf);
    ++blockNum;
}

【讨论】:

  • 迈克尔,非常感谢您的回答!这让事情变得很清楚。我假设您的 check_if_rxBuf_ends_with_sw9000 在返回缓冲区的末尾检查 0x90 和 0x00?
  • 对,这就是这个伪代码函数应该做的。通常,如果一个块不存在,您应该得到 0x6A82(或某些阅读器版本 0x6A81)。所以检查 0x9000 是最简单的选择。
  • 谢谢迈克。这实际上提出了另一个问题,我将在这里提出一个问题,而不是提出一个新问题。当前代码还一次读取 64 个数据块 8 个块。 10 次中有 9 次,读取工作正常,但偶尔我会得到你所说的 0x6A82。您是否知道可能导致偶发错误的原因?
  • 您应该为此提出一个单独的问题(包括代码、结果等)。
【解决方案2】:

从这个文件: link 您的标签似乎符合 ISO15693 标准。从您提供的文档看来,您需要的命令位于第 59 页。现在,从命令的描述来看,0x01 是版本,以下两个字节(0x00 和 0x00)表示按块读取。 Convert.ToByte() 之前的字节接缝为起始块的 MSB (0x00)。 Convert.ToByte() 是起始块的 LSB。接下来是命令描述中的Le(要读取的块数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多