2014-05-02 98 views
2

我必須閱讀MASTERCARD,VISA,VISA ELECTRON等的主帳號(PAN)。我運行此代碼,但它不起作用,有人可以幫助我?javax.smartcardio讀取所有智能卡

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(); 
    } 

} 

我不知道爲什麼它不工作,我的答案是

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是我收到的時候我會想到PAN錯誤。 我在做什麼錯?

回答

1

此錯誤表示卡上沒有此類記錄。隨着你讀記錄命令

00 B2 01 0C 00 

你試圖讀取該文件的記錄1與SFI 1。但是,你響應GET PROCESSING OPTIONS命令顯然收到申請文件定位器指出,只有以下記錄在卡上可用:

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 

所以你不能期望在SFI 1的文件中出現記錄1出現在卡上。該卡,通常可以期望找到在SFI 2記錄2 PAN:

00 B2 02 14 00 

另外請注意,您使用的是靜態編碼GPO命令將只對卡的使用空PDOL工作。