2014-09-21 2 views
1

NTAG213 NFC 레이블을 암호로 보호하기 위해 ACR122U NFC 판독기를 사용하고 있습니다. 비밀번호를 올바르게 설정했다고 생각하지만 이후에는 라벨을 인증하고 변경할 수 없습니다. 인증에 대한 나의 코드는 다음과 같습니다 인증 할 수 없음 NTAG213

#include <winscard.h> 
#include <iostream> 
#pragma comment(lib, "winscard.lib") 

const char *ReaderName = "ACS ACR122 0"; 
unsigned Password = 0x12345678; 

int main() 
{ 
    //Establish context 
    SCARDCONTEXT    hContext; 
    DWORD SCard_Status1 = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext); 
    if(SCard_Status1 != SCARD_S_SUCCESS) 
    return 1; 

    //connect to the card 
    SCARDHANDLE hCardHandle; 
    DWORD Protocol; 
    DWORD SCard_Status2 = SCardConnect(hContext, ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &hCardHandle, &Protocol); 
    if(SCard_Status2 != SCARD_S_SUCCESS) 
    { 
    SCardReleaseContext(hContext); 
    return 1; 
    } 

    SCARD_IO_REQUEST Request; 
    Request.dwProtocol = Protocol; 
    Request.cbPciLength = sizeof(SCARD_IO_REQUEST); 
    BYTE TxData[] = 
    { 
    0xFF, //CLA 
    0x00, //INS 
    0x00, //P1 
    0x00, //P2 
    0x08, //LC 
    0xD4, 
    0x40, 
    0x01, 
    0x1B, //PWD_AUTH (See data sheet) 
    Password, 
    Password >> 8, 
    Password >> 16, 
    Password >> 24, 
    }; 

    BYTE RxData[254]; 
    unsigned long RxLength = sizeof(RxData); 
    DWORD SCard_Status3 = SCardTransmit(hCardHandle, &Request, TxData, sizeof(TxData), NULL, RxData, &RxLength); 
    std::cout << "SCard_Status = " << SCard_Status3 << std::endl; 
    std::cout << "RxLength = " << RxLength << std::endl; 

    SCardDisconnect(hCardHandle, SCARD_EJECT_CARD); 
    SCardReleaseContext(hContext); 
    return 0; 
} 

는 PWD로 NTAG213에 PWD_AUTH 명령을 보내야합니다. 암호가 맞으면 오류가 발생하거나 암호가 맞으면 2 바이트가 표시됩니다. 그러나 SCard_Status는 SCARD_S_SUCCESS이고 RxLength는 0입니다. 라벨에 쓰려고하면 오류가 발생합니다.

이 작업을 수행하는 방법을 보여주는 예제가 없습니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니?

+0

SCardTransmit이 "SCARD_S_SUCCESS"를 반환하면 RxData는 "9000"이어야합니다. – vikky

+0

네,하지만 RxData는 RxLength가 0이므로 쓰여지지 않습니다. –

+0

RxData가 비어 있으면 SCardTransmit.Con에 문제가 있음을 의미합니다. – vikky

답변

2

나는 스스로에게 대답 할 것이다.

BYTE TxData[] = 
{ 
    0xFF, //CLA 
    0x00, //INS 
    0x00, //P1 
    0x00, //P2 
    0x07, //LC 
    0xD4, 0x42, //InCommunicateThru 
    0x1B, //PWD_AUTH (See data sheet) 
    Password, 
    Password >> 8, 
    Password >> 16, 
    Password >> 24, 
}; 

내가 NFC 프로세서 인 PN532의 데이터 시트에서 InDataExchange (D4 40)를 대체 명령 InCommunicateThru (D4 42)를 발견 I는 이에 TxData을 변경하여 작동하도록 관리 ACR122U 내부.

관련 문제