2008-11-12 15 views
9

से ईएमवी स्मार्टकार्ड से पैन कैसे पढ़ूं, मुझे स्मार्ट कार्ड रीडर के साथ मेस्ट्रो/मास्टरकार्ड से खाता संख्या पढ़ने की आवश्यकता है। मैं जावा 1.6 और इसका javax.smartcardio पैकेज का उपयोग कर रहा हूं। मुझे एपीडीयू कमांड भेजना होगा जो पैन नंबर के लिए कार्ड के चिप पर संग्रहीत ईएमवी एप्लीकेशन से पूछेगा। समस्या यह है कि, मुझे एपीडीयू कमांड बनाने के लिए नियमित बाइट सरणी नहीं मिल सकती है जो कहीं भी आवश्यक डेटा वापस कर देगा ...मैं जावा

उत्तर

6

आप APDU रैप करने के लिए आगे की जरूरत नहीं होनी चाहिए। एपीआई परत का ख्याल रखना चाहिए।

ऐसा लगता है कि 0x6D00 प्रतिक्रिया का मतलब है कि एप्लिकेशन आईएनएस का समर्थन नहीं करता था।

अभी समस्या निवारण, लेकिन आपने मास्टरकार्ड एप्लिकेशन का चयन करके शुरू किया, है ना?

आईई। कुछ इस तरह:

void selectApplication(CardChannel channel) throws CardException { 
    byte[] masterCardRid = new byte[]{0xA0, 0x00, 0x00, 0x00, 0x04}; 
    CommandAPDU command = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, masterCardRid); 
    ResponseAPDU response = channel.transmit(command); 
    return response.getData(); 
} 
+0

मुझे आपका जवाब बिल्कुल समझ में नहीं आया है। मेरी प्रतिक्रिया हमेशा 0x6D00 मारा। अगर मेरा कार्ड आईएनएस का समर्थन नहीं करता है तो मुझे क्या करना चाहिए जैसा आपने कहा था? – HelmiB

0

आपको कमांडएपीयू ऑब्जेक्ट बनाने और ट्रांसमिट() - कमांड को पास करने की आवश्यकता है।

byte[] readFile(CardChannel channel) throws CardException { 
    CommandAPDU command = new CommandAPDU(0xB0, 0x60, 0x10, 0x00); 
    ResponseAPDU response = channel.transmit(command); 
    return response.getData(); 
} 
0

आप अपने प्रलेखन क्या 0x6D00 का मतलब है में देखने का प्रयास करें थाः

आप अपने स्मार्ट कार्ड के लिए दस्तावेज में सटीक आदेश को खोजने के लिए सक्षम होना चाहिए, लेकिन यहाँ एक उदाहरण है? ऐसा लगता है कि इसका मतलब यह हो सकता है कि ENVELOPE आदेश समर्थित नहीं है। क्या आपने टी = 1 के बजाय टी = 0 प्रोटोकॉल का उपयोग करने की कोशिश की है?

मैं अपने उदाहरण पर अपने उदाहरण पर काम करने की अपेक्षा नहीं करता। मुझे नहीं पता कि मेस्ट्रो/मास्टरकार्ड-समर्थन कौन सा एपीडीयू है, इसलिए मैं आपको एक कामकाजी उदाहरण नहीं दे सका।

इस तरह आदेश एक स्पष्ट उम्मीद लंबाई देने का प्रयास करें:

byte[] readPan(CardChannel channel) throws CardException { 
    CommandAPDU command = new CommandAPDU(0x00, 0xB2, 0x5a, 0x14, 250); 
    ResponseAPDU response = channel.transmit(command); 
    return response.getData(); 
} 
3
यहाँ

कुछ काम कर उदाहरण है:

CardChannel channel = card.getBasicChannel(); 

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)0x02,(byte)0x0C,(byte)0x00}; 

    ResponseAPDU r=null; 

    try { 
    ATR atr = card.getATR(); //reset kartice 

     CommandAPDU capdu=new CommandAPDU(selectMaestro ); 

     r=card.getBasicChannel().transmit(capdu); 

     capdu=new CommandAPDU(getProcessingOptions); 
     r=card.getBasicChannel().transmit(capdu); 


     capdu=new CommandAPDU(readRecord); 
     r=card.getBasicChannel().transmit(capdu); 

इस उस्ताद कार्ड के साथ काम करता है, मैं पैन नंबर पढ़ सकते हैं, अभी तक अब मैं मास्टर कार्ड का पैन नंबर पढ़ने की जरूरत है। मुझे नहीं पता कि मैं पढ़ा रिकॉर्ड एपीडीयू बदल सकता हूं या एप्लिकेशन एपीडीयू का चयन करूँगा। एपीडीयू से परिचित कोई भी?

+0

यह चुनिंदा एप्लिकेशन कमांड है जिसे आपको बदलने की आवश्यकता है। उस आदेश का अंतिम भाग उस एप्लिकेशन का एआईडी है जिसे आप चुनना चाहते हैं। मास्टरकार्ड एआईडी में बदलना काम करना चाहिए। या आप एआईडी को छोटा करना चाहते हैं। यदि आप A400000004 की आपूर्ति करते हैं, ... –

+0

... यह A400000004 से शुरू होने वाले सभी एड्स से मेल खाना चाहिए। –

1
atr = open(); 
prints(atr); 

prints("[Step 1] Select 1PAY.SYS.DDF01 to get the PSE directory"); 
cmd = new ISOSelect(ISOSelect.SELECT_AID, EMV4_1.AID_1PAY_SYS_DDF01); 
card_response = execute(cmd); 
prints(card_response); 
SFI = NumUtil.hex2String((byte)((1 < < 3) | 4)); 

// try SFI 1 record 1 
prints("[Step 2] Send READ RECORD with 0 to find out where the record is"); 
read = new EMVReadRecord(SFI, "01", "00"); 
card_response = execute(read); 
prints(card_response); 
byte_size = NumUtil.hex2String(card_response.getStatusWord().getSw2()); 

prints("[Step 3] Send READ RECORD with 1C to get the PSE data"); 
read = new EMVReadRecord(SFI, "01", byte_size); 
card_response = execute(read); 
prints(card_response); 
// the AID is A0000000031010 
prints("[Step 4] Now that we know the AID, select the application"); 

cmd = new ISOSelect(ISOSelect.SELECT_AID, "A0000000031010"); 
card_response = execute(cmd); 
prints(card_response); 
prints("[Step 5] Send GET PROCESSING OPTIONS command"); 

cmd = new EMVGetProcessingOptions(); 
card_response = execute(cmd); 
prints(card_response); 

// SFI for the first group of AFL is 0C 

prints("[Step 6] Send READ RECORD with 0 to find out where the record is"); 
read = new EMVReadRecord("0C", "01", "00"); 
card_response = execute(read); 
prints(card_response); 
byte_size = NumUtil.hex2String(card_response.getStatusWord().getSw2()); 

prints("[Step 7] Use READ RECORD with the given number of bytes to retrieve the data"); 
read = new EMVReadRecord("0C", "01", byte_size); 
card_response = execute(read); 
prints(card_response); 

data = new TLV(card_response.getData()); 

close(); 
+0

हाय ग्रांडी, क्या आप यहां टीएलवी कक्षा जोड़ सकते हैं – KCN

-2

क्या एक (आमतौर पर) 16 अंकों अनुक्रम के लिए खोज एक स्कैनर का उपयोग कर, कार्ड की एक तस्वीर हो रही, एक अच्छा जावा ओसीआर पुस्तकालय (जैसे उदाहरण के लिए http://ocr4j.sourceforge.net/) के साथ चित्र की सामग्री को स्कैन और के बारे में xxxx- XXXX-XXXX-XXXX, तो आपको जावा का उपयोग करके किसी भी ईएमवी कार्ड से पैन मिलेगा।

संबंधित मुद्दे