最近因为工作需要进行一卡通项目的整合,原来对于IC卡这块基本是个小白,经过一段时间的学习,简单整理一下资料。现在生活中少不了各种卡,公交卡、地铁卡、银行卡、门禁卡、餐卡等等,它们都是什么卡?ID卡?IC卡?另外带NFC功能的手机也能刷卡使用,IC卡是如何保存数据的?又是如何防止复制的?本文进行了一个简单的归纳总结。
ID和IC
首先明确本文所指的卡片,特指非接触卡,即卡片在读卡器照一下,即可实现刷卡,接触卡不在讨论范围(银行发行的IC卡,大部分是接触卡,需要插入特制的pos机刷卡)。非接触卡所用到的技术原理,就是 RFID(射频识别技术,Radio Frequency Identification)。原理简单来说,就是卡片(一般称之为标签,tag)接近读卡器(也叫读头,reader),接收读卡器发出的射频信号,凭借感应电流所获得的能量与读头进行数据交互。按照通讯频率来分的话可以分为ID卡和IC卡。
ID卡
全称为身份识别卡(Identification Card),是一种不可写入的感应卡,含固定的编号,主要有台湾SYRIS的EM格式、美国HID MOTOROLA等各类ID卡,通讯频率为125khz,俗称低频卡。这种卡是比较老的卡了,卡片仅有一个卡号可用,现在市面上很少见到,安全性非常低(因为卡号可以随意读取和复制),在早期的门禁系统中应用的比较广泛。
IC卡
全称集成电路卡(Integrated Circuit Card),又称智能卡(Smart Card)。由法国人Roland Moreno于上个世纪70年代初发明,可读写,容量大,有加密功能,数据记录可靠,使用方便。通讯频率为13.56Mhz,俗称高频卡。这个是目前应用最广泛的卡片。要注意如果手机含有nfc芯片,也只能读取和模拟13.56Mhz的IC卡,125khz的ID卡是不支持读写的,这也是为什么有些小区的门禁系统没法被手机nfc模拟的原因(用的id卡系统,感觉反倒安全了呢 -_-)
IC卡的分类
IC卡按照加密方式分, 可以分为逻辑加密卡和CPU加密卡
逻辑加密卡
在逻辑加密卡内部,外部读写设备在访问逻辑加密卡芯片中的EEPROM单元之前,必须首先发一组数据给硬件逻辑电路,硬件逻辑电路在判断数据的合法性后,才决定是否将逻辑加密卡内的开关闭合。所以逻辑加密卡是通过控制硬件逻辑电路的闭合来保证其卡片数据安全读写的。
这类型卡比较典型的就是NXP(恩智浦)公司研发的mifare系列卡片,根据芯片存储容量,又可以分为1k,2k,4k等种类,mifare 1k的卡简称M1卡,这个应该是全世界发行量最大的IC卡了,在公交,学校,门禁,食堂等各类场景均有广泛的应用。
CPU加密卡
这个卡就比较厉害了, 你可以认为它是一台小型微机,卡里面封装了完整的cpu、rom、ram等部件。由于CPU卡封装了微处理器,这样EEPROM的数据接口在任何情况下都不会与IC卡的对外数据线相连接。外部读写设备在与CPU卡进行数据交换时,首先必须发送指令给CPU,由CPU根据其内部ROM存储的片内操作系统COS(Chip Operation System)对指令进行解释,并进行分析判断,在确认读写设备的合法性后,才允许外部读写设备与CPU卡建立连接。这无疑使得安全性大大提高。
Mifare 卡数据结构
IC卡中最常见的是NXP Mifare系列卡,根据卡内使用芯片的不同,分为
- Mifare S50,简称M1卡,是最常见的卡,出厂固化UID,可存储修改数据
- Mifare UltraLight,简称M0卡,低成本卡,出厂固化UID,可存储修改数据
- Mifare UID Chinese magic card,简称UID卡,M1卡的变异版本,可修改UID,国外叫做中国魔术卡,可以用来完整克隆M1 S50卡的数据;但是现在新的读卡系统通过检测卡片对特殊指令的回应,可以检测出UID卡,因此可以来拒绝UID卡的访问,来达到屏蔽复制卡的功能
- 针对UID卡被屏蔽的问题,另外还有变异版本FUID卡和CUID卡,FUID卡的UID只能修改一次,起防屏蔽作用,专门对付物业升级的防复卡和防复读头;CUID卡则是针对FUID卡做的优化,支持UID号重复擦写,无需锁卡自动起防屏蔽作用
可以看出,标准的m1是锁0扇区0区块的,无法写入,为的是确保卡片的安全和不能复制。后面的那些uid卡,cuid,fuid卡,均是某些不讲武德的国人搞出来的东西。有了这些变种卡,uid基本可以随意复制了。
以标准M1卡为例,其容量为1K字节,总共分为16个扇区,每个扇区分为4个数据块,每个数据块16个字节。每个扇区中的块按照0 ~ 3编号,第3个块中包含KEYA(密钥A)、控制位、KEYB(密钥B),每个扇区可以通过它包含的密钥A或者密钥B单独加密。
0扇区0块是特殊的数据块,用于存放制造商代码,包括芯片序列号UID,ATQA和SAK
非加密卡和加密卡的区别就是,非加密卡中所有扇区的KEYA和KEYB数值都是默认值FFFFFFFFFFFF;而加密卡中,其中有扇区的KEYA和KEYB不等于FFFFFFFFFFFF,部分扇区加密的卡称半加密卡,所有扇区都加密的卡称全加密卡
由上图可见,每个扇区的第3区块,里面存放的是密钥A、B和访问控制信息,这个就是m1加密的核心了,其中0-5,10-15字节分为存放keya和keyb,6,7,8三个字节为访问控制字节,第9个字节一般不用。
在访问控制中每个块都有对应的三个控制位,对应四个块就有12位,在加上每位还有取反,总共是24位,正好三个字节。控制位的二维数组列表如下(表一):
三个控制位以正反两种形式存在于存取控制字节中,决定了该块的访问方式,所以每个块均有2的3次方即8种不同的访问方式,存取控制字节整体结构如下(表二):
数据块的存取控制列表(0、1、2块)(表三):
数据块的存取控制列表(3块)(表四):
接下来实际举个例子便于理解,以M1默认的存取控制策略 08 77 8F 69 来说:
忽略最后一个字节69,前三字节换算为二进制为 00001000 01110111 10001111
把其填入表二,得到:
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | |
---|---|---|---|---|---|---|---|---|
字节6 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
字节7 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
字节8 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
根据表一对应关系,得出每个块的访问控制关系:
块 | C1X | C2X | C3X |
---|---|---|---|
块0 | 1 | 1 | 0 |
块1 | 1 | 1 | 0 |
块2 | 1 | 1 | 0 |
块3 | 0 | 1 | 1 |
这样我们就得到了块0-2的访问控制位均为110,块3为011,查询表四,可知块0-2的权限为验证KeyA或KeyB后可读该块数据,减值以及初始化值,只有验证KeyB 正确后才可写入该块数据,加值。块3的权限为KeyA,KeyB均不可读,验证KeyB正确后可改写KeyA和KeyB,验证KeyA或KeyB正确后可读"控制位"。
IC卡的安全性
ic卡的安全性,大家最关心的就是卡片加密扇区能不能被破解和卡片能不能被复制了,这里面按照破解难度简单分个类:
使用UID
这类场景主要是直接使用了物理卡号作为唯一ID,因为物理卡号直接可读,可以说毫无难度,之前说的125khz的低频卡,以及目前市面上绝大多数用13.56mhz做门禁卡的(包含我自己的小区),基本都只使用了uid,配合国产神卡,复制可以说毫无难度。更不用说国内无节操的某米和某为,直接在官方钱包里明目张胆的推出复制卡功能,本质上也是复制了uid
M1加密扇区
这个理论上来说还是安全的,之前介绍了在IC卡里封装了硬件逻辑电路,在密钥不对的情况下是读取不出加密扇区的内容的(逻辑电路开关不会开,读取不到eeprom中的内容),遗憾的是Mifare的加密技术在08年已经被破解了(没破解的时候也可以靠暴力穷举拿到密钥,只是慢一点),以pm3为代表的破解神器技术已经非常成熟,破解成功率在95%以上。所以如果是把资金存入芯片里脱机消费的,理论上都有被复制的可能性(早期的餐卡基本都是这种离线消费模式,现在大部分已经联网了,即使复制了卡余额还是改不了的)
cpu加密扇区
这种因为有cpu每次生成随机数,且可以记录暴力穷举次数,安全性很高,目前没有被破解的消息出来,但相应的卡片结构也最复杂,成本较高。目前绝大部分的公交卡应该都已经是cpu卡。