概述
NFC与RFID
- NFC是在RFID的基础上发展而来
- NFC是工作在13.56MHz频率的,而RFID不止这个频率
卡片种类
- 其中非接触式ic卡(不包括id卡)就是工作在13.56MHz这个频率的
- NFC技术支持的卡就是非接触式ic卡,即图中的逻辑加密卡与CPU卡
但是上图并不完善,对对于非接触式IC卡的分类也并不完整,因为技术之间是有重叠的,事实上还有众多其他类型的卡,如Felica、Desfire、Ultralight等。这些卡片之间各有不同,但又有所相通,我们把这些卡片放到一起来讨论最重要的一点就是:都工作在13.56MHz频段上。也正因为这点,NFC技术将以上这些全部包括了。
历史变革
由恩智浦(NXP)公司于1994年生产的MIFARE Classic 1K非接触智能卡,也称之为M1卡,或许是整个NFC技术的先驱。M1卡工作在13.56MHz,数据传输采用曼彻斯特编码,最终演变成ISO 14443 type A标准。一些其他厂商生产的非接触卡,工作在13.56MHz,但在数据传输层采用了非归零编码,最终演变成了ISO 14443 type B标准。由SONY公司生产的FeliCa虽然也工作在13.56MHz,但是并不符合以上两种标准,申请type C 标准失败,至今未进入国际标准中。NFC标准几乎包括了以上所提到的所有在13.56MHz的技术。
图片来源:Philips-NFC-vs-ISO14443-vs-Felica-SLIDES.PDF
图片来源:网络
14443标准概述
14443协议主要分为四个部分
- 14443-1:物理特性
- 14443-2:频谱功率和信号接口(Type A,Type B)
- 14443-3:初始化和防碰撞算法
- 14443-4:传输协议
参考
想了解的更清楚就去各种卡商的网站去逛逛
ISO-IEC+14443+标准中文手册.pdf
Philips-DESFire-vs-Mifare-Classic.pdf
Philips-NFC-vs-ISO14443-vs-Felica-SLIDES.pdf
ID卡、IC卡、RFID卡、NFC卡、Mifare卡各种概念的关系
NFC通信数据的抓取
主要是针对CPU卡进行NFC通信时的数据抓取,目前方法有:
- FIME SMARTSPY CONTACTLESS设备捕获NFC传输数据,购买链接
- 使用NFCGate(Android上的一个Xposed插件),两个手机对整个NFC通信流程做中继,即可捕获数据,Git地址
NFC通信数据的模拟
在对NFC通信过程进行测试时,我们需要对NFC数据进行修改以及重放,于是我们需要模拟卡对读卡器的响应,也要模拟读卡器对卡发送的数据
模拟卡
在文档书写之初,笔者写了如下三种方式可以进行卡的模拟:
- 使用NFC Gate的重放功能,以完成回给读卡器任意数据
- 使用微信小程序提供的NFC接口
- 利用android提供的CardEmulation API来模拟卡的数据
但最终发现,其实前两种的实现方式就是第三种:Android提供的HCE(基于主机的卡模拟)来实现的
参考:https://developer.android.com/reference/android/nfc/cardemulation/package-summary
Class | Info |
---|---|
CardEmulation | This class can be used to query the state of NFC card emulation services. |
HostApduService | HostApduService is a convenience Service class that can be extended to emulate an NFC card inside an Android service component. |
HostNfcFService | HostNfcFService is a convenience Service class that can be extended to emulate an NFC-F card inside an Android service component. |
NfcFCardEmulation | This class can be used to query the state of NFC-F card emulation services. |
OffHostApduService | OffHostApduService is a convenience Service class that can be extended to describe one or more NFC applications that are residing off-host, for example on an embedded secure element or a UICC. |
其实还可以使用PM3来模拟NFCtag,这里笔者没有继续研究下去。而按着HCE的这条道走下去来模拟卡是较为简单的,具体步骤请参考:AndroidHCE开发.md
模拟读卡器
- 使用复旦微电子提供的FM8301读卡器以及COST工具,通过构造cos脚本来完成读卡器的任意数据发送
- 使用通用的读卡器如Identive Cloud 4700F配合pyscard等工具进行读卡(长伯加油)
- 使用android提供的的API:android.nfc.tech
这里我们还是重点放在Android提供的API上,因为这种成本最低
参考:https://developer.android.com/reference/android/nfc/tech/package-summary
Class | Info |
---|---|
IsoDep | Provides access to ISO-DEP (ISO 14443-4) properties and I/O operations on a Tag . |
MifareClassic | Provides access to MIFARE Classic properties and I/O operations on a Tag . |
MifareUltralight | Provides access to MIFARE Ultralight properties and I/O operations on a Tag . |
Ndef | Provides access to NDEF content and operations on a Tag . |
NdefFormatable | Provide access to NDEF format operations on a Tag . |
NfcA | Provides access to NFC-A (ISO 14443-3A) properties and I/O operations on a Tag . |
NfcB | Provides access to NFC-B (ISO 14443-3B) properties and I/O operations on a Tag . |
NfcBarcode | Provides access to tags containing just a barcode. |
NfcF | Provides access to NFC-F (JIS 6319-4) properties and I/O operations on a Tag . |
NfcV | Provides access to NFC-V (ISO 15693) properties and I/O operations on a Tag . |
可见Android对于几乎所有的NFC的tag都提供了相应的API,直接调用即可。所以完全可以通过Android来实现一个全能的读卡器。笔者要颠了,没时间完成了,sorry。(谁来接盘!!!)