【问题标题】:Mifare Ultralight C Authentication on AndroidAndroid 上的 Mifare Ultralight C 身份验证
【发布时间】:2018-06-17 22:36:43
【问题描述】:

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

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

(...) 第 04 页 - 第 27 页:全 0 **(空标签)** 第 28 页:00 00 -- -- 第 29 页:00 00 -- -- 第 2A 页:30 -- -- -- 第 2B 页:00 -- -- -- 第 2C 页:42 52 45 41 第 2D 页:4B 4D 45 49 第 2E 页:46 59 4F 55 第 2F 页:43 41 4E 21

页面 2C - 2F 表示它有默认键“BREAKMEIFYOUCAN!” (425245414b4d454946594f5543414e21)。

然后我运行了我的 Android 应用程序,它基本上是这样做的:

  1. 从第 2C 页到第 2F 页写 49454D4B41455242214E4143554F5946(用于验证)。

  2. 在第 2A 页 (42) 处写入 0x04;表示 2A 中的所有页面都需要身份验证。

  3. 在第 2B (43) 页写入 0x00;意味着读写都需要认证。

//Start authenticating
byte[] result1 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2C,  /* PAGE = 44    */
                (byte)0x49, (byte)0x45, (byte)0x4D, (byte)0x4B  /* 49 45 4D 4B */
        });

byte[] result2 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2D,  /* PAGE = 45    */
                (byte)0x41, (byte)0x45, (byte)0x52, (byte)0x42  /* 41 45 52 42 */
        });

byte[] result3 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2E,  /* PAGE = 46    */
                (byte)0x21, (byte)0x4E, (byte)0X41, (byte)0X43  /* 21 4E 41 43 */
        });

byte[] result4 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2F,  /* PAGE = 47    */
                (byte)0X55, (byte)0X4F, (byte)0X59, (byte)0X46  /* 55 4F 59 46 */
        });
//Finish authenticating

//Say the pages the card needs authentication
byte[] result5 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2A,  /* PAGE = 42    */
                (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x00  /* Message = All pages after 04 needs authentication */
        });

byte[] result6 = mifare.transceive(new byte[] {
                (byte)0xA2,  /* CMD = WRITE */
                (byte)0x2B,  /* PAGE = 43    */
                (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00  /* Message = authentication is required both for reading and writing */
        });
//Finish "card activition"

完成此操作后,我使用 NXP TagInfo 应用程序再次读取了标签,正如预期的那样,我再也看不到标签信息了。取而代之的是,它在所有字段(从 04 开始)上都显示了 .p XX XX XX XX,这表明它需要密码才能读取数据。

在那之后(这里是我看不到我的错误的地方)我尝试再次验证标签(通过写入页面 2C - 2F),但我在验证部分的开头收到此错误:

System.err:java.io.IOException:收发失败 System.err:在 android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52) 在 android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151) 在 android.nfc.tech.MifareUltralight.transceive(MifareUltralight.java:215)**

我看不出我做错了什么......

【问题讨论】:

  • “相同算法”是什么意思?
  • 我的意思是我试图通过从第 2C 页到第 2F 页写入 49454D4B41455242214E4143554F5946 来进行身份验证,但是当我尝试收发第一个身份验证字节 (49 45 4D 4B) 时收发失败跨度>

标签: android authentication nfc mifare 3des


【解决方案1】:

您做错了什么是您实际上没有实施 MIFARE Ultralight C 身份验证。在 MIFARE Ultralight C 标签上,写入页面 0x2C..0x2F 完全符合命令所说的:它写入到该页面,但它确实执行任何身份验证。

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

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

响应该命令,您将收到一个质询,您需要使用身份验证密钥对其进行解密、操作、加密并发送回标签,以证明您确实拥有身份验证密钥。您可以在此 Q/A 中找到一些实现 MIFARE Ultralight C 身份验证的代码:Android: Authenticating with NXP MiFare Ultralight C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多