如何利用ACR122U读卡器和PyApdu工具欺骗EMV非接卡完成离线交易?
嘿,你已经在ACR122U模拟POS和Visa借记卡的EMV离线非接触交易上迈出了扎实的三步!我来帮你梳理剩下的关键流程,把这事儿搞定:
你已完成的APDU交互回顾
步骤1:列出可用NFC应用
C-APDU:00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 0E
R-APDU:6F 47 84 0E 32 50 41 59 2E 53 59 53 2E 44 90 00步骤2:选择Visa应用(AID)
C-APDU:00 A4 04 00 07 A0 00 00 00 03 10 10 0E
R-APDU:6F 56 84 07 A0 00 00 00 03 10 10 A5 4B 50 90 00步骤3:获取处理选项(GPO)
标准C-APDU参考:80 A8 00 00 23 83 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(注:命令中83标签后的21字节是PDOL处理数据,需要从步骤2的R-APDU解析出PDOL字段后调整)
收到响应后,重点解析应用交互特征(AIP)和应用文件定位器(AFL),这两个是后续步骤的核心依据。
剩余核心步骤指南
步骤4:基于AFL读取应用数据
根据GPO返回的AFL,构造读取记录的APDU命令,格式为:00 B2 [记录号] [SFI] 00
记录号:从AFL的每个条目中提取(比如AFL条目01 0C 00 02表示SFI=0C,需读取记录1到2)SFI:要将AFL中的SFI值左移一位(EMV编码规则:实际SFI值<<1,比如0C对应实际SFI为06)
举个实际例子:
如果AFL包含01 0C 00 02,对应的读取命令为:
- 读取记录1:
00 B2 01 0C 00 - 读取记录2:
00 B2 02 0C 00
需依次读取AFL中所有指定记录,获取持卡人姓名、有效期、PAN等关键应用数据。
步骤5:生成应用密文(核心交易步骤)
构造80 AE命令提交交易数据,格式大致为:80 AE 00 00 [长度] [交易数据块]
交易数据块需严格按照EMV规范组装,核心字段包括:
- 授权金额(12位左补零BCD码,比如100美元对应
000000010000) - 交易日期(MMDDYY格式)
- 终端国家代码(比如840代表美国)
- 终端验证结果(TVR,初始设为全0)
- 交易货币代码(比如840)
- 其他必填字段(根据卡片AIP或DDOL确定)
发送命令后,卡片会返回应用密文(AC)、应用交易计数器(ATC)等数据,离线场景下只需验证ATC是否递增即可确认有效性。
步骤6:交易收尾
发送终止交易的命令完成流程,比如:00 00 00 00
收到90 00响应即表示离线交易完成。
关键注意事项
- TLV解析要准确:PyApdu工具应该自带TLV解析能力,一定要用它正确解析AIP、AFL、PDOL这些字段,差一点都会导致命令失败。
- 交易数据格式不能错:EMV对数据编码要求极严,金额、日期等字段必须严格遵循BCD或TLV格式。
- ACR122U固件适配:部分旧版ACR122U固件可能不支持完整EMV命令集,必要时需升级固件。
内容的提问来源于stack exchange,提问作者Osama Lazim

