【发布时间】: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 字节的挑战。但是,它对我不起作用。
标签: windows nfc win-universal-app smartcard apdu