如何在 NTAG424 DNA 中启用 CMAC、UID、COUNTER 和 RAND? 我试图使用最新的 Android SDK 库来设置基于 AES 密钥的动态 URL,但我无法做到。 nxpnfcandroidlib-release-protected.aar 这是我的代码 override fun onNewIntent(intent: Intent) {
Log.i("NFC", "Intent action: ${intent.action}")
super.onNewIntent(intent)
Log.i("MainActivity", "NFC tag discovered")
val cardType = libInstance.getCardType(intent)
Log.i("MainActivity", "Detected card type: $cardType")
if (cardType == CardType.NTAG424DNA) {
val ntag424DNA: INTAG424DNA = DESFireFactory.getInstance().getNTAG424DNA(libInstance.customModules)
val reader: IReader = ntag424DNA.reader
try {
if (!reader.isConnected) {
reader.connect()
}
ntag424DNA.isoSelectApplicationByDFName(NTAG424DNA_APP_NAME)
Log.i("NFC", "ISO selected app by DF Name ✅")
authenticateTag(ntag424DNA, KEY_AES128_DEFAULT)
creatingNDEFmessage(ntag424DNA)
authenticateTag(ntag424DNA, KEY_AES128_DEFAULT)
changeFileSettings(ntag424DNA, 0x01)
authenticateTag(ntag424DNA, KEY_AES128_DEFAULT)
ntag424DNA.setPICCConfiguration(true)
Log.i("MainActivity", "✅ PICC Configuration updated to enable SDM globally.")
authenticateTag(ntag424DNA, KEY_AES128_DEFAULT)
changeSDMFileSettings(ntag424DNA, 0x01)
if (reader.isConnected) {
reader.close()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
private fun creatingNDEFmessage(ntag424DNA: INTAG424DNA) {
// 1. Creating URI NDEF message
val msg = NdefMessageWrapper(
NdefRecordWrapper(
NdefRecordWrapper.TNF_ABSOLUTE_URI,
"https://domain.com?uid=04BB38D2AA1191&ctr=0001&cmac=3ab665b76b795cb9bf76a17956cc9fb3&rand=422def08-8a1c-49c9-9138-434cde858faa".toByteArray(
Charset.forName("US-ASCII")
), ByteArray(0), ByteArray(0)
)
)
ntag424DNA.writeNDEF(msg);
Log.i("MainActivity", "URI NDEF message written successful ✅")
val ndefRead = ntag424DNA.readNDEF()
Log.i("MainActivity", "Read URI NDEF message ${CustomModules.getUtility().dumpBytes(ndefRead.toByteArray())}")
}
private fun changeFileSettings(ntag424DNA: INTAG424DNA, fileNumber: Int) {
// 3. Create NTAG 424 DNA file settings for E104
val fileSettings = NTAG424DNAFileSettings(
MFPCard.CommunicationMode.Encrypted, // = 0x03 = Full ENC + CMAC (SUN)
0x0E.toByte(), // Read access = key slot 0x00 maybe 0x01
0x0E.toByte(), // Write access = always
0x0E.toByte(), // RW access = always
0x0E.toByte() // Change access = always
)
Log.i("MainActivity", "Prepare for saving changes in file $fileNumber")
ntag424DNA.changeFileSettings(fileNumber, fileSettings)
Log.i("NFC", "🔐 File settings updated $fileNumber")
}
private fun changeSDMFileSettings(ntag424DNA: INTAG424DNA, fileNumber: Int) {
val fileSettings = ntag424DNA.getFileSettings(fileNumber);
fileSettings.isSDMEnabled = true;
fileSettings.isUIDMirroringEnabled = true;
fileSettings.piccDataOffset = intTo2ByteArray(51)
fileSettings.sdmMacOffset = intTo2ByteArray(51)
fileSettings.sdmMacInputOffset = intTo2ByteArray(51)
fileSettings.sdmReadCounterOffset = intTo2ByteArray(51)
fileSettings.uidOffset = intTo2ByteArray(51)
fileSettings.sdmAccessRights = byteArrayOf(0x00, 0x00)
Log.i("MainActivity", "Prepare for saving SDM changes in file $fileNumber")
ntag424DNA.changeFileSettings(fileNumber, fileSettings)
Log.i("NFC", "🔐 File settings updated: SUN CMAC enabled on $fileNumber")
}
private fun intTo2ByteArray(value: Int): ByteArray {
return byteArrayOf(
((value shr 😎 and 0xFF).toByte(),
(value and 0xFF).toByte()
)
} 我知道偏移量与 URL 中的位置不匹配,但无论我做了什么更改,都还是会出现这个错误。看起来,由于某些原因,这些设置无法通过这种方法保存。 ntag424DNA.changeFileSettings(fileNumber, fileSettings) 错误信息如下 com.nxp.nfclib.exceptions.UsageException: Invalid Parameters! {Invalid Value for PICC Offset} 代码示例 Re: How can i enable CMAC, UID, COUNTER and RAND in NTAG424 DNA? 问题是由于错误的偏移值造成的。看来 ntag 保留了 21 个默认索引。现在,我们正试图更改 128 aes 密钥,但 changekey() 函数不起作用。 @UKCAS Re: How can i enable CMAC, UID, COUNTER and RAND in NTAG424 DNA? 嘿, 我正在关注这个话题来安装 JSON 数据,但它对我不起作用。这是我第一次与硬件打交道,因此工作更具挑战性。我使用的是恩智浦 Android 库和这里的示例 Android 应用程序: https://www.nxp.com/design/design-center/software/rfid-developer-resources/taplinx-software-development-kit-sdk:TAPLINX 以下是我在 Sample_Application_Android/src/main/java/com/nxp/sampletaplinx/WriteActivity.java 中的代码 public static byte[] intTo2ByteArray(int value) {
return new byte[] {
(byte) (value & 0xFF), // LSB
(byte) ((value >> 8) & 0xFF), // middle byte
(byte) ((value >> 16) & 0xFF) // MSB
};
}
private void tag424DNACardLogic(INTAG424DNA ntag424DNA) {
byte[] KEY_AES128_DEFAULT = new byte[] {
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
};
byte[] NTAG424DNA_APP_NAME =
{(byte) 0xD2, (byte) 0x76, 0x00, 0x00, (byte) 0x85, 0x01, 0x01};
byte[] data ={ 0x73, 0x75, 0x73, 0x68, 0x69, 0x6C };
mStringBuilder.append("\n\n");
int timeOut = 2000;
try {
ntag424DNA.isoSelectApplicationByDFName(NTAG424DNA_APP_NAME);
KeyData aesKeyData = new KeyData();
Key keyDefault = new SecretKeySpec(KEY_AES128_DEFAULT, "AES");
aesKeyData.setKey(keyDefault);
ntag424DNA.authenticateEV2First(0, aesKeyData, null);
mStringBuilder.append(getString(R.string.Authentication_status_true));
mStringBuilder.append("\n\n");
ntag424DNA.setPICCConfiguration(true);
String jsonTemplate = "{\"uuid\":\"00000000000000\",\"counter\":\"000000\",\"cmac\":\"0000000000000000\",\"domain1\":" + 1 + ",\"domain2\":" + 1 + "}";
byte[] jsonBytes = jsonTemplate.getBytes("UTF-8");
NTAG424DNAFileSettings fs = new NTAG424DNAFileSettings(
CommunicationMode.Plain, // or MAC/ENC depending on your security
(byte) 0x0E, // Read access: Key 0
(byte) 0x0E, // Write access: Key 0
(byte) 0x0E, // Read/Write: Key 0
(byte) 0x00 // Change access: Free
);
byte[] type = "U".getBytes("US-ASCII");
fs.setSDMEnabled(true);
fs.setUIDMirroringEnabled(true);
fs.setSDMReadCounterEnabled(true);
byte[] bytes = new byte[] { (byte)0xE0, (byte)0x00, (byte)0x00 };
fs.setSdmAccessRights(bytes);
byte[] uuidOffset = intTo2ByteArray(8);
fs.setUidOffset(uuidOffset);
byte[] readCounterOffset = intTo2ByteArray(35);
fs.setSdmReadCounterOffset(readCounterOffset);
byte[] macOffset = intTo2ByteArray(51);
fs.setSdmMacInputOffset(uuidOffset);
fs.setSdmMacOffset(macOffset);
ntag424DNA.changeFileSettings(FILE_NUMBER, fs);
// Create NDEF record
NdefRecordWrapper record = new NdefRecordWrapper(
NdefRecordWrapper.TNF_WELL_KNOWN,
type,
new byte[0], // empty ID
jsonBytes // payload (your JSON)
);
// Wrap record into NDEF message
NdefMessageWrapper msg = new NdefMessageWrapper(record);
ntag424DNA.writeNDEF(msg);
NxpLogUtils.save();
} catch (Exception e) {
writeFailedMessage();
mStringBuilder.append(e.getMessage());
Log.i("MainActivity", "URI NDEF message written successful $msg " + e.getMessage() );
showMessage(mStringBuilder.toString(), PRINT);
NxpLogUtils.save();
}
} 如果有人能帮我解决这个问题,将是莫大的帮助 Re: How can i enable CMAC, UID, COUNTER and RAND in NTAG424 DNA? 谢谢您的帮助!你说得对,我的偏移值是错的。这就是我所做的更改,现在我可以保存设置了。 override fun onNewIntent(intent: Intent) {
Log.i("NFC", "Intent action: ${intent.action}")
super.onNewIntent(intent)
Log.i("MainActivity", "NFC tag discovered")
val cardType = libInstance.getCardType(intent)
Log.i("MainActivity", "Detected card type: $cardType")
if (cardType == CardType.NTAG424DNA) {
val ntag424DNA: INTAG424DNA = DESFireFactory.getInstance().getNTAG424DNA(libInstance.customModules)
val reader: IReader = ntag424DNA.reader
try {
if (!reader.isConnected) {
reader.connect()
}
ntag424DNA.isoSelectApplicationByDFName(NTAG424DNA_APP_NAME)
Log.i("NFC", "ISO selected app by DF Name ✅")
authenticateTag(0x00, ntag424DNA, KEY_AES128_DEFAULT)
creatingNDEFmessage(ntag424DNA)
authenticateTag(0x00, ntag424DNA, KEY_AES128_DEFAULT)
changeFileSettings(ntag424DNA, 0x02)
if (reader.isConnected) {
reader.close()
}
} catch (e: Exception) {
Log.e("MainActivity", e.localizedMessage ?: "No Error Message");
e.printStackTrace()
}
}
}
private fun changeFileSettings(ntag424DNA: INTAG424DNA, fileNumber: Int) {
// 3. Create NTAG 424 DNA file settings for E104
val fileSettings = NTAG424DNAFileSettings(
MFPCard.CommunicationMode.Plain, // = 0x03 = Full ENC + CMAC (SUN)
0x0E.toByte(), // Read access = key slot 0x00 maybe 0x01
0x0E.toByte(), // Write access = always
0x0E.toByte(), // RW access = always
0x00.toByte() // Change access = always
)
fileSettings.isSDMEnabled = true
fileSettings.isUIDMirroringEnabled = true
fileSettings.isSDMReadCounterEnabled = true
fileSettings.sdmAccessRights = byteArrayOf(0xfe.toByte(), 0xe1.toByte())
fileSettings.uidOffset = byteArrayOf(0x1A, 0x00, 0x00)
fileSettings.sdmReadCounterOffset = byteArrayOf(0x2d, 0x00, 0x00)
fileSettings.sdmMacOffset = byteArrayOf(0x39, 0x00, 0x00)
fileSettings.sdmMacInputOffset = byteArrayOf(0x39, 0x00, 0x00)
Log.i("MainActivity", "Prepare for saving changes in file $fileNumber")
ntag424DNA.changeFileSettings(fileNumber, fileSettings)
Log.i("MainActivity", "🔐 File settings updated $fileNumber")
}
private fun creatingNDEFmessage(ntag424DNA: INTAG424DNA) {
// 1. Creating URI NDEF message
val payload = byteArrayOf(0x04) + "noexample.xxxx?uid=00000000000000&ctr=000000&cmac=0000000000000000".toByteArray()
val msg = NdefMessageWrapper(
NdefRecordWrapper(
NdefRecordWrapper.TNF_WELL_KNOWN,
"U".toByteArray(StandardCharsets.US_ASCII),
ByteArray(0),
payload
)
)
ntag424DNA.writeNDEF(msg);
Log.i("MainActivity", "URI NDEF message written successful ✅")
val ndefRead = ntag424DNA.readNDEF()
Log.i("MainActivity", "Read URI NDEF message ${CustomModules.getUtility().dumpBytes(ndefRead.toByteArray())}")
} Re: How can i enable CMAC, UID, COUNTER and RAND in NTAG424 DNA? 亲爱的洛基2号
请查看 jimmyvhan 提供的文件和数据表。
你们的偏移量重叠了,而数据手册不允许这样做。
考虑您所需的 URL。存放 NFCCounter 的空间太少了,即 3 字节。因此,以下设置适合更正后的 URL。
https://domain.com?uid=04BB38D2AA1191&ctr=000001&cmac=3ab665b76b795cb9bf76a17956cc9fb3&rand=422def08-8a1c-49c9-9138-434cde858faa
您应将这些参数用于 SDM 配置。您还可以决定 CMAC 计算的输入数据。本例以 UIDOffset 为起点。
fileSettings.sdmMacOffset = intTo2ByteArray(53)
fileSettings.sdmMacInputOffset = intTo2ByteArray(22)
fileSettings.sdmReadCounterOffset = intTo2ByteArray(41)
fileSettings.uidOffset = intTo2ByteArray(22)
致以最崇高的敬意
TapLinx 团队 Re: How can i enable CMAC, UID, COUNTER and RAND in NTAG424 DNA? 本文件可能对您有用。
NTAG 424 DNA 和 NTAG 424 DNA TagTamper 功能和提示
查看全文