c# - 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)
我知道如果身份验证失败,则无法进行进一步的读/写。但就我而言,身份验证成功,然后在对块执行读取时给我一个收发失败。
解决方案
推荐阅读
- python - 在 Django 中发送发布请求后,如何使字段只读?
- swiftui - 如何将 SwiftUI TextField 中的换行符转义序列“\n”处理为换行符?
- android - 计算早晚时间,然后与给定时间比较
- javascript - 我可以使用 pkg 或类似的东西将 MongoDB 与 node js 打包吗?
- c++ - 将`std::condition_variable`放入未实例化的结构中?
- azure-resource-manager - 将存储帐户连接字符串传递给密钥保管库
- android - 如何在 TextInputLayout 中水平居中“标签提示”?
- java - 以编程方式使用 Kubernetes pod 内存
- java - PHP exec 返回状态 1 但为空数组
- c# - Treeview TextBlock 中的动态路径