Прежде всего, я все еще относительно новичок в работе со смарт-картами и не знаю точно, как хранятся данные и какие данные защищены на смарт-карте.
Я пытаюсь прочитать смарт-карту, удостоверяющую личность студента и защищенную PIN-кодом. Я программировал на C ++ с библиотекой смарт-карт Windows по умолчанию (winscard.lib).
Я успешно прочитал заголовок 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 };
Что может быть не так? Нужно ли сначала проверять карту, чтобы прочитать двоичный файл? Является ли функция чтения двоичных данных правильной для чтения основных данных, таких как идентификатор студента?
Без указания заявления студента на карточке, это длительный и скучный процесс.
Предполагая, что у вас есть файловая система на карте (в отличие от Java-карты), вам нужно знать, в каком файле хранятся пользовательские данные, чтобы вы могли ВЫБРАТЬ соответствующий файл перед выдачей ЧИТАЙТЕ БИНАРНЫЕ пр ЧИТАТЬ ЗАПИСЬ если это файл, ориентированный на запись. Вы можете попытаться найти правильный идентификатор файла методом проб и ошибок, но … Обратите внимание, что на смарт-картах условия доступа определяются с очень высокой степенью детализации, поэтому могут быть файлы, которые можно прочитать без какой-либо аутентификации, и с другой стороны, файлы могут быть доступны для чтения только после того, как будет установлен защищенный канал, который будет использоваться через защищенный обмен сообщениями (зашифрованные и MAC-Protected команды и / или ответы).
Я могу вспомнить две причины, по которым карта возвращает 6E00.
Текущее выбранное приложение — это менеджер карт или любой другой апплет, кроме того, который вы хотите использовать. Вы можете попытаться выполнить команду SELECT AID перед отправкой команды READ. Однако вы должны знать AID экземпляра апплета, который вы хотите выбрать для этого.
Файл, который вы пытаетесь прочитать, защищен безопасным обменом сообщениями, и ваша команда APDU должна быть зашифрована / MACd, что, например, изменит байт CLA на «0C». Тем не менее, вам нужно сначала установить безопасный канал, прежде чем вы сможете это сделать.
Как сказал @guidot, без спецификации это будет очень сложно.
Прежде всего, как заметил @guidot, это скучный процесс. Не только у вас есть полная информация о javacards, но также вы должны знать, как что-то вроде взлома смарт-карты, потому что у вас нет спецификации производителя карты и, возможно, они используют безопасность на своей карте, которую вы должны знать ключи.
Но для вашей информации, в соответствии с ISO 7816-4 0x6E00
означает «класс не поддерживается». Вы можете проверить полный список ответов APDU в Вот.
Байт класса (CLA) обычно 0x00
, 0xA0
, 0xC0
или же 0xF0
а иногда и маскируется 0x0C
Это означает, что на некоторых картах используется Безопасная передача сообщений.
Чтобы получить доступ к данным внутри брандмауэра апплета, вы должны выбрать, что апплет и апплет выбираются, когда JCRE (среда выполнения Java Card) получает выбранный APDU, данные которого соответствуют AID апплета.
И если есть установленный домен безопасности, то у вас должны быть эти ключи безопасности для успешного выбора апплета.
Чтобы получить список команд APDU, взаимодействующих с устройством чтения карт, проверьте эта ссылка.
Там много информации Вот о написании библиотеки смарт-карт на C ++, которая использует WinSCard.dll для связи с читателем.
Также эта ссылка о структуре файловой системы в Java-карте, которая будет полезна, если апплет хранит свои данные в файлах.
а также эта ссылка пример выбора файла в javacard
Если вы хотите пойти дальше через реализацию апплета Java-карты, Вотэто руководство о том, как реализовать апплет Java-карты.
Обратите внимание, что не забудьте прочитать самые важные существующие документы, такие как глобальная платформа и ISO 7816.
Как сказал Чух: в карте JAVA
1. Затем вы должны следовать выбору AID
2. так как вы читаете двоичный файл, выберите двоичный EF
2a). Так как вы используете P1 00, я надеюсь, что вы уже выбрали конкретный EF.
Примечание: даже если я чувствую, что ваша команда неверна для чтения двоичных данных в смарт-карте ISO 7816 / ISO 14443.
иначе как ISO 7816 4:
Считыватель двоичного файла должен быть:
CLA INS 00 BO
P1 — короткий идентификатор файла: MSB должен быть 1: ваш SID равен 3: он должен быть: 83
P2 — должен быть Offset / Start Byte: например: от 0 означает: 00, если он находится между 10: 0A
Le — должно быть Нет байтов, которые вы хотите прочитать: например, 20 байтов означает: 14
Таким образом, команда должна быть: 00 B0 83 14 0A: вот и все. Больше не нужно больше байтов для чтения двоичного файла. если вы уже выбрали EF-файл Insted из 83, вы можете указать 00:
Примечание. Это означает, что у вас нет условий безопасности. Если у вас есть условия безопасности, вы должны выполнить это, прежде чем читать это.