4

Java の javax.smartcardio を使用して Mifare クラシックの特定のブロックを読みたいと思います。これが私のコードです:

public byte[] getCardUID() throws CardException {
    CardTerminals terminals = TerminalFactory.getDefault().terminals();
    terminal = terminals.list().get(0);
    Card card = terminal.connect("*");
    CardChannel channel = card.getBasicChannel();
    CommandAPDU command = new CommandAPDU( new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A, (byte) 0x01, (byte) 0x00 });
    ResponseAPDU response = channel.transmit(command);
    card.disconnect(true);
    if (response.getSW1() == 0x90) {
        byte[] data = response.getData();
        data = Arrays.copyOfRange(data, 0x08, data.length);
        return data;
    }
    return new byte[] {};
}

この方法 (インターネットで見つけたサンプル) は、カードの UID を正常に読み取ることができますが、独自のコマンドを作成しようとすると、常にエラー SW1=63 になります。

このサイト (http://www.acs.com.hk/drivers/eng/API_ACR122U_v2.00.pdf) で、APDU に関する情報を見つけましたが、何も機能せず、その理由がわかりません。次のコマンドを試してみましたが成功しませんでした (常にエラー 63): FF B0 00 04 10 (B0 - バイナリ ブロックの読み取り、04 - セクター数、10 - 16 バイトの読み取り)。また、値ブロック (INS B1) を読み取って 1 バイトだけを読み取ろうとしましたが、成功しませんでした。

FF 00 00 00 ...(私の例から)は直接送信する必要がありますが、ブロックを読み取るための次の指示がわかりません。

誰でも私を助けることができますか?どうもありがとう。(私の英語でごめんなさい)

4

1 に答える 1