我正在使用Java智能卡API进行访问。 我有恩智浦Mifare desfire 4K,1K,超亮智能卡与我和我试图在JAVA中以编程方式找出它的类型。
我参考了恩智浦网站(http://www.nxp.com/documents/application_note/AN10833.pdf)的文件AN10833。 我有以下相关问题:
答案 0 :(得分:4)
答案 1 :(得分:1)
编辑:抱歉,这不能直接回答问题,但目前的最佳答案可能有害。我正试图发现如何让SAK自己尝试在我做的时候发布更新。
从ATS / ATR确定卡片类型很常见,但错误。恩智浦建议使用SAK。
“由于可以定制不同MIFARE IC的ATS,它是 当然不建议依靠ATS来区分IC 类型“
参考:http://www.nxp.com/documents/application_note/AN10833.pdf
相反,请查看有关如何从SAK确定卡类型的详细树: http://www.nxp.com/documents/application_note/130830.pdf
顺便说一下,在制作中,如果你可以放心,你的所有卡上都会得到相同格式的ATR / ATS,这可能是一个可行的选择。但这并不能保证。
我不知道世界上VCA是什么,但是从第一份文件中可以看出:
“将来,恩智浦建议使用”虚拟卡架构(VCA)“ 用于PICC选择和类型识别。如果安装没有 取决于卡的ATQA,SAK和/或ATS的实际内容 选择和识别,这允许多个MIFARE 产品在同一个设备中启用激活 时间。在这种情况下,VCA允许高效和隐私友好 选择目标MIFARE产品。这在a中描述 单独的申请说明。“
答案 2 :(得分:1)
我知道这是一个旧博客,但我一直在研究同一个问题,并想分享我的发现。
在AN10833中,它明确指出执行选择时返回UID + SAK。使用java智能卡io库我可以执行如下选择:
// Send pseudo APDU to retrieve the card serial number (UID)
int cla = 0xFF;
int ins = 0xCA;
int p1 = 0x00;
int p2 = 0x00;
byte[] data = null;
int dataOffset = 0x00;
int dataLength = 0x00;
int le = 0x00;
CommandAPDU getDataApdu = new CommandAPDU(cla, ins, p1, p2, data, dataOffset, dataLength, le);
ResponseAPDU r1 = channel.transmit(getDataApdu);
但是,我只返回了UID。我在PC / SC API上找到了更改P1 = 0x01的文档,它将更改对历史字节的响应(这对我有用)。
(从这里开始的第3.2.2.1.3节:http://pcscworkgroup.com/Download/Specifications/pcsc3_v2.01.09.pdf)
不幸的是,对于我有权访问的现成读者,我找不到返回SAK的参数。在另一个阅读器的API文档中,我发现如果p2 = 0x01,则返回ATQA + UID + SAK(此阅读器是支持性的,我无法共享该文档)。
我相信如果您的读者支持它(或者您的编码水平足以控制读者本身),您可以获得/请求确切的SAK。否则,您可能需要使用ATS / ATR来确定卡类型。
注意,在Java中,这里是获取ATS / ATR的代码:
// wait 10 seconds for a card
CardTerminal terminal = terminal.waitForCardPresent(10000);
Card card = terminal.connect("*");
ATR atr = card.getATR();
从那里,ATR可以像上面提到的vikky一样进行处理。
我会回答我学到的任何其他事情。