【问题标题】:Cannot authenticate NTAG213无法验证 NTAG213
【发布时间】:2014-09-21 11:50:48
【问题描述】:

我正在使用 ACR122U NFC 阅读器对 NTAG213 NFC 标签进行密码保护。我想我已经设法正确设置了密码,但之后我无法进行身份验证和更改标签。我的身份验证代码如下所示:

#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_AUTH 命令与 Pwd 一起发送到 NTAG213。如果密码错误,我希望收到一个错误,如果密码正确,我希望收到两个字节的 PACK。但是 SCard_Status 是 SCARD_S_SUCCESS 并且之后 RxLength 是 0。如果我尝试写入标签,我会收到错误消息。

我找不到任何显示如何执行此操作的示例。谁能看到我做错了什么?

【问题讨论】:

  • 如果 SCardTransmit 返回“SCARD_S_SUCCESS”,RxData 应该是“9000”。
  • 是的,但是 RxData 没有写入,因为 RxLength 为 0。
  • 如果 RxData 为空,说明 SCardTransmit.Con 有问题,你贴出所有代码?
  • 我已经更新了代码,所以它现在是我的问题的完整示例。它打印 SCard_Status = 0 和 RxLength = 0。
  • 我认为 SCard_Status 打印以前的值。更改变量名并检查返回值。

标签: nfc mifare winscard acr122


【解决方案1】:

我将自己回答这个问题。我设法通过将 TxData 更改为:

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,
};

我在 PN532(ACR122U 内部的 NFC 处理器)的数据表中发现命令 InCommunicateThru (D4 42) 可以替代 InDataExchange (D4 40)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多