首页 > 解决方案 > Android java.io.IOException即使在读取Mifare Classic时认证成功

问题描述

我正在开发一个简单的 Mifare Classic 阅读应用程序。我可以使用默认密钥验证和读取所有扇区,但我的卡的扇区 2 除外。下面是我用于读取数据的 C# 代码。

    bool auth = false;
    byte[] data = null;
    if (auth = mifareClassic.AuthenticateSectorWithKeyA(sectorno, MifareClassic.KeyDefault.ToArray()))
    {
        data = mifareClassic.ReadBlock(addressnum);
        System.Diagnostics.Debug.WriteLine("Data from  the sector:" + sectorno + "  block:" + blockno + " is :" + bytesToHex(data) +". Auth=KeyA");
        readtv.Text = bytesToHex(data);
    }
    else if (auth = mifareClassic.AuthenticateSectorWithKeyB(sectorno, MifareClassic.KeyDefault.ToArray()))
    {
        data = mifareClassic.ReadBlock(addressnum);
        System.Diagnostics.Debug.WriteLine("Data from  the sector:" + sectorno + "  block:" + blockno + " is :" + bytesToHex(data) + ". Auth=KeyB");
    }
    else if (auth = mifareClassic.AuthenticateSectorWithKeyA(sectorno, MifareClassic.KeyNfcForum.ToArray()))
    {
        data = mifareClassic.ReadBlock(addressnum);
        System.Diagnostics.Debug.WriteLine("Data from  the sector:" + sectorno + "  block:" + blockno + " is :" + bytesToHex(data) + ". Auth=KeyNFC");
    }
    else if (auth = mifareClassic.AuthenticateSectorWithKeyB(sectorno, MifareClassic.KeyMifareApplicationDirectory.ToArray()))
    {
        data = mifareClassic.ReadBlock(addressnum);
        System.Diagnostics.Debug.WriteLine("Data from  the sector:" + sectorno + "  block:" + blockno + " is :" + bytesToHex(data) + ". Auth=KeyMAD keyB");
    }
    else if (auth = mifareClassic.AuthenticateSectorWithKeyA(sectorno, MifareClassic.KeyMifareApplicationDirectory.ToArray()))
    {
        //  Here is the error being occurred
        data = mifareClassic.ReadBlock(addressnum);
        System.Diagnostics.Debug.WriteLine("Data from  the sector:" + sectorno + "  block:" + blockno + " is :" + bytesToHex(data) + ". Auth=KeyMAD KeyA");
    }
    else
    {
        Toast.MakeText(this, "Error while authenticating with keyA or KeyB = default", ToastLength.Long).Show();
    }

我可以使用上面的代码成功读取所有带有默认键的扇区。在读取扇区 2 的数据块(块 8、9、10)时,我收到以下异常(在上面的代码中注释了确切的行)。 java.io.IOException: Transcieve failed

这是来自 TagInfo 应用程序的转储。

# Memory content:
Sector 0 (0x00)
[00] r--  FA 6E ED 45 3C 88 04 00 C1 85 14 98 45 30 42 12 |.n.E<.......E0B.|
[01] rW-  D6 01 06 70 05 70 07 70 07 70 07 70 00 00 00 00 |...p.p.p.p.p....|
[02] rW-  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
[03] WXW  A0:A1:A2:A3:A4:A5 78:77:88 C1 XX:XX:XX:XX:XX:XX
          MAD access key                (unknown key)

Sector 1 (0x01)
[04] ???  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[05] ???  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[06] ???  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[07] ???  XX:XX:XX:XX:XX:XX --:--:-- -- XX:XX:XX:XX:XX:XX
          (unknown key)                 (unknown key)

Sector 2 (0x02)
[08] RW-  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[09] RW-  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[0A] RW-  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
[0B] WXW  A0:A1:A2:A3:A4:A5 0F:00:FF AA XX:XX:XX:XX:XX:XX
          MAD access key                (unknown key)
...
...
Sector 4 (0x04)
[10] rwi  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
[11] rwi  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
[12] rwi  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
[13] wxx  FF:FF:FF:FF:FF:FF FF:07:80 69 FF:FF:FF:FF:FF:FF
          Factory default key           Factory default key (readable)

我知道如果身份验证失败,则无法进行进一步的读/写。但就我而言,身份验证成功,然后在对块执行读取时给我一个收发失败。

标签: c#androidnfcrfidmifare

解决方案


推荐阅读