当前位置: 首页 > 知识库问答 >
问题:

与Mifare DESFire EV1的Android NFC通信

浦德义
2023-03-14

使用Nexus 4和最新的Android API level 18与Mifare DESFire EV1 AES标签通信让我头疼。根据恩智浦本机协议,要写入和读取此类标签,必须遵循以下步骤:

  1. 选择应用程序
  2. 身份验证
  3. 写入或读取
-> 5AF4013D
<- 6E00
-> 5AF4013D
<- 00 /*Success*/
-> AA01
<- AFA8394ED57A5E83106B4EE72FD2BB0CC4
-> AF148F525E1DDE0AD6AB60B4B615552475C91F2E8D89B8523E4465113DD5BD19C6 
<- 0066D255C93F2F492AFE3715C88964F1BD /*Authentication success*/
-> 3D02000000030000222222 /*Write 3 bytes to file nº2*/
<- AF /*Unexpected, 0x00 was expected*/

我也用ISO 7816-4 APDU结构进行了同样的尝试。奇怪的是,使用Galaxy Nexus不会发生select应用程序的奇怪响应,而是总是写命令一个。

共有1个答案

王宏扬
2023-03-14

(1)关于状态代码6E00的第一部分:

6E00不是“奇怪字节0x6E+成功状态代码0x00”。相反,它是一个响应APDU状态字6e00(“不支持类”)。这表明之前存在使用基于APDU的访问与该卡进行通信的情况(例如Android本身试图将该卡读取为Type 4标签,之后没有重置连接)。因此,卡将期望所有进一步的通信都在ISO 7816-4 APDU中。在这种情况下(即,如果您接收到一个ISO7816-4状态代码,如6e00),您可以继续使用DESFire APDU包装的命令,只需包装您的本机命令。

编辑:事实上,这在NFC设备上多少是意料之中的行为。这个想法是,NFC设备将自动扫描检测到的标签以获取NDEF消息。在DESFire卡的情况下,NFC设备将检测该卡为潜在的Type 4标签。因此,NFC设备将发送ISO 7816-4 APDU,就像它将发送到任何其他类型4标签一样。因此,如果NFC设备在将检测到的标签交给应用程序之前没有重置与标签的通信,则应用程序只能使用ISO 7816-4 APDU进行通信。但是,请注意,我认为这只发生在同一设备上的某些激活上是一个bug。在我看来,在一个特定的设备模型上的行为应该是一致的。

编辑:所以总结下面的评论。在发送更多的字节(每个接收的0xAF状态代码:AF FF,一次发送一个字节)后,结果显示卡需要多8个字节。8字节正好是用于AES身份验证的CMAC的大小。因此,通信设置被设置为“使用Macing保护的普通通信”。

 类似资料:
  • 问题内容: 我看到有两个类似的线程,但找不到答案。 我正在制作android应用,我想使用node作为服务器进行实时通信。 我真的无法使它正常工作。 可能我把很多事情弄错了,但我想尝试理解。 我的服务器很简单 并且可以正常工作…我通过网络应用程序尝试了此操作,然后就可以连接了。 但是我不能用java .. 我尝试了kryonet,但出现了类似“已连接但注册超时”的异常 我尝试使用weberknec

  • 本文向大家介绍Rust 与通道的跨线程通信,包括了Rust 与通道的跨线程通信的使用技巧和注意事项,需要的朋友参考一下 示例 通道可用于将数据从一个线程发送到另一线程。下面是一个简单的生产者-消费者系统的示例,其中主线程产生值0、1,...,9,而生成的线程将其打印出来:            

  • 问题内容: 我正在尝试使用Applet中的setter方法,将HTML下拉列表中的选定值传递给Applet方法。但是每次调用Javascript时,都会显示“对象不支持此属性或方法”作为例外。 我的JavaScript代码: 我的小程序代码: 我的appletdeployment代码: 问题答案: 更改.. ..至.. ..并且最有可能工作。 例如 HTML Java 还请考虑下一次发布简短的完整

  • 我正在尝试编写一个简单的代码来与数据库通信。但它给出了一个错误。应用程序。属性文件包含指向本地主机、用户名和密码的链接。三行。图像异常文本 主要的Java语言 ConnectionManager.java 物业Util.java 项目 pgAdmin4

  • 官方文档推荐 Kibana在服务器和浏览器上公开两个客户端,以与Elasticserach进行通信。有一个管理客户端用于管理集群的状态,以及一个数据客户端 服务器客户端 在服务器端可以通过以下方式获取: const adminCluster = server.plugins.elasticsearch.getCluster('admin'); const dataCluster = se

  • 我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出

  • 有什么建议可以让我做到这一点吗?

  • 电源模块 蓝牙模块 无线收发模块 Wi-Fi模块