1

私はすでにjavax.smartcardioスマートカードからシリアル番号をあまり苦労せずに読み取ることに慣れていました。ただし、現在、空のカードで MF を作成するように割り当てられています (これがないとシリアル番号を読み取ることができません)。ISO 7816 ガイドラインに従ってそのための APDU コマンドを作成していますが、16 進値が間違ったバイトに変換されます。

import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;

class SmartCardAPIs {

    public int Create_MF() throws CardException{

        //--Variable declaration
        int result=0;
        Card card=null;     
        byte[] responseData=null;
        ResponseAPDU answer=null;
        String SW1=null;
        String SW2=null;
        int cla,  ins,  p1,  p2;
        byte[] data=null;
        //---------------------------------------------

        //--1--Establish connection with the smart card
        TerminalFactory factory = TerminalFactory.getDefault();
        List<CardTerminal> terminals = factory.terminals().list();
        // Use the first terminal
        CardTerminal terminal = terminals.get(0);
        // Connect with the card
        card = terminal.connect("*");
        CardChannel channel = card.getBasicChannel();           
        //---------------------------------------------

        //--2--Create MF 
        cla=0x00;
        ins=0xE0;
        p1=0x00;
        p2=0x00;
        data = new byte[] {
            (byte) 0x21,
            (byte) 0x62,
            (byte) 0x1F,
            (byte) 0x82, // **** Getting converted to -126 ****
            --
            --
            --
        };          
        answer = channel.transmit(new CommandAPDU(cla,  ins,  p1,  p2, data));
        responseData= answer.getBytes();

        if(responseData!=null)
        {
            if(responseData.length==2)
            {
                SW1=String.format("%02X ", (responseData[0])).trim();
                SW2=String.format("%02X ", (responseData[1])).trim();
            }
        }       
    }
}

2つの問題があります

1: コマンド APDU のデータが間違ったバイトを取得しています ( *としてマークされています)。

2: SW1 と SW2 が 6A 80 として返されます。これは、データ フィールドのパラメーターが正しくないことを意味します (16 進形式の int をバイトにキャストするときに負の値が原因だと思いますが、強制されているためあまり役に立ちません)。

ここに配置した部分的な APDU コマンドは、提供された完全なコマンドの一部であり、コマンドでスマート カード ツールを使用してブランク カードで MF を作成することに成功したため、コマンドは 100% OK でテストされています。 .私は今、Javaで同じことをしたい.

問題はこの APDU の作成方法にあると思いますが、負の値の問題である可能性があります (カードからシリアル番号を読み取るためのアプレットを作成しましたが、Java APDU の専門家ではありません)。

4

3 に答える 3

2

あなたが言ったので、あなたは手元に動作しているコマンドを持っていて、確かにそのjava表現を再確認しました:あなたは、コマンドが前の試みでうまく実行されなかったことをどれくらい確信していますか?(明らかに、1つのMFのみが許可されます。)問題は、報告されたエラーコードが「既知の正しいAPDU」の仮定と矛盾し、これが私が考えることができる唯一の解決策であるということです。与えられている限り、Javaコードは正しく見えます。

その他のアイデア:ISO作成ファイルのコマンドデータフィールドは、FCIの場合は0x6Xのようなもので始める必要があります。おそらく、0x21はテンプレート全体の長さ(LCとして送信されると想定)であり、Javaはバイト配列の長さからそれ自体を構築するので、省略してみてください。3番目のバイトが0x1Fであるという事実は、0x21からタグと長さを引いたものを意味し、その仮説をサポートします。

于 2012-12-13T08:10:43.707 に答える