1

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

我正在尝试读取受 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 等基本数据?

4

4 回答 4

2

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

于 2014-12-27T12:40:43.700 回答
0

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

否则为 ISO 7816 4:

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

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

于 2015-02-17T16:55:19.927 回答
0

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

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

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

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

于 2014-12-29T01:32:53.593 回答
0

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

但供您参考,根据 ISO 7816-40x6E00意味着“不支持的类”。您可以在此处查看 APDU 响应的完整列表。

类 (CLA) 字节通常是、0x00或有时用表示某些卡上的安全消息的掩码。0xA00xC00xF00x0C

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

要获得与读卡器通信的 APDU 命令列表,请查看此链接

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

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

此链接是在 javacard中选择文件的示例。

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

于 2014-12-29T05:16:42.633 回答