如何使用Python验证智能卡的PIN码?

时间:2017-03-24 07:56:25

标签: python smartcard apdu pyscard

我需要您的帮助才能验证智能卡的PIN码。我正在使用Pythonpyscard。 我知道我必须使用APDU命令,我必须使用ScardTransmit()发送它,但我找不到要使用的APDU。例如:

SCardTransmit(hcard,dwActiveProtocol, 
              [0x00, 0x20, 0x00, 0x01, 0x06, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x00])

(所以PIN = 123456)将仅仅返回      6A 88 - 未找到参考数据

我想知道:有没有办法获得一些关于commands使用特定智能卡查看其ATR的提示?即:命令" 20"在INS领域(APDU由CLA,INS P1,P2,DATA组成)是ISO定义的用于验证PIN的,但如何理解我是否做错了什么?

感谢。

P.S。:顺便说一句,P2 =" 00"我得到 6A 83 ,记录未找到。

3 个答案:

答案 0 :(得分:1)

这可能有助于...当涉及到GSM卡时,我们总是使用8字节的数据长度,即 VERIFY_CHV = [0xA0,0x20,0x00,0x01, 0x08 ]

随后的PIN数据用0xFF填充,具体取决于实际的引脚长度。 即如果pin = 123456则LJUST_PIN_HEX = [0x31,0x32,0x33,0x34,0x35,0x36,0xFF,0xFF]

APDU将是VERIFY_CHV + LJUST_PIN_HEX

答案 1 :(得分:0)

您的APDU是正确的IFF您的智能卡应用程序(您事先选择的DF)有一个ID为1的PIN(您在P2中给出的)。您可以设置最高位以告诉命令在MF中搜索PIN 1。

答案 2 :(得分:0)

存在哪些PIN(也可能根本不存在),并且在具有文件系统的卡的情况下,其中所居住的DF由卡的个性化定义。没有进一步的细节,答案必须非常一般,例如尝试不同的P2值(最高0x1F)。

另一方面,只要PIN已经过验证,如果没有有关卡个性化的详细信息,您就不可能取得进一步进展,因此可能现在就开始这样做了。