2015-10-13 65 views
0

我想設置和檢查NFC標籤中的密碼(類型:NTAG213),但我總是收到一個IOException(收發失敗),當我試圖設置它。設置密碼NTAG213

我不明白我必須爲密碼和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 
}); 

回答

2

隨着NTAG213,密碼的正確頁(PWD)和密碼確認(PACK)爲:

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

因此,您正在嘗試寫入錯誤的頁面。更具體地說,您試圖將非零值寫入RFUI字節(第44頁,字節2-3和第42頁,字節1-3),這可能會導致寫入操作失敗。

所以,你通常會想要做omething這樣的:

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的一個子集,因爲攻擊者然後能夠獲得PACK值來自PWD值。 PACK值通常用作共享密鑰,只有您和標籤「知道」以及標籤爲成功進行身份驗證而發送的密鑰才能證明它是真正的標籤。 (雖然此方法存在相當多的安全問題)。

此外請注意,如果標記已經被保護(密碼設置和認證配置設置爲),則設置PWD/PACK值將失敗(可能帶有IOException)保護PWD/PACK)。在這些情況下,您需要先使用當前密碼進行身份驗證。

+0

感謝您的快速回復。我做到了,程序沒有出現異常,但使用NFC工具應用程序來檢查nfc狀態,它讓我寫在當前應該由密碼保護的標籤上。這怎麼可能?! – lukaspp

+1

設置密碼不足以保護標籤,因此必須相應地設置配置頁以實際保護標籤。 –

+0

如何設置配置頁? – lukaspp