首先,我在使用智能卡方面还是个新手,我不知道数据是如何存储的,哪些数据在智能卡上受到保护。
我正在尝试读取受 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 等基本数据?