编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.IC实体卡介绍说明
  • 02.M1实体卡读写技术
  • 03.CPU实体卡读写技术
  • 04.PSAM卡读写技术
  • 05.键盘按键监听实践
  • 06.USB开发设计实践
  • 08.设备串口通信实践

03.CPU实体卡读写技术

目录介绍

  • 01.基础概念说明
    • 1.1 CPU操作流程
    • 1.2 读卡器与卡交互指令
    • 1.3 APDU指令格式
    • 1.4 APDU指令组成
    • 1.5 发送指令详细剖析
    • 1.6 响应指令详细解析
  • 02.常见思路和做法
    • 2.1 CPU刷卡流程
    • 2.2 读CPU卡流程
    • 2.3 写CPU卡流程
    • 2.6 CPU发卡流程
  • 03.Api调用说明
  • 04.遇到的坑分析
  • 05.其他问题说明
  • 06.技术问题思考&分析

01.基础概念说明

1.1 CPU操作流程

  • 如何去操作CPU卡
    • 手机去感应非接触式CPU卡一般都是通过NFC,想用手机去感应身份证有两个前提:一你手机支持NFC功能,二你得知道对操作身份证的指令。
    • 比如读取身份的指令,知道指令后你就可以开发个手机app然后进行感应读取身份。
  • 读卡器APDU流程,接触过的读卡器基本都下面这些步骤,基本相同,不同的是命令发送和数据解析
    • ICC(接触读取):1.打开阅读器;2.对卡片上电;3.获取ATR(接触卡状态检测,是否存在卡片)和协议;4.APDU通讯;5.下电;6.关闭阅读器
    • PICC(非接触读取):1.打开阅读器;2.寻找卡片;3.APDU通讯;4.关闭阅读器

1.2 读卡器与卡交互指令

  • 1.读卡器与卡交互第一步一般是选择应用。
    • 一张IC卡里面可能有多个应用,所谓应用就是卡片和终端之间的应用协议和相关的数据集,读卡器和卡的交互其实就是和应用的交互,卡的交易其实就是选择某个应用做交易。
    • 目前卡商所生产的卡基本上都是一个应用,即便如此,但根据银联卡的规范,应用选择这个步骤也是必不可少的。
  • 2.第二步根据上面的返回数据做下一步操作,并最终拿到结果
    • 如果是一般卡(非银联卡),响应数据就是想要的数据是直接数据,进行转码就可以达到想要的数据。

1.3 APDU指令格式

  • APDU应用场景介绍
    • APDU提供了一种标准的、协议无关的方法,用于智能卡和终端设备进行通信。它是智能卡系统的核心组件,广泛应用于银行卡、身份证、健康卡等各种应用场景。
  • APDU是什么东西
    • ISO 7816-4规范有定义APDU(= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令)
  • 进行APDU通讯的前提是:
    • 有读卡器(必选)和对应的SDK通讯包(可选)
    • 知道IC卡的APDU命令
  • APDU是智能卡与智能卡读卡器之间传送的信息单元
    CLAINSP1P2LcDataLe
    指令类别指令码参数P1参数P1Data的长度(不超过255个字节)返回数据表示响应时回答的数据字节数,0表是需要最大可能长度(不超过255个字节)
  • APDU命令格式分类(报文结构,从终端设备发出的命令和卡片信息必须按照四种格式发送)
    • ① 情形1:CLA INS P1 P2 00
    • ② 情形2:CLA INS P1 P2 Le
    • ③ 情形3:CLA INS P1 P2 Lc Data
    • ④ 情形4:CLA INS P1 P2 Lc Data Le
  • APDU响应报文(响应数据 响应状态码)
    • Data SW1 SW2 如何理解?DATA:返回给用户的数据,即命令的执行结果。SW1、SW2: 返回命令处理的状态。
    • 响应也对应几种情形 ① 情形1:SW1 SW2;② 情形2:Le字节的Data SW1 SW2

1.4 APDU指令组成

  • APDU指令由四个部分组成:
    • CLA(Class):指令类别,用于确定指令所属的指令集,如00表示标准指令集,80表示安全指令集。
    • INS(Instruction):指令代码,用于区分执行的操作,如06表示比较指令,0A表示读二进制文件指令。
    • P1(Parameter 1)和P2(Parameter 2):用于提供有关指令的附加信息,如P1-P2可以指定要读取或写入的数据块的位置、长度、偏移量等。
    • Lc(Length of command data):用于指定指令的数据长度。
    • Data:用于传输指令数据,如读取或写入指定的内存块或文件。
  • APDU响应部分包括两个部分:
    • 响应数据的数据长度(Le):用于指定响应数据的长度,可以在命令中指定也可以由智能卡决定。
    • 响应数据的实际内容:用于传输操作结果。
  • APDU在智能卡和读卡器之间进行通信
    • 包含两个部分:C-APDU(指令)和R-APDU(响应)。C-APDU被发送给智能卡,智能卡处理以后返回一个R-APDU进行响应。

1.5 发送指令详细剖析

  • 例子:/send 00A4040006A00000000101
    • 这条指令是一个APDU指令,用于选择与AID(Application Identifier,应用标识符)相对应的应用程序。
  • 具体来说,它的结构如下:
    • CLA(Class):0x00 表示标准指令集
    • INS(Instruction):0xA4 表示选择文件命令
    • P1(Parameter 1):0x04 表示选择应用程序的命令模式
    • P2(Parameter 2):0x00 表示选择应用程序的第一组(或唯一一组)文件,这是应用程序的根文件
    • Lc(Length of command data):0x06 表示接下来有6个字节的数据
    • Data:A00000000101 表示应用标识符(AID),它是一个16进制数字串,用于确定要选择的应用程序
  • 以此为例
    • 发送该APDU指令可以将具有AID为A00000000101的应用程序选择为活动应用程序,并通过通道来与其通信

1.6 响应指令详细解析

  • 例子:
    • 第一个响应指令,9FE7398E9000;第二个响应指令,9000
  • 先来看第一个指令:9FE7398E9000
    • 属于Le字节的Data SW1 SW2状态,那么它是什么含义?Le表示响应data,SW1表示命令处理状态;SW2表示命令处理限定。
    • 那么9FE7398E9000拆分,即可Le是9FE7398E,SW1是90,SW2为00,整体意义解读执行成功。
  • 再来看第二个指令:9000
    • 属于SW1 SW2状态,那么它是什么意义?SW1表示命令处理状态;SW2表示命令处理限定。
    • 那么9000拆分,即可SW1是90,SW2为00,整体意义解读是正确执行。

02.常见思路和做法

2.1 CPU刷卡流程

  • CPU刷卡流程
    • 第一步:获取卡号
    • 第二步:复位
    • 第三步:选择文件
    • 第四部:获取随机数
    • 第五步:拿到密钥
    • 第六步:获取读取cpu卡16文件的指令
    • 第七步:读取16文件数据

2.2 读CPU卡流程

  • 第一步:选择目录(目录ID为十六进制1680)
    • 发送 00 A4 00 00 02 16 80,返回:目录信息+90 00表示成功
  • 第二步:选择文件(目录ID为十进制00 01,如果写的是1号文件)
    • 发送 00 A4 00 00 02 00 01,返回:90 00表示成功
  • 第三步:取随机数
    • 发送 00 84 00 00 04,返回:4字节随机码+90 00表示成功
  • 第四步:认证文件密码(用该文件的只读密码,文件1的只读密码用的是第((文件号1-1)*2=0)号密码,下面指令的第3个字节为0)
    • 发送 00 82 00 00 08 与随机码换算后的密码信息,返回:90 00表示成功
  • 第五步:读数据(读出从00 00 字节开始的2个字节数据)
    • 发送 00 B0 00 00 02

2.3 写CPU卡流程

  • 第一步:选择目录(目录ID为十六进制1680)
    • 发送 00 A4 00 00 02 16 80,返回:目录信息+90 00表示成功
  • 第二步:选择文件(目录ID为十进制00 01,如果写的是1号文件)
    • 发送 00 A4 00 00 02 00 01,返回:90 00表示成功
  • 第三步:取随机数
    • 发送 00 84 00 00 04,返回:4字节随机码+90 00表示成功
  • 第四步:认证文件密码(用该文件的读写密码,文件1的读写密码用的是第((文件号1-1)*2+1=1)号密码,下面指令的第3个字节为0)
    • 发送 00 82 00 01 08 与随机码换算后的密码信息,返回:90 00表示成功
  • 第五步:写数据(写入从00 00 字节开始的2个字节数据AA BB)
    • 发送 00 D6 00 00 02 AA BB,返回:90 00表示成功

2.6 CPU发卡流程

  • https://blog.csdn.net/weixin_41485217/article/details/88415850

03.Api调用说明

04.遇到的坑分析

05.其他问题说明

06.技术问题思考&分析

6.1 技术问题思考

6.2 技术问题分析

参考博客

  • IC卡(智能卡)APDU通讯总结
    • https://blog.csdn.net/u011082160/article/details/122637253
  • CUP卡操作指令集
    • https://www.cnblogs.com/gengtongyu/p/15737609.html
  • 复旦微电子CPU卡发卡流程
    • https://blog.csdn.net/wowocpp/article/details/80005194
  • CPU卡基本指令
    • https://blog.csdn.net/qq_39907988/article/details/132343206
    • https://www.cnblogs.com/gengtongyu/p/15737609.html
    • https://blog.51cto.com/u_15307523/3133281
贡献者: yangchong211
上一篇
02.M1实体卡读写技术
下一篇
04.PSAM卡读写技术