2016-08-08 3 views
0

Сейчас я работаю с кард-ридером. Я хочу взять данные с карты. Я взял uid. Я хочу взять зашифрованные данные. Поэтому я хочу войти в безопасный режим и начать сеанс. Я что-то сделал. Я посылаю команду apdu, чтобы начать сеанс, но каждый раз возвращать неизвестное исключение 0x1f вот код.javax.smarcardio неизвестно исключение 0x1f

TerminalFactory factory = TerminalFactory.getDefault(); 

    List<CardTerminal> terminals = factory.terminals().list(); 

    terminal = terminals.get(0); 
    card = terminal.connect("T=1"); 
    CardChannel channel = card.getBasicChannel(); 
    byte[] c1 = { (byte) 0x80, (byte) 0x72, (byte) 0x80, (byte) 0x00, (byte) 0x18, (byte) 0x5c, (byte) 0xc5, 
      (byte) 0x0a, (byte) 0xa2, (byte) 0x5b, (byte) 0x38, (byte) 0x7f, (byte) 0x81, (byte) 0x3a, (byte) 0x3d, 
      (byte) 0x1a, (byte) 0x88, (byte) 0x7d, (byte) 0x26, (byte) 0xfc, (byte) 0x2b, (byte) 0xa8, (byte) 0xa7, 
      (byte) 0xdd, (byte) 0xdc, (byte) 0x71, (byte) 0xe0, (byte) 0xf3, (byte) 0xc6 }; 

    ResponseAPDU response = channel.transmit(new CommandAPDU(0xFF, 0x00,0x00,0x00,c1,5,24)); 

Этот код возвращает меня 6a81 (это означает, что функция не поддерживается),

если я отправить непосредственно команду начала сеанса (84 72 00 00) на этот раз возвращает неизвестное исключение.

Пожалуйста, помогите мне. Вам не нужно искать ошибку в коде. Скажите мне, как я могу начать сеанс на смарт-карте. Я использую HID OMNİKEY 5021 CL.

Exception in thread "main" javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: Unknown error 0x1f 
at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:219) 
at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:90) 
at CardReader.GetUID.getUID(GetUID.java:48) 
at CardReader.GetUID.main(GetUID.java:86) 
+0

К какой карте вы хотите получить доступ? Какой протокол говорит на карте? –

+0

Клеммы: [PC/SC-терминал OMNIKEY CardMan 5x21-CL 0] карта: PC/SC-карта в OMNIKEY CardMan 5x21-CL 0, протокол T = 1 –

+0

Я имел в виду бесконтактную смарт-карту/тег, а не терминал ... –

ответ

0

Я нашел проблему. Проблема заключается в типах байтов .net и java. C# byte между 0 и 255, но java-байтом типа -127 и +128. Поэтому, если я отправляю значение java выше 127, карта интерпретируется как минус-значение.

1

APDU вы отправляете неправильно, потому что вы используете CommandAPDU в неправильном пути.

new CommandAPDU(0xFF, 0x00,0x00,0x00,c1,5,24)

создает APDU начиная FF000000185CC50AA2..., который не то, что вы (вероятно) хотят.

Попробуйте new CommandAPDU(0x84, 0x72,0x00,0x00,c1,5,24) вместо этого.

См. CommandAPDU javadoc и APDU format description.