设置NTAG213的密码

时间:2015-10-13 10:46:13

标签: android authentication xamarin nfc mifare

我正在设置并检查NFC标签中的密码(类型:NTAG213),但在我尝试设置时,我总是收到IOException(收发失败)。

我不明白我必须为密码和ACK包设置哪个页面。 这是我用Xamarin用C#编写的代码。请随意回复本机Android Java代码。

var tag = intent.GetParcelableExtra (NfcAdapter.ExtraTag) as Tag;

String password = "pass";
byte[] array = System.Text.Encoding.ASCII.GetBytes (password);
MifareUltralight mifare = MifareUltralight.Get (tag);
mifare.Connect ();

byte[] result1 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        array[0], array[1], array[2], array[3] 
});

byte[] result2 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2A,  /* PAGE = 42 */
        (byte)array[0], (byte)array[1], (byte)0, (byte)0 
});

1 个答案:

答案 0 :(得分:3)

使用NTAG213时,密码(PWD)和密码确认(PACK)的正确页面为:

  • PWD:43(0x2B
  • PACK:44(0x2C

因此,您正试图写错页面。更具体地说,您试图将非零值写入RFUI字节(第44页,字节2-3和第42页,字节1-3),这可能导致写操作失败。

所以你通常想做这样的事情:

byte[] pwd = new byte[] { (byte)0x70, (byte)0x61, (byte)0x73, (byte)0x73 };
byte[] pack = new byte[] { (byte)0x98, (byte)0x76 };

// write PACK:
byte[] result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        pack[0], pack[1], 0, 0
});

// write PWD:
result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2B,  /* PAGE = 43 */
        pwd[0], pwd[1], pwd[2], pwd[3]
});

请注意,让PACK成为PWD的子集没有多大意义,因为攻击者随后可以从PWD值中获取PACK值。 PACK值通常用作共享密钥,只有您和标记“知道”并且标记响应成功的身份验证尝试而发送,以证明它是真正的标记。 (尽管这种方法存在很多安全问题。)

进一步注意,如果标签已经受到保护(密码设置和认证配置设置为保护PWD / PACK),则设置PWD / PACK值将失败(可能带有IOException)。在这些情况下,您需要先使用当前密码进行身份验证。