我目前正在使用 PIDION BIP-1300,有没有人有如何检索智能卡芯片值的示例?
我正在使用 C# 和 BB_EMV.dll...我找不到任何文档...
这就是我正在使用的东西:
EMV emv = new EMV();
byte[] DE_5A;
DE_5A = emv.GetData("DE_5A");
我收到的只是一个充满零的字节数组。
提前致谢!
好的,我不知道 BB_EMV 是什么,也没有听说过,但是从智能卡读取 EMV 数据并不容易,我现在告诉你。
首先,您需要一个好的托管库,它可以让您对相关卡进行 APDU 级访问,我使用这个:http ://www.smartcard-api.com/index.shtml
一旦你有了它,就像添加任何其他托管库一样添加对它的引用,套件中有示例,所以我不打算详细介绍使用它,让你自己的代码运行并不难。
我有代码,但它是我为其编写的客户的版权,所以我不能给你。
一旦您可以开始向卡发送命令,并且如果它是支持标准 EMV 结构的卡,您要做的第一件事就是选择 PSE,通常有两种方法可以做到这一点。
1) 使用 AID 选择
从您准备接受的 AID(应用程序 ID)列表中,将以下命令发送到卡:
0x00, 0xA4, 0x04, 0x00
在此之后输入您要选择的 AID,对于 VISA 借记卡,这通常是
0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10
这遵循上面的 APDU 数据作为数据块,后跟 0x07(数据长度)
你应该得到的是要么
0x9000 或 0x6100(如果你得到一个 61 代码,这意味着你必须用修改过的参数重做请求,超出了我在这里写的范围)
如果您在 SW1 和 SW2(卡寄存器)中获得 0x9000,则您已成功选择该 AID 并准备对其进行 EMV 调用。
2)使用DDF名称选择所需的支付应用程序,基本上你使用标准的卡选择命令选择“1PAY.SYS.DDF01”如果它是接触式芯片和引脚或“2PAY.SYS.DDF02”如果它是非接触式的称为使用 PPSE 进行选择。
选择支付应用程序后,您需要从卡中读取处理选项,这将告诉您一些有关可用内容和查找位置的信息。
这是通过发出如下所示的读取 GPO 命令来完成的:
0x80, 0xA8, 0x00, 0x00, 0x83, 0x00
这将返回一个 TLV 结构,您必须对其进行解析以获取详细信息。
TLV是一个很简单的概念,你的数据流分为3组a
标签
长度
和
价值
因此 TLV,
TLV 标签的长度可以在 1 到 3 个字节之间变化,但通常不会超过 2 个字节。如果与 0x1F 相加的第一个字节大于 31,(即设置了第 6 位或第 7 位),那么您有一个 16 位标签,在这种情况下,您需要将刚收到的字节左移 8 位,然后添加序列中的下一个字节。
与下一个字节一样,如果将它乘以 128 给你 128,那么你有一个介于 1 和 15 位之间的 2 个字节长度,一旦你有了 TAG 和 Length,下一个长度剩余的字节就是有效负载。
该有效负载可以嵌套,实际上您很可能会在 TLV 结构中找到 TLV 结构,因此需要编写一个好的递归解析器。
从 GPO 对象解析数据后,您可以使用它来查找实际的卡数据,这是您开始读取 PAN 和 track2 等效数据之类的地方,但请注意,虽然有标准,但没有它们都是 100% 相同的。大多数卡都有一个自定义数据区域,还请注意,PIN 和 CVV 号码不能直接从卡中获得,相反,您会发现在大多数情况下会有一个加密的 PIN 或 CVV 块,这旨在发送到与卡中的相应证书一起发回,然后发卡行将报告输入的密码是否正确。
有些卡可以进行离线 PIN 验证,但是 wolfgang rankels 网站上充满了一些可用的各种标准功能和数据通话的重要信息,主要是在 GSM Sim 卡上,但他也涵盖了 EMV,你可以在这里找到他的网站:
这个主题比我在这里描述的要多得多,这只是冰山一角,但是自从您在 6 个多月前发布此内容以来,我猜您现在可能已经自己取得了一些进展,如果没有,那么我希望这会有所帮助。