Чтение данных PACS (raw Wiegand) с помощью Omnikey 5022

Я занимаюсь разработкой Java-приложения, которое подключается к кард-ридеру HID Omnikey 5022. Что мне нужно, так это чтение битов PACS (необработанных данных Виганда).

У меня точно такая же проблема с этим вопросом, я также вижу данные с помощью приложения PACS Probe:

Как читать данные смарт-карты

К сожалению, предоставленный ответ на это не работает для меня.

Вот что я получаю от PACS Probe:

  • Считыватель карт: HID Global OMNIKEY 5022 Считыватель смарт-карт 0
  • Тип карты: PicoPass 32KS (8x2 + 16)
  • Серийный номер карты (CSN, UID): 32966202F8FF12E0 (шестнадцатеричный)
  • Данные битов PACS (необработанный Виганд): 000000310BC53938 (шестнадцатеричный)

Я уже попробовал команду, которую нашел в руководстве Omnikey 5023, неожиданно она возвращает некоторые данные, но это не то, что мне нужно.

Эта команда:

commandAPDU = new CommandAPDU(new byte[] { (byte) 0xFF, (byte) 0x70, (byte) 0x07, (byte) 0x6B, (byte) 0x07,
                (byte) 0xA0, (byte) 0x05, (byte) 0xBE, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04, (byte) 0x00 }); // Read PACS 5023

Это возвращает это:

9E020003
// Мне нужно 000000310BC53938

Любая помощь приветствуется, так как я новичок в разработке смарт-карт. Заранее спасибо.

1 ответ

APDU ответа, который вы получаете от читателя, является кодом ошибки для неподдерживаемой проприетарной команды.

Вам понадобится безопасный сеанс для доступа к битовым данным PACS с использованием считывателей OMNIKEY 5022 или OMNIKEY 5023.

Если у вас нет соответствующей документации для этого считывателя, я бы, вероятно, придерживался серийного номера карты (UID, CSN) и использовал бы оболочку Java для ПК /SC (или pcsclite) для подключения к считывателю и карте.

Затем выполните команду (через SCardTransmit(FFCA0000 APDU), чтобы получить UID (32966202F8FF12E0), показанный в примере вывода с https://pacsprobe.com/.

Что касается Java: используйте smartcardio lib. Это хорошая обертка для родного ПК / SC

Много работы по переносу протоколов безопасного канала на Java. Вызов сторонней библиотеки может быть проще.

Я смог использовать javax.smartcardio и получить данные Wiegand, используя код, как показано ниже. В конце вы можете увидеть, что напечатаны код объекта и номер карты.

TerminalFactory terminalFactory = TerminalFactory.getDefault();

CardTerminals cardTerminals = terminalFactory.terminals();

List<CardTerminal> terminalList = cardTerminals.list();

CardTerminal cardTerminal = terminalList.get(0);
cardTerminal.waitForCardPresent(10 * 1000); // wait 10 seconds
Card card = cardTerminal.connect("*");
System.out.println("Card: " + card);
CardChannel channel = card.getBasicChannel();

byte[] aid = { (byte) 0xA0, (byte) 0x05, (byte) 0xA1, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04 };
CommandAPDU apdu = new CommandAPDU(0xFF, (byte) 112, (byte) 7, (byte) 107, aid, 256);
ResponseAPDU r = channel.transmit(apdu);
byte[] bytesOut = r.getBytes();

int num1 = (int) bytesOut[3];
if (bytesOut.length - 6 != num1)
System.out.println("problem");

int numberOfBitsShifted = (int) bytesOut[4];
int num2 = num1 - 1;

byte[] newBytesArr = Arrays.copyOfRange(bytesOut, 5, 5 + num2);
if (newBytesArr.length != num2)
    System.out.println("problem");

ByteBuffer wrapped = ByteBuffer.wrap(newBytesArr);
int num = wrapped.getInt();
int first26 = num >> 6;
int withoutParity = first26 >> 1;

int cardNumber = withoutParity & 0xffff;
int facilityCode = (withoutParity >> 16) & 0xff;

System.out.println(facilityCode);
System.out.println(cardNumber);

Другие вопросы по тегам