2016-08-08 14 views
0

Ich arbeite jetzt an einem Kartenleser. Ich möchte Daten von der Karte nehmen. Ich nahm Uid. Ich möchte verschlüsselte Daten aufnehmen. Also möchte ich in den sicheren Modus eintreten und die Sitzung starten. Ich habe etwas gemacht. Ich sende einen Befehl apdu, um die Sitzung zu starten, aber jedes Mal, wenn die unbekannte Ausnahme 0x1f zurückgegeben wird, ist der Code.javax.smarcardio unbekannte Ausnahme 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)); 

Dieser Code gibt mir 6a81 (es bedeutet Funktion nicht unterstützt),

wenn ich direkt Sitzungsstartbefehl senden (84 72 00 00) diesmal unbekannt Ausnahme zurückgibt.

Bitte helfen Sie mir. Sie müssen den Fehler im Code nicht finden. Wie kann ich die Sitzung auf einer Smart Card starten? Ich benutze 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

Auf welche Art von Karte möchten Sie zugreifen? In welchem ​​Protokoll spricht die Karte? –

+0

Terminals: [PC/SC-Terminal OMNIKEY CardMan 5x21-CL 0] Karte: PC/SC-Karte in OMNIKEY CardMan 5x21-CL 0, Protokoll T = 1 –

+0

Ich meinte die kontaktlose Smartcard/Tag, nicht die Klemme ... –

Antwort

0

Ich habe das Problem gefunden. Das Problem ist Byte-Typen .net und Java. C# -Byte-Typ zwischen 0 und 255, aber Java-Byte-Typ -127 und +128. Also, wenn ich einen Wert höher als 127 an Java sende, interpretiere Karte wie minus Wert.

1

APDU Sie senden ist falsch, weil Sie CommandAPDU in einer falschen Art und Weise verwenden.

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

schafft ein APDU FF000000185CC50AA2... Start, das ist nicht das, was Sie (wahrscheinlich) wollen.

Versuchen Sie new CommandAPDU(0x84, 0x72,0x00,0x00,c1,5,24) stattdessen.

Siehe CommandAPDU javadoc und APDU format description.

Verwandte Themen