如何将低级命令(非 APDU)发送到 Windows 10(移动)上的智能卡?

Posted

技术标签:

【中文标题】如何将低级命令(非 APDU)发送到 Windows 10(移动)上的智能卡?【英文标题】:How to send low-level command (non-APDU) to a smartcard on Windows 10 (mobile)? 【发布时间】:2016-02-22 17:21:34 【问题描述】:

我正在根据微软提供的NFC Example 编写代码。Windows.Devices.SmartCards 中的所有内容都与 APDU 命令有关。例如,TransmitAsync 方法描述为:

异步传输提供的应用协议数据单元 (APDU) 命令并返回响应。

但是,由于这是一个带有字节数组参数的方法,我认为我可以通过使用此方法摆脱 APDU。我在 CardReader.xaml.cs 文件中插入了一些代码:

private async Task HandleCard(SmartCard card)
    ......
    // Handle MIFARE Standard/Classic
    LogMessage("MIFARE Standard/Classic card detected");
    var mfStdAccess = new MifareStandard.AccessHandler(connection);
    var uid = await mfStdAccess.GetUidAsync();
    LogMessage("UID:  " + BitConverter.ToString(uid));

    // My code
    LogMessage("==============");
    await SendBytes(connection, new byte[]  0xFF, 0xCA, 0, 0, 0 ); //APDU Test
    await SendBytes(connection, new byte[]  0x50, 0x00 ); // Halt card
    await SendBytes(connection, new byte[]  0x52 ); //Wake card
    return;
    ......

private async Task<byte[]> SendBytes(SmartCardConnection connection, byte[] RawData)

    LogMessage("> " + BitConverter.ToString(RawData).Replace("-", " ").ToUpper());
    byte[] res = (await connection.TransmitAsync(RawData.AsBuffer())).ToArray();
    LogMessage("< " + BitConverter.ToString(res).Replace("-", " ").ToUpper());
    return res;

我在手机上运行该应用程序以向 Mifare Classic 1K 卡发送命令。但是,我得到的是:

> FF CA 00 00 00
< 02 27 9F 8F 90 00
> 50 00
< 63 00
> 52
< 63 00

显然 APDU 1 有效。我不知道 63 00 是什么,但我猜它是 APUD 命令中的 SW 响应?我在论坛上看到您可以使用 NfcAdapter 在 android 手机上执行此操作。我的代码有什么问题?或者甚至可以在 Windows 10 Mobile 上发送低级命令(摆脱 APDU)?谢谢。

【问题讨论】:

我不知道您是如何得出这样的假设的,即原始 MIfare 令牌可以理解“停止卡”和“唤醒卡”。这些命令旨在让处理器卡发出信号,表明处理器可以切换到时钟停止模式或从时钟停止模式返回以降低其功耗。 Mifare 卡没有处理器,但有硬连线逻辑。我也不确定,除了留下一条完善的路径之外,您希望通过摆脱 APDU 结构获得什么。 也许我用了一个不恰当的例子。读卡器和卡之间有一个三步验证。我想通过低级命令(没有 proxmark)了解更多信息。防冲突和选卡后,如果读卡器发送 60 30 76 4a(block 30 auth.),Mifare 卡将响应一个 4 字节的挑战。但是,它对我不起作用。 【参考方案1】:

PCSC 具有特定于存储卡的命令。这样您就可以获得对 Mifare 的支持。当然,您必须获得读卡器制造商对 Mifare 卡的支持,但 Mifare 仍然很受欢迎。

但不支持原生 Mifare 命令。您需要将这些转换为2.01 specification,第 3.2.2.1 节中的 PCSC 命令。

因此您无需摆脱原生命令。只需将存储卡特定的 APDU 发送到读卡器,读卡器就会将本机命令发送到卡。

【讨论】:

【参考方案2】:

您必须按照 Maarten 的要求发送 PCSC 命令。有一个用 c# 编写的库,它将低级 Mirafe 命令封装到 PCSC APDU。

查看onovotny's repository

【讨论】:

以上是关于如何将低级命令(非 APDU)发送到 Windows 10(移动)上的智能卡?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 发送 APDU 命令?

如何使用 Windows Phone 8 NFC 应用程序向智能卡发送 APDU 命令

如何将任何 APDU 命令从当前选定的小程序传递到另一个小程序?

使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器

SDI011 读卡器发送非APDU指令

javax.smartcardio:如何将本机命令发送到 Desfire 卡?