简体   繁体   中英

javax.smartcardio read all smart card

I have to read the primary account number (PAN) of MASTERCARD, VISA, VISA ELECTRON etc. I worte this code but it doesn't work someone can help me?

import java.util.List;

import javax.smartcardio.ATR;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;


public class LetturaSmartCard {
    public static void main(String[] args) throws CardException {

        // stampo lista lettori 
        TerminalFactory factory = TerminalFactory.getDefault();
        List<CardTerminal> terminals = factory.terminals().list();
        System.out.println("Lista lettori smart card collegati: " + terminals);

        // prendo il primo lettore
        CardTerminal terminal = terminals.get(0);

        System.out.println("Lettore utilizzato: " + terminal);
        //stabilisco connessione con la carta

        Card card = terminal.connect("*");
        // System.out.println(card.getProtocol());
        System.out.println("\n\nCarta inserita: " + card);
        CardChannel channel = card.getBasicChannel();


        ATR atr = card.getATR();
        byte[] ATR = atr.getBytes();
        byte[] TuttaCarta;
        System.out.println("ATR della carta: " + LetturaSmartCard.bytesToHex(ATR));


        //------------------------------------lettura---------------------------

        byte[] selectVpay = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x20, (byte) 0x20, (byte) 0x00};
        byte[] selectMastercard = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x10, (byte) 0x10, (byte) 0x00};
        byte[] selectVisaElectron = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0x20, (byte) 0x10, (byte) 0x00};
        byte[] bo = {(byte) 0x00, (byte) 0xB2, (byte) 0x00, (byte) 0x03, (byte) 0x60};
        byte[] selectMaestro = {(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x30, (byte) 0x60, (byte) 0x00};
        byte[] getProcessingOptions = {(byte) 0x80, (byte) 0xA8, (byte) 0x00, (byte) 0x00, (byte) 0x02, (byte) 0x83, (byte) 0x00, (byte) 0x00};
        byte[] readRecord = {(byte) 0x00, (byte) 0xB2, (byte) 0x01, (byte) 0x0C, (byte) 0x00};
        byte[] lettura = {(byte) 0x00, (byte) 0xB0, (byte) 0x60, (byte) 0x10, (byte) 0x00};
        ResponseAPDU r = null;


        CommandAPDU capdu = new CommandAPDU(selectMastercard);
        r = card.getBasicChannel().transmit(capdu);
        TuttaCarta = r.getBytes();
        System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));

        capdu = new CommandAPDU(getProcessingOptions);
        r = card.getBasicChannel().transmit(capdu);
        TuttaCarta = r.getBytes();
        System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));


        capdu = new CommandAPDU(readRecord);
        r = card.getBasicChannel().transmit(capdu);
        TuttaCarta = r.getBytes();
        System.out.println(LetturaSmartCard.bytesToHex(TuttaCarta));


        //----------------------------------------------------------------------


        // disconnect
        card.disconnect(false);


    }

    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            sb.append(String.format("%02x", bytes[i]));
        }

        return sb.toString();
    }

}

I don't know why it doesn't work my answers are

Lista lettori smart card collegati: [PC/SC terminal OMNIKEY CardMan 3x21 0]
Lettore utilizzato: PC/SC terminal OMNIKEY CardMan 3x21 0

Carta inserita: PC/SC card in OMNIKEY CardMan 3x21 0, protocol T=0, state OK
ATR della carta: 3b6800000073c84013009000
6f2d8407a0000000041010a522500a4d4153544552434152448701015f2d086974656e66726573bf0c059f4d020b0a9000
771282023900940c1002030118010200180404009000
**6985**

6985 is an error that I receive when I would expect the PAN. What am I doing wrong?

This error means that there is no such record on the card. With your READ RECORD command

00 B2 01 0C 00

you are trying to read record 1 of the file with the SFI 1. However, the Application File Locator you received in response to the GET PROCESSING OPTIONS command clearly states that only the following records are available on the card:

10 02 03 01: records 2 and 3 in the file with SFI 2
18 01 02 00: records 1 and 2 in the file with SFI 3
18 04 04 00: record 4 in the file with SFI 3

So you can't expect a record 1 in a file with SFI 1 to be present on the card. For that card, you can typically expect to find the PAN in SFI 2 record 2:

00 B2 02 14 00

Also note that the statically coded GPO command you are using will only work for card's with an empty PDOL.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM