复旦FM17522芯片读写M1卡、CPU卡学习
2016-10-14 15:29
274 查看
一、 概述
四部分:PC/STM32 读卡器模块 卡特性 协议
UART/SPI 读卡芯片 S50/70 复旦CPU卡 ISO/IEC 14443 A
解决三方面问题:
卡怎么用
读卡芯片怎么用
M3与读卡芯片的通信
二、 卡特性
卡的存储结构/文件结构
M1卡存储结构
1. M1卡(S50/S70)的存储结构:2. 控制块的结构:
复旦CPU卡的文件结构
以读写二进制示例为例:初始化卡的时候必须要添加密钥文件,其作用是控制添加其他密钥的权限;
二进制文件在创建的时候定义了其读写的权限;
所有种类的密钥文件都有密钥标示,该字节的作用是标识多个同类型密钥,实现密钥索引的功能;
卡的权限管理方式
控制字
1. 存取控制中每个块都定义了3个控制位:三个控制为以正和反两种形式,按规定的位置存放在控制字节中的前三个字节,这三个字节最终的值最终确定了该块的访问权限。
2. 控制位在控制字节中定义的位置:
3. 数据块的“权限-控制位值”表:
4. 控制块的“权限-控制位值”表:
安全状态寄存器
FMCOS 通过核对口令和外部认证来改变当前文件夹下安全状态寄存器的值。例:
设卡中某目录下有一个二进制文件,定义读二进制文件的权限为F1,写二进制文件权限为F2。该目录下有一个口令密钥,口令核对通过之后的后续状态为1,卡中有一外部认证密钥,使用权限为11,外部认证通过之后后续状态为2。
此处必须先认证外部口令成功之后才有使用口令密钥的权限。
卡的认证
M1卡在选卡成功之后,会进行“三次互相验证”。CPU在进入目录后,进行外部认证和内部认证。
M1卡的三次互相认证
复旦CPU卡的外部认证和内部认证
CPU卡外部认证步骤:1、CPU卡产生一个8字节随机数送给外部程序,CPU卡临时保存随机数在卡内
2、外部程序把8字节随机数送给机具,机具用密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给CPU卡
4、CPU卡在卡片内部解密8字节随机数得到随机数明文,
5、CPU卡在卡片内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则外部认证成功,所以外部认证是CPU卡认证机具
机具内部认证步骤:
过程与外部验证一样,只是认证方被认证方调换。
1、机具产生一个8字节随机数送给外部程序,机具临时保存随机数在机具中
2、外部程序把8字节随机数送给CPU卡,CPU用内部认证密钥计算随机数,得到8字节随机数密文
3、外部程序把8字节随机数密文送给机具
4、机具解密8字节随机数得到随机数明文
5、机具在内部把解密后的随机数和步骤1中临时存放的随机数比对,若相等,则内部认证成功,所以内部认证是机具认证CPU卡
两种卡认证的机制相似,不同点在于内、外部验证一开始传的都是明文随机数,如果采用这两个认证的组合来认证M1卡,那需要更多的交互次数。
发卡流程
基于读卡器指令、COS指令的发卡流程举例:M1卡发卡流程
关闭自动寻卡复合寻卡(包括寻卡、防冲突、选卡)
密钥验证
写控制块(修改密钥)
新的密钥的验证
写控制块(修改控制字)
复合写块(包括密钥验证、写块)
复旦cpu卡发卡流程
FMCOS激活选择MF
外部认证
删除MF目录下的文件
创建MF下新的密钥文件
添加外部认证密钥
建立子目录
选择子目录
创建子目录密钥文件
添加子目录下外部认证
添加口令密钥
外部认证
验证口令
创建二进制文件
选择文件
写文件
停活
三、 读卡器模块
当前是熟悉模块厂商设定的操作指令,这也是学习各种卡片特性、操作COS指令的良好工具。有待熟悉读卡器芯片,查找资料,学习如何使用。
四、 PC/STM32端
编写Linux环境下串口操作程序,实现与读卡器交互数据,熟悉函数字符串操作、熟悉函数封装、熟悉对相应返回数据的处理。char* str_to_cmd(char* str, char count);
void print_cmd(char *ptr, char count);
int read_rfid(int fd, char **data);
int write_rfid_base(int fd, char *buff,unsigned char num);
int read_rfid_atomod(int fd);
有待熟悉STM32开发环境,进行串口/SPI编程。
五、 ISO/IEC 14443 TYPE A协议
这两种卡都是在ISO/IEC 14413 TYPE A协议下操作。ISO/IEC 14413标准共有四层:
ISO/IEC 14413-1,规定物理特性
ISO/IEC 14413-2,规定了射频能量和型号接4口,这一层有TYPE A和TYPE B两种空中接口
ISO/IEC 14413-3,防碰撞协议
ISO/IEC 14413-4,传输协议
M1卡的流程
寻卡-防冲突-选卡-ATS,协议中规定了若干命令(通过这些命令与支持该协议的读卡器芯片交互)来实现这个流程。这些发送或者接受命令具有特定的帧结构,如ATQA应答命令中有厂商编码、UID大小等信息,在ISO/IEC
14413-3层,选卡命令SELECT之后,卡返回SAK应答命令的结构中b6 = 0,表示该卡不支持ISO/IEC 14413-4,则可判断该卡不是cpu卡。
复旦CPU卡的流程
前面三步和M1操作完全一样,属于ISO14443A前面三层的操作,ATS成功后就进入ISO14443A-4协议层了,也就进入了CPU卡的操作层。ISO/IEC 14413 A 规定的命令集
REQA/WUPAATQA应答
ANTICOLLISION
SELECT
SAK
RATS
ATS
读卡器芯片是在这些命令的基础上来与卡片交互,双方都遵从ISO/IEC 14413A协议,对协议的学习和理解还有待深入。
未完待续,2016.09.08-hxk
相关文章推荐
- 复旦FM17522芯片读写M1卡(S50/S70)、CPU卡
- 复旦FM1208 CPU卡调试
- 复旦FM1208 CPU卡调试(转)
- 文件读写学习笔记
- 孙鑫VC学习笔记:第十二讲 读写注册表
- Windows窗体编程基础学习:文件读写
- 一个非常非常非常基础的程序,写的不好,但是一般的文件读写操作及字符处理函数都涉及到了..新手学习用的
- 孙鑫VC学习笔记:第十二讲 用C++函数读写文件
- Java IO学习基础之读写文本文件
- 孙鑫VC学习笔记:第十二讲 (三) 用C++函数读写文件
- 资源文件的读写和查找(进一步学习中)
- Java IO学习基础之读写文本文件
- C#2.0 IO学习之读写二进制文件
- Java IO学习基础之读写文本文件
- 孙鑫VC学习笔记:第十二讲 (二) 用C语言函数读写文件
- Java IO学习基础之读写文本文件
- 文件读写学习笔记
- 孙鑫VC学习笔记:第十二讲 用C语言函数读写文件
- python文件读写实例学习笔记
- Java IO学习基础之读写文本文-Java基础-Java-编程开发