【问题标题】:How to read user data on smart card?如何读取智能卡上的用户数据?
【发布时间】:2015-02-24 00:13:33
【问题描述】:

首先,我在使用智能卡方面还是个新手,我不知道数据是如何存储的,以及智能卡上保护了哪些数据。

我正在尝试读取受 PIN 保护的学生身份智能卡。我一直在使用默认的 Windows 智能卡库 (winscard.lib) 使用 C++ 进行编程。

我已成功读取 ATR 标头,但据我所知,ATR 标头包含有关如何与阅读器通信的信息,而不是用户信息。

我尝试从卡中读取二进制文件,但 APDU 总是返回 6E 00,表示“不支持类”或“错误指令”。代码如下:

switch(dwProtocol)
    {
        case SCARD_PROTOCOL_T0:
        {   
            pioSendPci = *SCARD_PCI_T0;
            break;
        }
        case SCARD_PROTOCOL_T1:
        {
            pioSendPci = *SCARD_PCI_T1;
            break;
        }
        default:
        {
            printf("Detecting protocol failed!");
            printf("Press <ENTER> key to terminate!\n");
            nResponse = getchar();
            lRet = SCardReleaseContext(hContext);
            return -1;
        }
    }

    lRet = SCardTransmit(hCard,
                        &pioSendPci,
                        (LPCBYTE)&cmdRead,
                        sizeof(cmdRead),
                        NULL,
                        (LPBYTE)&recvbuffer,
                        &atrLen);

    printf("APDU return code:\n");
    printf("=================\n");
    for(i=0; i<2; i++)
    {
        printf("%02X ", recvbuffer[i]);
    }
    printf("\n");

    if(lRet!=SCARD_S_SUCCESS)
    {
        printf("Transmission failed! ErrorCode = 0x%08X\n",lRet);
        printf("Press <ENTER> key to terminate!\n");
        nResponse = getchar();
        lRet = SCardReleaseContext(hContext);
        return -1;
    }

其中 cmdRead 如下:

BYTE cmdRead[] = { 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0xFF };

可能出了什么问题?我需要先验证卡才能读取二进制文件吗?读取二进制权限函数是读取学生ID等基本数据吗?

【问题讨论】:

    标签: c++ smartcard javacard winscard


    【解决方案1】:

    如果没有在卡上指定学生申请,这是一个漫长而无聊的过程。 假设您在卡上有一个文件系统(而不是 java 卡),您需要知道用户数据存储在哪个文件中,以便在发布之前SELECT 适当的文件READ BINARY pr READ RECORD 如果它是面向记录的文件。您可以尝试通过反复试验找到正确的文件 ID,但是... 请注意,在智能卡上,访问条件的定义非常精细,因此可能存在无需任何身份验证即可读取的文件,并且另一种极端情况是,可能只有在建立安全通道后才能通过安全消息(加密和受 MAC 保护的命令和/或响应)使用的文件才能读取文件。

    【讨论】:

    • 感谢您的回复。确实我找不到任何规范,只有它使用 java 卡的简要信息。作为一个新手,我有很多问题,最重要的是,我可以用 C 编程还是需要 Java 才能读卡?任何其他指南都会非常有用。
    • @keso 您可以使用任何语言编写的程序与卡片对话,该程序能够处理winscard。不幸的是,javacard 不太喜欢这种情况,因为任何命令都可能意味着任何事情。至少您应该尝试 A0 类字节并等待 javacard 专家的答案。
    • 发送带有A0类字节的命令不会改变响应,它仍然是6E 00。我会尝试联系从事学生证项目的教授,看看他是否可以帮助我或者是否有一些规格。感谢您的帮助。
    • ID 卡有时是 ISO/IEC 7816-15 卡。您可以使用任何兼容 T=0/1 的阅读器进行访问。 PC/SC 是最常用的标准,winscard 只是实现。您还可以使用 javax.smartcardio 进行交谈,一旦您克服了将 APDU 发送到卡的障碍,这是一个非常易于使用的库。
    【解决方案2】:

    我能想到卡返回 6E00 的两个原因。

    1. 当前选择的应用程序是卡管理器或除您要使用的应用程序之外的任何其他小程序。您可以尝试在发送 READ 命令之前执行 SELECT AID 命令。但是,您应该知道要选择的小程序的实例 AID。

    2. 您尝试读取的文件受到安全消息的保护,并且您的 APDU 命令应该被加密/MACed,例如这会将 CLA 字节更改为“0C”。但是,您需要先建立一个安全通道,然后才能执行此操作。

    就像@guidot 所说,如果没有规范,这将非常困难。

    【讨论】:

      【解决方案3】:

      首先,正如@guidot 所说,这是一个无聊的过程。您不仅拥有有关 javacard 的完整信息,而且您应该知道如何破解智能卡之类的东西,因为您没有任何卡供应商规范,并且可能他们在卡上使用了您应该知道密钥的安全性。

      但请注意,根据 ISO 7816-4 0x6E00 表示“不支持类”。您可以在here 中查看 APDU 响应的完整列表。

      类 (CLA) 字节通常是 0x000xA00xC00xF0,有时用 0x0C 屏蔽,表示某些卡上的安全消息传递。

      要访问applet 防火墙内的数据,您应该选择applet,并且当JCRE(Java Card Runtime Environment)接收到其数据与applet 的AID 匹配的选择APDU 时发生applet 选择。 如果安装了安全域,那么您应该拥有这些安全密钥才能成功选择小程序。

      要获得与读卡器通信的 APDU 命令列表,请检查this link

      有很多关于用 C++ 编写智能卡库的信息here,它使用 WinSCard.dll 与读卡器通信。

      另外,this link 是关于 java 卡中的文件系统结构,如果小程序将其数据存储在文件中,这将很有用。

      this link 是在 javacard 中选择文件的示例。

      如果您想进一步了解 java 卡小程序的实现,here 是关于如何实现 java 卡小程序的指南。 请注意,不要忘记阅读最重要的现有文档,例如全球平台和 ISO 7816。

      【讨论】:

        【解决方案4】:

        正如 Chooch 所说:在 JAVA 卡中, 1.你应该按照AID选择然后 2. 因为你是阅读器 Binary file ,所以选择 binary EF 2a).由于您使用的是 P1 00,我希望您已经选择了特定的 EF。 注意:即使我觉得你的命令在 ISO 7816/ISO 14443 智能卡中读取二进制数据是错误的。

        否则为 ISO 7816 4:

        阅读器二进制应该是: CLA INS 00 博 P1 - 短文件 ID:MSB 应该是 1:你的 SID 是 3:应该是:83 P2 - 应该是偏移量/起始字节:例如:从 0 表示:00 如果它在 10 之间:0A Le - 应该是您要读取的字节数:例如 20 个字节表示:14

        所以命令应该是:00 B0 83 14 0A:就是这样。无需更多字节即可读取二进制文件。如果您已经选择了 83 的 EF 文件 Insted,您可以给出 00: 注意:这是考虑到您没有安全条件。如果您有安全条件,您必须在阅读本文之前满足该条件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 2016-04-24
          • 2017-06-23
          相关资源
          最近更新 更多