0

次のコードが機能し、Mifare1kカードのUIDを取得できます。残念ながら、Desfireカードでは機能しません。

    public byte[] GetUid()
    {
        byte[] uid = new byte[6];
        int rc = Communicate(new byte[]{0xff, 0xca, 0x00, 0x00, 0x04}, ref uid);
        if (rc != 0)
            throw new Exception("failure: " + rc);

        int rc1, rc2;
        if (uid.Length == 2)
        {
            rc1 = uid[0];
            rc2 = uid[1];
        }
        else
        {
            rc1 = uid[4];
            rc2 = uid[5];
        }

        if (rc1 != 0x90 || rc2 != 0x00)
            throw new Exception("failure: " + rc1 + "/" + rc2);

        byte[] result = new byte[4];
        Array.Copy(uid, result, 4);
        return result;
    }

以下のリソースを見てみました

...そしてこのようにそれをやろうとしました:

        byte[] outb = new byte[15];
        int rc9 = Communicate(new byte[] { 0x60 }, ref outb);

outbには常に{0x67、0x00}が含まれ、予想どおり{af 04 01 01 00 021805}は含まれません。

接続は成功し、SCardGetAttribを使用してATRを取得できます。CommunicateメソッドはSCardTransmitで機能します。役に立ったらコードを投稿できます。

ポインタをありがとう!

編集

最初の答えをありがとう!私は提案されたようにプログラムを変更しました:

        byte[] outb = new byte[9];
        int rc5 = Communicate(new byte[]{0x90, 0x60, 0x00, 0x00, 0x00, 0x00}, ref outb);

これで、outbは{0x91、0x7E}になります。これはより良いようで、0x91はISO 7816応答コードのように見えますが、残念ながら、予想どおり0x90ではありません。(0xf2を受信した場合に読み取りを続行する2番目のリンクのDESFIRE_TRANSCEIVEマクロも確認しました。)ISO 7816 APDU応答コードをGoogleで検索しようとしましたが、エラーコードのデコードに成功しませんでした。

編集2

私はまた、次のコメントを見つけました:

オムニキー5321でDESFireATR3B8180018080 UID 04 52 2E AA 47 23 80 90 00[apduFFCA000000から]他のすべてのapduは917E不明なエラーを出します

これは私のエラーコードを説明し、他のMifare1k文字列と非常によく似たFFCA000000という別のヒントを与えてくれます。したがって、FFCA000000を使用すると、UIDが含まれているように見える9バイトの応答が返されます。興味深いことに、FFCA000000コードは1kカードでも機能するので、おそらく私の解決策は、最後の04を00に変更し、異なる長さの応答を処理することです。右?

編集3

ペニーが落ちたようです...0x04=4バイトの応答=7バイトのUIDには小さすぎます=応答917E=バッファが小さすぎます:-)

4

3 に答える 3

3

このコードは機能しているようです:

        int rc = Communicate(new byte[] { 0xff, 0xca, 0x00, 0x00, 0x00 }, ref uid);
        if (rc != 0)
            throw new Exception("failure: " + rc);

        int rc1 = uid[uid.Length-2], rc2 = uid[uid.Length-1];

        if (rc1 != 0x90 || rc2 != 0x00)
            throw new Exception("failure: " + rc1 + "/" + rc2);

        byte[] result = new byte[uid.Length - 2];
        Array.Copy(uid, result, uid.Length - 2);
        return result;

コメントはありますか?

于 2013-02-22T08:47:55.013 に答える
2

Cla=ffコマンドはpcscパート3コマンドです。Ins = caは、pcsc2.0xに準拠しているすべてのclリーダーで動作するはずです。

于 2013-08-17T18:05:41.813 に答える
1

代わりに、提供した最初のリンクの「ネイティブラップ」バージョンを試してください。インターフェイスはISO7816-4スタイルのAPDUを想定しています(長さが間違っていることを意味するISO 7816-4ステータスワードを返すため)。

于 2013-02-21T21:51:39.147 に答える