MIFARE Classic S50技术详解
Mifare Classic 简介
MIFARE Classic是恩智浦半导体开发的可用于非接触式智能卡,符合ISO/IEC 14443 A类标准。用于公共交通票证等应用,还可用于各类其他应用有S20,S50(M1),S70几种规格,主要是根据存储器容量划分,存储器容量分别有320B,1K,4K。具有以下防干扰、轻松简便以及安全等特性:
- 防干扰
智能防干扰功能允许同时有多张卡在现场工作。防干扰算法分别选择每一张卡,并确保选定的卡正确执行交易,不会受到现场另一张卡的干扰。
- 轻松集成,使用简便
针对轻松集成和使用简便而设计,允许在不到100 ms的时间内完成整个票证交易。
- 安全
· 每器件具有制造商编程的7字节UID或4字节NUID标识符
· 支持随机ID
· 三道双向认证(ISO/IEC DIS 9798-2)
· 每扇区提供两组独立的密钥,支持多用途密钥体系
本文以S50进行着重讲解,对于S20及S70可访问官方网站详细了解。
逻辑框图
对于S50来说,芯片由1KB E2P,非接接口,数字控制单元组成。其中:
- 非接接口(RF Interface),包括:
· 调制解调器(Modulator/demodulator)
· 整流器(Rectifier)
· 时钟再生器(Clock regenerator)
· 上电复位(Power-On Reset )
· 电压调节器(Voltage regulator)
- 防冲突管理
- 认证管理
- 控制和算术逻辑单元
- 存储器及访问接口:对于S50来说,存储器(E2P)只需要1KB分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位。
- 加密单元
执行流程
执行流程包括三个部分,分别是初始化及选择过程,认证过程以及数据操作过程,如下图所示:
· 呼叫
读卡器发送 REQA/WUPA 命令,卡返回 ATQA 的过程。
· 防冲突循环
在防冲突循环过程中将读取卡片的ID,如果存在多张卡,则通过ID进行区别,并选择一张卡进一步处理,其它卡回到 IDLE 状态等待REQA/WUPA 命令。
· 选卡
读写器发送 SELECT,卡返回 SAK 的过程, SAK 指示当前卡是否支持 14443-4 协议和 UID 是否完整。
· 三轮认证
选卡后,读写器指定后续读写的存储器位置,并用相应密钥进行三轮认证。认证成功后,所有的存储器操作都是加密的。
· 存储器操作
认证后可执行下列操作:
- 读块
- 写块
- 减值:减少数值块内的值,并将结果保存在数据寄存器中。
- 加值:增加数值块内的值,并将结果保存在数据寄存器中。
- 恢复:将数据块内容移入数据寄存器。
- 转存:将数据寄存器的内容写入数值块。
数据存储结构
- 厂商代码块
这是第 0 区的第 0 块存储制造商代码,它含有 UID 和厂商数据,只读。如果是4字节UID,则0~3字节为序列号,第4字节为校验字节(异或值),第5字节国卡片容量,第6、7字节为卡片类型。
- 数据块
所有扇区都由3个块组成,每个块由16字节用于存储数据(扇区0只有两个数据块,一个只读的厂商数据块)。数据块可以设置为:
· 读写块,例如用于非接触门禁管理,有效命令: read, write
· 数值块,例如用于电子钱包。
- 数值块
数值块允许执行电子钱包功能(有效的命令是:读、写增量、减量、恢复、转移)。数值块有一个固定的数据格式允许错误检测和校正和备份管理。
· 数值:有符号 4 字节数值。数值的最低字节存储在最低地址字节。负值以标准的 2 的补码形式存储。数值存储三次,两次不取反,一次取反。
· 地址( Adr): 1 字节绝对地址,当进行备份管理时,可用于保存块的地址(即地址不一定与当前的块号相同)。地址保存四次,两次取反,两次不取反。在 increment、decrement、 restore 和 transfer 操作中,地址保持不变。它只能通过 write。
例:
对于十进制数1234567,地址17来说,首先十进制数转成十六进制为0x0012D687,低字节存储在第0字节,高字节为第3字节,补码为0xFFED2978,低字节存储在第4字节,高字节存储在第7字节。对于十六进制的地址0x11来说,补码为0xEE。存储结果如下表所示:
- 尾块
各区均有一个尾块,存有:
· 密钥 A 和 B(可选):卡片发行时,所有的密钥被设置为 FFFFFFFFFFFF。如果读密钥的权限不满足则读出的密钥值为全 0.
· 该区四个块(或16个块)的读写条件,存储在字节 6 至 9 。读写控制位也指定了数据块的类型(读写块或数值块)。
如果不需要密钥 B,尾块的最后 6 字节可以用作数据字节。尾块的字节 9 可用于用户数据。此字节享有与字节 6、 7、 8 相同的读写权限。对于访问条件,参考后面章节的详细说明。
访问控制
任何内存操作之前,卡必须选择和验证,对一个特定的块的访问,依赖于验证过程中的密钥以及存储在当前的扇区尾部的访问条件。内存操作如下表所示:
- 访问条件
每个数据块和尾块的访问条件是由3位数据组成,在访问条件及其补码形式存储在指定块的尾块中。
访问控制位使用密钥A和密钥B控制内存的访问,访问条件可能会改变,只要知道相关的密钥和当前访问条件即允许此操作。如下图所示:
- 控制位的组成
- 尾块访问条件
根据尾块的访问控制位,对于key的读/写访问的权限包括:never,keyA,keyB或者keyA|B。
卡片发行时的控制字节为: FF078069,即:
C10 C20 C30=000,块 0 的读、写、增、减、恢复、传送的权限都是 key A 或 keyB
C11 C21 C31=000,块 1 的读、写、增、减、恢复、传送的权限都是 key A 或 keyB
C12 C22 C32=000,块 2 的读、写、增、减、恢复、传送的权限都是 key A 或 keyB
C13 C23 C33=001,块 3 的 keyA 读权限 never, keyA 的写权限、 Access bits 和 keyB 的读写权限都是 keyA。
例一: C11 C21 C31=010,即块 1 的读权限为 keyA/keyB,写、增、减、恢复、传送的权限为never。修改尾块的值为: FFFFFFFFFFFFDF078200FFFFFFFFFFFF
例二: C1x C2x C3x=111,即数据块的所有权限都为 never,尾块的读控制字节权限为 keyA|B,
其它权限为 never。
修改尾块的值为: FFFFFFFFFFFF00F0FF00FFFFFFFFFFFF
- 数据块访问条件
根据访问控制位的数据块(块0~2),读/写访问被指定为“从不”,“KeyA”,“KeyB”或“KeyA| B”。访问控制位定义了应用程序和相应的适用的命令。
•读/写块:允许读和写操作。
•数值块:允许额外的值操作,增量、减量、转移和恢复。
•制造商块:只读,不受访问控制位设置影响!
•密钥管理:在运输时配置必须用于身份验证的KeyA
执行命令
MIFARE Classic卡激活遵循ISO / IEC 14443 TypeA,MIFARE Classic卡被选中后,它可以使用ISO / IEC 14443命令停用,或可以执行MIFARE Classic命令。
- ACK与NAK
Mifare classic 使用4位ACK/NAK,如下表所示:
- 个人化
- SET_MOD_TYPE命令
- 认证命令
- 读命令
- 写命令
- 增、减、恢复命令
- 转存命令
安全与保护
- 数据完整性
以下机制在非接通讯过程中于读卡器与卡片之间实现,卡片确保数据正确性:
•每个数据块有16位CRC
•为每个字节奇偶校验位
•位数检查
•位编码区分“1”,“0”和“无信息”
•监测信道(协议序列和位流分析)
- 三轮认证
1. 卡从指定扇区的尾块读出密钥和访问权限,并产生 4 字节随机数发送给读卡器。
2. 读卡器使用密钥加密收到的随机数,把加密结果连同自己产生的随机数一起发送给卡(共 8 字节)。
3. 卡使用第 1 轮中读出的密钥验证读卡器返回的加密数据,如正确则把收到的随机数加密后发送给读卡器,否则不发送数据。
- RF接口
RF-interface根据非接触式智能卡ISO / IEC 14443标准实现。两个方向的数据通信在每一帧的开始只有一个起始位。每个字节一位校验位(奇校验)。选择块的最低(LSB)的字节最选传输,最大帧长度为163位(16字节数据+ 2 CRC字节= 16´2´9 + 9 + 1起始位)。
资料参考
1.官方网站:http://www.nxp.com
2.MIFARE Classic EV1 1K - Mainstream contactless smart card IC for fast and easy solution development.pdf Rev. 3.0
3.MIFARE Platform Update &Infrastructure Introduction. Steven CJ Chang 2012.Feb.27
4.《智能卡技术》
MIFARE Classic S50技术详解的更多相关文章
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型
关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- 《CDN技术详解》 - CDN知多少?
开发时间久了,就会接触到性能和并发方面的问题,如果说,在自己还是菜鸟的时候完全不用理会这种问题或者说有其他的高手去处理这类问题,那么,随着经验的丰富起来,自己必须要独立去处理了.或者,知道思路也行,毕 ...
- Comet技术详解:基于HTTP长连接的Web端实时通信技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- SSE技术详解:一种全新的HTML5服务器推送事件技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- Protocol Buffer技术详解(数据编码)
Protocol Buffer技术详解(数据编码) 之前已经发了三篇有关Protocol Buffer的技术博客,其中第一篇介绍了Protocol Buffer的语言规范,而后两篇则分别基于C++和J ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- Protocol Buffer技术详解(C++实例)
Protocol Buffer技术详解(C++实例) 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较 ...
随机推荐
- 服务器操作nginx相关操作命令
服务器操作nginx相关操作命令 登录服务器: ssh root@0.0.0.0 -p 22100 启动nginx: /usr/local/nginx/sbin/nginx 查看nginx是否启动 p ...
- [优化]Steamroller-freecodecamp算法题目
晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...
- DFS练习-HDU1010
题目来源:HDU1010 DFS的基本原则已经差不多了,但是一些技巧仍然比较难想,所以还是加强练习,然后总结一下. 还是先看题意 ,指定迷宫的长,宽以及走出迷宫的具体时间N,M,T. 其中(1 < ...
- Python的静态方法和类方法
Python中使用@staticmethod这个装饰器让方法变为静态方法 一:定义 @staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法 ...
- UOJ#179. 线性规划(线性规划)
描述 提交 自定义测试 这是一道模板题. (这个题现在标程挂了..哪位哥哥愿意提供一下靠谱的标程呀?) 本题中你需要求解一个标准型线性规划: 有 nn 个实数变量 x1,x2,…,xnx1,x2,…, ...
- LNMP+HAProxy+Keepalived负载均衡 - 基础服务准备
日志服务 修改日志服务配置并重启日志服务: ``` vim /etc/rsyslog.conf ``` 编辑系统日志配置,指定包含的配置文件路径和规则: ``` $IncludeConfig /etc ...
- PLC状态机编程第二篇-负载均衡
控制任务 大家好,今天我们用状态机描述稍复杂的实例,同时用LAD和ST语言写状态机.我们的控制任务如下: 真空泵A和真空泵B, 按下启动按钮后, 泵A启动, 3秒后泵B也启动, 此时泵A仍运行, 当容 ...
- 1016-01-首页16-计算配图的frame----MJExtention的使用
-------HWPhoto.h--------------------------------------------- #import <Foundation/Foundation.h> ...
- C语言基础篇(二)运算符
导航: 2.1 算数运算符 2.2 逻辑运算符 2.3 位运算 2.4 赋值运算 2.5 内存访问符号 ----->x<------------->x<------------ ...
- 用go run命令启动main package中的多个文件
linux: go run *.go windows: go build后运行main.exe