gpt4 book ai didi

Android NFC IsoDep 读取文件内容

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:47:26 32 4
gpt4 key购买 nike

我正在尝试从 ISO/IEC 14443 Type A 卡中读取一些信息。

在用安卓应用程序 NFC TagInfo 分析卡片后,我发现应用程序 (AID: 15845F) 有我需要的特定文件 (文件 ID: 01)。

我已经成功连接到卡并选择了应用程序。

String action = getIntent().getAction();
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))
{
Tag tagFromIntent = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.i(TAG, Arrays.toString(tagFromIntent.getTechList()));

IsoDep isoDep = IsoDep.get(tagFromIntent);
try
{
isoDep.connect();

byte[] SELECT = {
(byte) 0x00, // CLA = 00 (first interindustry command set)
(byte) 0xA4, // INS = A4 (SELECT)
(byte) 0x04, // P1 = 04 (select file by DF name)
(byte) 0x0C, // P2 = 0C (first or only file; no FCI)
(byte) 0x06, // Lc = 6 (data/AID has 6 bytes)
(byte) 0x31, (byte) 0x35,(byte) 0x38,(byte) 0x34,(byte) 0x35,(byte) 0x46 // AID = 15845F
};

byte[] result = isoDep.transceive(SELECT);
Log.i(TAG, "SELECT: " + bin2hex(result));

if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00))
throw new IOException("could not select application");

byte[] GET_STRING = {
(byte) 0x00, // CLA Class
(byte) 0xB0, // INS Instruction
(byte) 0x00, // P1 Parameter 1
(byte) 0x00, // P2 Parameter 2
(byte) 0x04 // LE maximal number of bytes expected in result
};

result = isoDep.transceive(GET_STRING);
Log.i(TAG, "GET_STRING: " + bin2hex(result));
}
}

但我的第二个查询失败,错误代码为:6A86(参数 P1-P2 不正确)。我已经搜索了很多并找到了不同的文档(例如:http://bit.ly/180b6tB),但我只是不明白,我如何才能为 P1P2 实现正确的值.


编辑

使用NFC TagInfo的卡标签类型:ISO/IEC 14443-4 Smart Card, Mifare DESFire EV1 (MF3ICD81)

源代码中使用的 SELECT 命令实际上并没有失败,而是返回了 9000 响应。所以这就是我认为一切正常的原因。

您提到 NFC TagInfo 没有为 DF 名称等提供正确 值。0x313538343546 值是否正确,您是如何做到的找到了吗?

你能给我一个简短的描述吗?我怎样才能得到我想要的数据?是否有任何其他 android 应用程序可用于读取正确的 DF 名称、AID 等?我基本上需要从 ONE 应用程序中获取 ONE 文件。如果需要,我还可以提供一些使用 NFC TagInfo 收集的信息的屏幕截图。


编辑 2

我重写了命令,但(如您所建议的)将它们保留在 APDU 包装器中。因此,我最终得到了两个不同的命令,一个用于选择应用程序,另一个用于选择文件

private final byte[] NATIVE_SELECT_APP_COMMAND = new byte[]
{
(byte) 0x90, (byte) 0x5A, (byte) 0x00, (byte) 0x00, 3, // SELECT
(byte) 0x5F, (byte) 0x84, (byte) 0x15, (byte) 0x00 // APPLICATION ID
};
private final byte[] NATIVE_SELECT_FILE_COMMAND = new byte[]
{
(byte) 0x90, (byte) 0xBD, (byte) 0x00, (byte) 0x00, 7, // READ
(byte) 0x01, // FILE ID
(byte) 0x00, (byte) 0x00, (byte) 0x00, // OFFSET
(byte) 0x00, (byte) 0x00, (byte) 0x00, // LENGTH
(byte) 0x00
};

搜索原生 Mifire-Desfire 命令的教程没有成功,所以我坚持使用以下教程:http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html

本教程提供了卡验证,我禁用了它,并且还使用了transceive 方法,据我所知,这不是执行 native 命令的正确方法吗?哪种方法(甚至可能是代码 fragment )用于执行 native 命令?我应该使用哪个 Android 类?

我已经重写了教程中提供的类并上传到pastebin .执行该类(class)后,我得到了以下结果。

Select APPLICATION: 9100
Read DATA: 91AE

在这一点上,我很困惑,不知道下一步应该做什么。实际上是错误还是我应该对查询执行哪些更改才能获得我想要的数据?

最佳答案

鉴于您从 NFC TagInfo 中提取的信息和您尝试使用的命令,我假设该卡是 MIFARE DESFire EV1。正确吗?

关于您的选择命令:NFC TagInfo 当前不读取 DESFire EV1 的 ISO 命令集中使用的 DF 名称值。因此,我假设为此应用程序设置的 DF-name 实际上是 0x313538343546,否则 SELECT 命令应该会失败。但是请注意,这个值绝不是从 NFC TagInfo 中显示的 DESFire AID 推导出来的!事实上,DF 名称是在应用程序创建期间定义的单独值。 (这与以前的 DESFire 版本不同。)

关于您的 READ BINARY 命令:您使用的命令意味着您之前选择了一个文件。但是,您只选择了应用程序。因此,您需要为数据文件发出 SELECT 命令或在 READ BINARY 命令中使用短文件 ID:

byte[] READ_BINARY = { 
(byte) 0x00, // CLA Class
(byte) 0xB0, // INS Instruction
(byte) 0x80, // P1 (indicate use of SFI)
(byte) 0x01, // P2 (SFI = 0x01)
(byte) 0x04 // LE maximal number of bytes expected in result
};

但是,当涉及到 DESFire (EV1) 时,我建议您坚持使用 DESFire native 命令集(直接或包装)而不是使用 ISO 7816-4 APDU。

使用 native 命令集,您可以获得 MIFARE DESFire 的全部功能。命令包装是通过将 native DESFire 命令嵌入 ISO 7816-4 APDU 结构来完成的。包装命令如下所示:

0x90 CMD 0x00 0x00 LEN CMD-PARAM 0x00

其中 CMD 是 native DESFire 命令,CMD-PARAM 是命令参数。响应是:

[DATA] 0x91 STATUS

其中 status 是 native DESFire 状态代码。如果 STATUS 为 0xAF,您可以通过发出此命令来获取剩余的响应数据:

0x90 0xAF 0x00 0x00 0x00

因此,在您的情况下,您将为应用程序 0x15845F 发出选择应用程序命令(注意不同的字节顺序!):

0x90 0x5A 0x00 0x00 3 0x5F 0x84 0x15 0x00
|SELECT| |APPLICATION ID|

然后,您要读取数据文件 0x01(整个文件,从偏移量 0 开始):

0x90 0xBD 0x00 0x00 7 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
|READ| |FILE| OFFSET | LENGTH |

关于如何获取应用程序的 ISO DF 名称和 ISO FID 的问题,您可以尝试以下命令:

选择主应用:

905A00000300000000

获取包括其 DF 名称的应用程序:

906D000000

选择您的应用:

905A0000035F841500

获取 DESFire FID:

906F000000

获取 ISO FID:

9061000000

您始终可以使用 IsoDep 对象的 transceive() 方法。无论如何都使用 IsoDep(即 ISO/IEC 14443-4)(用于 native DESFire 命令、包装的 native 命令和 ISO 7816-4 命令)。

您从卡 (0xAE) 收到的错误代码表示身份验证错误(有关详细信息,请参阅此数据表:DESFire)。因此,该文件允许经过身份验证的只读(请参阅 NFC TagInfo 中显示的访问条件)。

因此,为了读取此文件,您需要执行身份验证程序。

关于Android NFC IsoDep 读取文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19296595/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com