1

全て!

mifare card 1k からデータを読み取ろうとしています。
ID を取得する
には 送信: 0xFF 0xCA 0x00 0x00 0x00
受信: 0x00 0x00 0x00 0x00 0x00 0x00 - ??? それは正常ですか?

認証キーをリーダー
にロードするには、送信します: 0xFF 0x82 0x00 0x00 0x06 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
受信: 90 00 - 大丈夫です

ブロック 01 で認証するには、
送信します: 0xFF 0x86 0x00 0x00 0x05 0x01 0x00 0x01 0x60 0x00
受信: 90 00 - 大丈夫です

ブロック 01 からデータを読み取る
には、送信: 0xFF 0xB0 0x00 0x01 0x0F
受信: 63 00 - 認証エラーであることをどのように理解するか

理解できません - なぜですか?

私のコード:

#include "stdafx.h"
#include "Winscard.h"

LPTSTR          pmszReaders = NULL;
LPTSTR      pmszCards = NULL;
LPTSTR          pReader;
LPTSTR          pCard;
LONG            lReturn, lReturn2;
DWORD           cch = SCARD_AUTOALLOCATE;
SCARDCONTEXT    hSC;
SCARD_READERSTATE readerState;
LPCTSTR         readerName = L"ACS ACR1222 1S Dual Reader 0";
SCARDHANDLE     hCardHandle;
DWORD           dwAP;
BYTE            pbRecv[50];
DWORD           dwRecv;

BYTE            cmdGetData[] = {0xFF, 0xCA, 0x00, 0x00, 0x00};
BYTE            cmdLoadKey[] = {0xFF, 0x82, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
BYTE            cmdAuthBlock01[] = {0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, 0x01, 0x60, 0x00};
BYTE            cmdReadBlock01[] = {0xFF, 0xB0, 0x00, 0x01, 0x0F};



int _tmain(int argc, _TCHAR* argv[]) {

    lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
    if ( SCARD_S_SUCCESS != lReturn )
        printf("Failed SCardEstablishContext\n");
    else {
        lReturn = SCardListReaders(hSC, NULL, (LPTSTR)&pmszReaders, &cch );
        if (lReturn != SCARD_S_SUCCESS) {
            printf("Failed SCardListReaders\n");
        } else {
            pReader = pmszReaders;
            while ( '\0' != *pReader ) {
                printf("Reader: %S\n", pReader );
                pReader = pReader + wcslen((wchar_t *)pReader) + 1;
            }
        }

        memset(&readerState,0,sizeof(readerState));
        readerState.szReader = pmszReaders;

        lReturn = SCardConnect( hSC, pmszReaders, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle, &dwAP );
        if ( SCARD_S_SUCCESS != lReturn ) {
            printf("Failed SCardConnect\n");
            system("pause");
            exit(1);
        } else {
            printf("Success SCardConnect\n");
            switch ( dwAP ) {
                case SCARD_PROTOCOL_T0:
                    printf("Active protocol T0\n"); 
                    break;
                case SCARD_PROTOCOL_T1:
                    printf("Active protocol T1\n"); 
                    break;
                case SCARD_PROTOCOL_UNDEFINED:
                default:
                    printf("Active protocol unnegotiated or unknown\n"); 
                    break;
            }
        }

        lReturn = SCardTransmit(hCardHandle, SCARD_PCI_T1, cmdGetData, sizeof(cmdGetData), NULL, pbRecv, &dwRecv);
        if ( SCARD_S_SUCCESS != lReturn ) {
            printf("Failed SCardTransmit\n");
        } else {
            printf("Success SCardTransmit\n");
            printf("Read %u bytes\n", dwRecv);
            for(byte i=0;i<dwRecv;i++) {
                printf("%x ", pbRecv[i]);
            }
            printf("\n");
        }


        lReturn = SCardTransmit(hCardHandle, SCARD_PCI_T1, cmdLoadKey, sizeof(cmdLoadKey), NULL, pbRecv, &dwRecv);
        if ( SCARD_S_SUCCESS != lReturn ) {
            printf("Failed SCardTransmit\n");
        } else {
            printf("Success SCardTransmit\n");
            printf("Read %u bytes\n", dwRecv);
            for(byte i=0;i<dwRecv;i++) {
                printf("%x ", pbRecv[i]);
            }
            printf("\n");
        }


        lReturn = SCardTransmit(hCardHandle, SCARD_PCI_T1, cmdAuthBlock01, sizeof(cmdAuthBlock01), NULL, pbRecv, &dwRecv);
        if ( SCARD_S_SUCCESS != lReturn ) {
            printf("Failed SCardTransmit\n");
        } else {
            printf("Success SCardTransmit\n");
            printf("Read %u bytes\n", dwRecv);
            for(byte i=0;i<dwRecv;i++) {
                printf("%x ", pbRecv[i]);
            }
            printf("\n");
        }


        lReturn = SCardTransmit(hCardHandle, SCARD_PCI_T1, cmdReadBlock01, sizeof(cmdReadBlock01), NULL, pbRecv, &dwRecv);
        if ( SCARD_S_SUCCESS != lReturn ) {
            printf("Failed SCardTransmit\n");
        } else {
            printf("Success SCardTransmit\n");
            printf("Read %u bytes\n", dwRecv);
            for(byte i=0;i<dwRecv;i++) {
                printf("%x ", pbRecv[i]);
            }
            printf("\n");
        }


    }

    lReturn = SCardDisconnect(hCardHandle, SCARD_LEAVE_CARD);
    if ( SCARD_S_SUCCESS != lReturn ) {
        printf("Failed SCardDisconnect\n");
    } else {
        printf("Success SCardDisconnect\n");
    }
    system("pause");
    return 0;
}

なぜ私が63 00になったのか誰か説明できますか? ありがとう。

4

2 に答える 2

1

あなたのreadコマンドは「0xFF, 0xB0, 0x00, BLOCK, 0x10」でなければなりません。バッファ長0F(10 進数の 15) を送信しますが、16 バイトを読み取る必要があります0x10。お役に立てれば

于 2013-10-30T06:50:46.657 に答える
1

Mifare Classic 1K タグには 16 個のセクターがあり、各セクターには 4 つのブロックが含まれ、各ブロックには 16 バイトが含まれます。

  1. セクター 0 にはブロック (0,1,2,3) が含まれます
  2. セクター 1 にはブロック (4,5,6,7) が含まれます
  3. セクター 2 にはブロック (8,9,10,11) が含まれます
  4. セクター 3 にはブロック (12、13、14、15) が含まれています。

ブロックから読み取りまたは書き込みを行う前に、そのセクターのキー A またはキー B を使用して、対応するセクターを認証する必要があります。認証が完了すると、読み取りまたは書き込みが可能になります。このコマンドを使用すると、キー A(60) を使用してセクター 0 を認証できます。

byte[] authenticationByte = new byte[10];  

authenticationByte = new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
 (byte) 0x00, (byte) 0x05, (byte) 0x00,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };

認証が成功すると、90 00 が返されます。これが成功メッセージです。それ以外の場合の応答は 63 00 で、認証が失敗したことを意味します。認証が完了すると、ブロック (0,1,2,3) を読み取ることができます。セクター 0 には 4 つのブロックが含まれており、それらはブロック (0,1,2,3) です。ここでの問題は、セクター 1 を認証しているが、セクター 0 のブロックからデータを読み取ろうとしていることです。詳細については、この Answerを参照してください。下手な英語でごめんなさい

于 2015-01-31T16:16:20.743 に答える