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是智能卡与智能卡读卡器之间传送的信息单元
CLA INS P1 P2 Lc Data Le 指令类别 指令码 参数P1 参数P1 Data的长度(不超过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