Android上的Mifare Ultralight C身份验证

Android上的Mifare Ultralight C身份验证,android,authentication,nfc,mifare,3des,Android,Authentication,Nfc,Mifare,3des,我有一些Mifare Ultralight C标记用于测试身份验证 第一次使用应用程序NXP TagInfo阅读时,我可以看到以下信息: (...) Page 04 - Page 27: FULL OF 0s **(empty tag)** Page 28: 00 00 -- -- Page 29: 00 00 -- -- Page 2A: 30 -- -- -- Page 2B: 00 -- -- -- Page 2C: 42 52 45 41 PAGE 2D: 4B 4D 45 49 PAG

我有一些Mifare Ultralight C标记用于测试身份验证

第一次使用应用程序NXP TagInfo阅读时,我可以看到以下信息:

(...) Page 04 - Page 27: FULL OF 0s **(empty tag)** Page 28: 00 00 -- -- Page 29: 00 00 -- -- Page 2A: 30 -- -- -- Page 2B: 00 -- -- -- Page 2C: 42 52 45 41 PAGE 2D: 4B 4D 45 49 PAGE 2E: 46 59 4F 55 PAGE 2F: 43 41 4E 21 完成此操作后,我使用NXP TagInfo应用程序再次读取标签,正如预期的那样,我再也看不到标签信息了。相反,它在所有字段(从04开始)上指示.p XX XX XX,这表明它需要密码才能读取数据

之后(在这里我看不出我的错误),我尝试再次验证标签(通过写入第2C-2F页),但在验证部分的开头出现了这个错误:

System.err:java.io.IOException:收发失败 System.err:at-android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52) 位于android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) 位于android.nfc.tech.MifareUltralight.transceive(MifareUltralight.java:215)**
我看不出我做错了什么…

你做错的是你没有真正实现MIFARE Ultralight C身份验证。在MIFARE Ultralight C标记上,写入页面0x2C..0x2F的操作与命令所述完全相同:它写入该页面,但不执行任何身份验证

相反,MIFARE Ultralight C实现了一个三向相互质询-响应身份验证协议。此协议通过发送认证命令启动:

byte[] result1 = mifare.transceive(new byte[] {
            (byte)0xA1,  /* CMD = AUTHENTICATE */
            (byte)0x00
});

作为对该命令的响应,您将得到一个挑战,您需要使用身份验证密钥解密、操纵、加密并发送回标记,以证明您确实使用了身份验证密钥。您可以在下面的Q/A:.中找到一些实现MIFARE Ultralight C身份验证的代码。

您所说的“相同算法”是什么意思?我的意思是,我试图通过从第2C页到第2F页写入49454D4B41455242214E4143554F5946来进行身份验证,但在尝试接收第一个身份验证字节(49 45 4D 4B)时,我的接收失败了 System.err: java.io.IOException: Transceive failed System.err: at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52) at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) at android.nfc.tech.MifareUltralight.transceive(MifareUltralight.java:215)**
byte[] result1 = mifare.transceive(new byte[] {
            (byte)0xA1,  /* CMD = AUTHENTICATE */
            (byte)0x00
});