如何使用 pyscard 列出智能卡上的文件

Posted

技术标签:

【中文标题】如何使用 pyscard 列出智能卡上的文件【英文标题】:Howto list files on a smartcard with pyscard 【发布时间】:2015-02-12 08:02:01 【问题描述】:

我必须从智能卡中读出一个文件。该卡由监控车辆运动的数字行驶记录仪写入。我可以使用 psycard (http://pyscard.sourceforge.net/user-guide.html) 连接到智能卡读卡器,但是我不知道如何列出卡上的文件以及如何下载它们。我正在挖掘 ISO 标准,看起来我必须使用 ISO/IEC 7816 标准和专用文件 (http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx),但我不知道如何从 pyscard 中做到这一点?

已经有一些程序(例如:http://en.tachoterminal.net/products/tachoterminal-reader/)做同样的事情,但它们是独立的程序。我需要将此功能集成到另一个软件中。

我不知道要使用哪种协议。有人可以帮帮我吗?

【问题讨论】:

智能卡不是 USB 记忆棒。找出哪些文件存在的命令可能存在或不存在(Michaels 链接应该为您提供不需要该命令所需的所有知识),downloading 在智能卡环境中是一个相当不典型的概念。也许您可以阅读一些文件,然后逐步进行,但如果这只是一小部分,请不要感到惊讶。 我并不怀疑文件的存在,但想指出,除了单纯的技术知识,文件如何读出之外,可能还需要额外的知识(例如密钥或身份验证证书)原则。存在能够读取某些内容(正如您提到的)的程序并不意味着每个人都可以读取相同的内容。 【参考方案1】:

在此答案中,我假设您指的是根据 ECC 法规 No 3821/85 的行驶记录仪驱动程序卡。在这种情况下,智能卡使用 ISO/IEC 7816-4 APDU 进行通信并公开基于 ISO/IEC 7816-4 的文件结构是正确的。

一旦您使用 pyscard 打开与卡的连接,您就可以在该连接对象上调用 transmit() 方法来收发 APDU(另请参阅 Ludovic Rousseau's blog:

connection = reader.createConnection()
connection.connect()
data, sw1, sw2 = connection.transmit(cmd)

与行驶记录仪驱动卡的通信流程如下:

    选择行驶记录仪应用程序

    00 A4 04 0C 06 FF544143484F
    

    对于此命令,cmd 将是:

    cmd = [ 0x00, 0xA4, 0x04, 0x0C, 0x06, 0xFF, 0x54, 0x41, 0x43, 0x48, 0x4F ]
    

    按文件标识符选择基本文件 (xxxx)

    00 A4 02 0C 02 xxxx
    

    READ BINARY 以获取文件数据(zz 偏移量 xxyy 的字节)

    00 B0 xx yy zz
    

您可以在法规文档 (here) 中找到驱动卡协议和数据结构的完整规范。

【讨论】:

选择基本文件 wit file id= EF_ICC = [0x00,0x02 ] 给了我 sw1=0x6A, sw2=0x86 的意思:“找不到文件标识符”。我怀疑该卡已损坏,因此我打算明天用另一张卡尝试一下。 请注意,EF_ICC 在主文件下方(而不是在行驶记录仪应用程序 DF 下方)。因此,您需要先选择主文件(或至少选择行驶记录仪应用程序 DF)。 在我回答的第 (2) 步中,您可以尝试选择 EF_Application_Identification ([ 0x05, 0x01])。 我的错。这是一个错字。我已经设法打开和读取文件。您是否有一些文档显示如何将这些保存到 ddd 文件中?无论如何。

以上是关于如何使用 pyscard 列出智能卡上的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何检索基本的智能卡信息

如何在 Web 浏览器上使用智能卡

如何从 HID omnikey 获取智能卡的 TAR

如何使智能感知将当前源文件视为独立的翻译单元

如何在分页和使用 order by 时列出 Google Drive API v3 上的所有根文件夹和共享?

如何列出 NTFS 文件系统上的所有符号链接