2013-08-13 3 views
3

У меня есть некоторые проблемы с чтением Номер IBAN номер german CashCards (также известный как Geldkarte). Я могу общаться с моей карточкой, и я получаю от нее некоторую информацию. но я не знаю, который commandApdu я должен отправить на карту, чтобы получить номер IBAN ...Получить номер IBAN с карточки emv

Приложение работает на Java 7 и я использую java.smartcardio api Protocoll Т = 1

мой commandApdu чтобы получить дату, выглядит так:

byte[] commandBytes = new byte[]{0x00, (byte)0xa4, 0x04, 0x00, 0x07, (byte)0xa0, 0x00, 0x00, 0x00,0x04, 0x30, 0x60, 0x00}; 

информацию я получаю:

6F 32 84 07 A0 00 00 00 04 30 60 A5 27 50 07 4D 61 65 73 74 72 6F 87 01 03 9F 38 09 9F 33 02 9F 35 01 9F 40 01 5F 2D 04 64 65 65 6E BF 0C 05 9F 4D 02 19 0A 

Может кто-нибудь сказать мне правильный APDU для getti номер IBAN?

я извиняюсь, если я forgott нужна какая-то информация, но это мой первый вопрос в этом форуме :-)

ответ

0

я решил мою проблему после того, как долгое время так: На первом отправить команду на карту, чтобы выбрать помощь (идентификатор приложения):

private static byte[] aidWithPossibleIban = new byte[] { 0x00, (byte) 0xa4, 
      0x04, 0x00, 0x09, (byte) 0xa0, 0x00, 0x00, 0x00, 0x59, 0x45, 0x43, 
      0x01, 0x00, 0x00 }; 

тогда я шляпу поднять безопасности на уровне:

private static byte[] cmdRaiseSecurityLevel = new byte[] { 0x00, 0x22, 
      (byte) 0xf3, 0x02 }; 

последнее, что нужно сделать, чтобы прочитать запись:

private static byte[] readSelectedRecord = new byte[] { 0x00, (byte) 0xb2, 
      0x01, (byte) 0xa4, 0x00 }; 

считает Andreas

+0

Несут ли они имя держателя карты? Кажется, я его нигде не нашел. – Mario

+0

Привет, Марио, нет, я не нашел Имя владельца. Думаю, это сохраняется в магнитном хранилище карты, а не на чипе. –

0

Okay поэтому карта отправила назад это:

6F328407A0000000043060A52750074D61657374726F8701039F38099F33029F35019F40015F2D046465656EBF0C059F4D02190A 

Which translates to:

6F File Control Information (FCI) Template 
    84 Dedicated File (DF) Name 
     A0000000043060 
    A5 File Control Information (FCI) Proprietary Template 
     50 Application Label 
      M a e s t r o 
     87 Application Priority Indicator 
      03 
     9F38 Processing Options Data Object List (PDOL) 
      9F33029F35019F4001 
     5F2D Language Preference 
      d e e n 
     BF0C File Control Information (FCI) Issuer Discretionary Data 
      9F4D Log Entry 
       190A 

Итак, теперь вы выбрали приложение, которое вы хотите отправить команде «Чтение записи», чтобы получить данные из него (номер карты, дата истечения срока действия, карточка ho lder name, IBAN (если он там, раньше не видел)). Структура команды «Read Record» может быть найдена в EMV Book 3, но вот несколько грубого psuedocode относительно того, как должен выглядеть ваш цикл записи записи. В верхней части головы я обычно устанавливаю NUM_SFIS на 5 и NUM_RECORDS на 16, поскольку обычно ничего не происходит из этих точек.

for (int sfiNum = 1; sfiNum <= NUM_SFIS; sfiNum++) 
{ 
    for (int rec = 1; rec <= NUM_RECORDS; rec++) 
    { 
      byte[] response = tag.transceive(new byte[]{0x00,(byte)0xB2 (byte)rec, (byte)((byte)(sfiNum << 3) | 4), 0x00}); 
    } 
} 
+0

@andreas Я думаю, что вы забыли закончить предложение? :) Или, если вы имели в виду, что мой ответ помог/решил вашу проблему, вы должны принять/опросить его, нажав на галочку слева и/или стрелку вверх. – Peanut

+0

sry я просто написал не в том поле .... –

0

Я хотел бы добавить, то IBAN возвращения из карты не просто.

Возврат IBAN - это номер основного банка, а затем номер счета от держателя карты в другой записи.Поэтому необходимо указать правильный IBAN через код, так как контрольная цифра должна быть рассчитана, как показано here

Поскольку в записях мы находим код страны (DE), Bankleitzahl BLZ (8 цифр) и номер счета (10 цифр) , Check Digit можно рассчитать с помощью

public string ReturnIBAN(string lkz, string blz, string kntnr, bool groupedReturn = true) 
    { 
     string bban = string.Empty; 

     lkz = lkz.ToUpper(); 
     switch (lkz) 
     { 
      case "AT": 
       { 
        bban = blz.PadLeft(5, '0') + kntnr.PadLeft(11, '0'); 
       } 
       break; 
      case "DE": 
       { 
        bban = blz.PadLeft(8, '0') + kntnr.PadLeft(10, '0'); 
       } 
       break; 
      case "CH": 
       { 
        bban = blz.PadLeft(5, '0') + kntnr.PadLeft(12, '0'); 
       } 
       break; 
     } 
     string sum = bban + lkz.Aggregate("", (current, c) => current + (c - 55).ToString()) + "00"; 

     var d = decimal.Parse(sum); 
     var checksum = 98 - (d % 97); 
     string iban = lkz + checksum.ToString().PadLeft(2, '0') + bban; 
     return groupedReturn ? iban.Select((c, i) => (i % 4 == 3) ? c + " " : c + "").Aggregate("", (current, c) => current + c) : iban; 
    } 

Источник (на немецком языке): here

Смежные вопросы