我正在设置并检查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
});
答案 0 :(得分:3)
使用NTAG213时,密码(PWD)和密码确认(PACK)的正确页面为:
0x2B
)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
)。在这些情况下,您需要先使用当前密码进行身份验证。