3

ドイツのキャッシュカード ( Geldkarteとも呼ばれます)からのIBAN番号の読み取りに問題があります。私は自分のカードと通信でき、そこからいくつかの情報を取得します。しかし、IBAN番号を取得するために、どのコマンドApduをカードに送信する必要があるかわかりません...

アプリケーションは Java 7 で実行され、java.smartcardio api Protocoll is T=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 

IBAN番号を取得するための正しいapduを誰か教えてもらえますか?

必要な情報を忘れていたら申し訳ありませんが、これがこの掲示板での最初の質問です :-)

4

3 に答える 3

1

さて、カードはこれを送り返しました:

6F328407A0000000043060A52750074D61657374726F8701039F38099F33029F35019F40015F2D046465656EBF0C059F4D02190A

つまり、次のようになります。

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

これで、一連の「レコードの読み取り」コマンドを送信して、データを取得するアプリケーションを選択しました (カード番号、有効期限、カード所有者名、IBAN (そこにある場合は、見たことがない))。「Read Record」コマンドの構造はEMV Book 3に記載されていますが、Read Record ループがどのように見えるべきかについての大まかな疑似コードを次に示します。通常は 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});
    }
}
于 2013-09-19T23:08:17.967 に答える
1

私は長い間この方法で問題を解決しました:最初にコマンドをカードに送信して、援助(アプリケーション識別子)を選択します:

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

アンドレアスよろしく

于 2013-10-02T08:25:49.580 に答える