我目前正在使用PIDION BIP-1300,有谁有如何检索智能卡芯片的值的示例吗?
我使用的是C#和BB_EMV.dll...我找不到任何文件...
这就是我正在使用的东西:
EMV emv = new EMV();
byte[] DE_5A;
DE_5A = emv.GetData("DE_5A");我收到的只是一个满是零的字节数组。
提前感谢!
发布于 2012-06-15 06:34:29
好吧,我不知道BB_EMV是什么,也从来没有听说过它,但是从智能卡中读取EMV数据并不容易,我现在就告诉你。
首先,您需要一个良好的托管库,它允许您对有问题的卡进行APDU级别的访问,我使用这个库:http://www.smartcard-api.com/index.shtml。
一旦你有了它,就像添加任何其他托管库一样添加对它的引用,该工具包中有示例,所以我不会详细介绍它,让你自己的代码运行起来并不困难。
我有代码,但它是我为之编写的客户的版权,所以我不能给你。
一旦你可以开始向卡发送命令,如果是支持标准EMV结构的卡,你要做的第一件事就是选择PSE,通常有两种方法可以做到这一点。
1)使用AID选择
从您准备接受的AID (应用程序ID)列表中,向该卡发送以下命令:
0x00、0xA4、0x04、0x00
后面跟着你想要选择的AID,对于签证借记,这通常是
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进行add运算的第一个字节大于31 (即设置了第6位或第7位),则有一个16位标记,在这种情况下,您需要将刚接收到的字节左移8位,然后添加序列中的下一个字节。
就像wise的下一个字节,如果将它与128进行and运算得到128,那么你就有一个介于1到15位之间的2字节长度,一旦你有了标签和长度,剩下的下一个字节就是有效载荷。
该有效负载可以嵌套,事实上,您很可能会在TLV结构中找到TLV结构,因此需要编写一个好的递归解析器。
在解析来自GPO对象的数据后,您可以使用它来查找实际的卡数据,这是您开始阅读PAN和track2等效数据的地方。请注意,虽然有标准,但并不是所有的标准都是100%相同的。大多数卡都有一个自定义数据区,还请注意,PIN和CVV号码不能直接从卡中获得,相反,您将发现在大多数情况下会有一个加密的PIN或CVV块,这被设计为与卡的适当证书一起发送回发行商,然后发行商将报告输入的pin是否正确。
一些卡可以进行离线PIN验证但是,wolfgang站点提供了大量关于可用的各种标准函数和数据调用的信息,主要是在GSM SIM卡上,但他也涵盖了EMV。您可以在此处找到他的站点:
http://www.wrankl.de/
这个主题比我在这里描述的要多得多,这只是冰山一角,但是自从你6个多月前发布了这篇文章以来,我猜你现在可能已经自己取得了一些进展,如果没有的话,我希望这篇文章能有所帮助。
https://stackoverflow.com/questions/7883215
复制相似问题