سؤال

ولست بحاجة لقراءة رقم الحساب من المايسترو / ماستركارد مع قارئ البطاقة الذكية. أنا باستخدام جافا 1.6 وحزمتها javax.smartcardio. أنا في حاجة الى ارسال القيادة APDU التي سيطلب تطبيق EMV تخزينها على رقاقة البطاقة لعدد PAN. المشكلة هي، لا أستطيع العثور على مجموعة بايت العادية لبناء القيادة APDU الذي سيعود البيانات المطلوبة في أي مكان ...

هل كانت مفيدة؟

المحلول

ويجب أن لا تحتاج إلى التفاف APDU أبعد من ذلك. طبقة API يجب أن تراعي ذلك.

ويبدو أن استجابة 0x6D00 يعني فقط أن الطلب لم تدعم INS.

ومجرد استكشاف الأخطاء وإصلاحها الآن، ولكنك لم تبدأ بتحديد تطبيق ماستركارد، أليس كذلك؟

وأي بمعنى. شيء من هذا القبيل:

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

نصائح أخرى

وهنا بعض الأمثلة العمل:

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

وهذا يعمل مع بطاقة مايسترو، أستطيع أن أقرأ عدد PAN، ولكن الآن أنا بحاجة لقراءة عدد PAN ماستركارد. أنا لا أعرف أن أغير APDU تسجيل القراءة أو حدد APDU التطبيق. أي شخص مطلع على APDUs؟

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

ما عليك القيام به بناء كائن CommandAPDU وتمريرها إلى الإرسال () - القيادة

ويجب أن تكون قادرة على العثور على الأمر المحدد في وثائق البطاقة الذكية الخاصة بك، ولكن هنا هو مثال واحد:

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

هل جربت يبحث حتى في الوثائق ما يعني 0x6D00؟ يبدو أنه قد يعني أن لا يتم اعتماد الأمر المغلف. هل حاولت استخدام T = 0 بروتوكول بدلا من T = 1؟

ولا أتوقع بلدي على سبيل المثال للعمل على بطاقتك. أنا لا أعرف أي APDUs المايسترو / ماستركارد الدعم، لذلك لا يمكن أن أعطيك مثالا العمل.

وحاول إعطاء الأمر على طول المتوقع صريح مثل هذا:

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

وماذا عن استخدام الماسح الضوئي، والحصول على صورة للبطاقة، ومسح محتوى الصورة مع مكتبة التعرف الضوئي على الحروف جافا جيد (مثل <وأ href = "http://ocr4j.sourceforge.net/" يختلط = "نوفولو "> http://ocr4j.sourceforge.net/ على سبيل المثال) والبحث عن (عادة) تسلسل الرقم 16 XXXX-XXXX-XXXX-XXXX، فإنك سوف تحصل على PAN من أي بطاقة EMV باستخدام جافا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top