前言
1994 年,NXP 的 Crypto1 算法私有且完全不公开。M1卡也正因这种“封闭”而被当时业界广泛默认是安全的。但接下来的几年里随着 M1卡的广泛应用,不断有研究者学习并尝试逆向还原该算法。直到 2008 年,两名研究人员 Nohl 和 Plotz 成功对其进行逆向并恢复密钥,接着 Crypto1 算法的各种弱点和漏洞被发现,直到如今被破解的体无完肤,成为密码学经典反面教材。
多年以来,密码学研究者已经对其发布了各种攻击,目前在用户侧的密钥破解方案已经很成熟了。但虽然该加密技术已被完全淘汰,卡本身却由于各种因素仍活跃在世界各国的不同场景中,是不可忽视的一项安全风险。
作为普通用户,从中认识到两点就够了:
- 任何与安全性相关的算法,只有开源的、经大众广泛研究后确认无漏洞的,才是真正的安全
- 加密算法关联的软硬件的价值、市占率、普及程度等因素决定着它是否值得成为被破解的目标
设备操作
更专业的用户侧设备除了可以进行解密、读写等基本操作,还支持:模拟、嗅探、侦测。
模拟
称呼为 模拟或仿真 (simulation or emulation)
设备通过NFC线圈等模拟物理卡。既可以只模拟一串 UID,也可以通过转储数据模拟全卡。
虽然数据相同,但 NFC 模拟卡和实体卡在硬件上存在根本区别。对于高级防火墙,读卡器可通过识别卡芯片或配套的硬件标识,以及其它不会公开的针对性检测手段(例如知名品牌的设备特征),检测并拒绝模拟卡。当然,不同的读卡器安全性不同,防火墙也都是人为管理的,严格程度有高有低。不同设备的 模拟/过防火墙 能力也不同,例如有的门禁用 Flipper Zero 模拟卡能过,用手机手环模拟就不行。到底能不能成具体有很多变数,需要自测。
通常来说:实体魔术卡 ≈ Chameleon Ultra ≥ Flipper Zero ≈ Proxmark 3 ≥ 手机手环
嗅探(sniff)
少数设备支持,专用于分析,又称 有卡嗅探/Sniff with Tag
嗅探就像是中间人攻击,设备置于卡片和读卡器之间,同时模拟读卡器(对卡片)和模拟卡片(对读卡器),实时截获并转发两者通信时交换的各类数据,主要用于分析M1卡系统工作原理,也可以用于获取密钥。
各研究者最初都是通过嗅探来着手破解 Crypto-1 算法
侦测 (detect)
多数设备支持,专用于从读头侧获取密钥。侦测由嗅探演变而来,又称 无卡嗅探/Sniff without Tag
不使用卡片,而是由设备主动探测读卡器。通过模拟初始卡并记录模拟卡与相应读卡器之间的交互,从收集的加密 Nonce 中计算密钥。
侦测是目前非常易用且成功率高的密钥获取方式
用户解密
用户侧已知密钥解卡获取转储。该操作无需任何专业设备,手机+MCT 即可完成
用户字典
用户字典解密卡片是用户侧的标准解卡方式
与其它静态破解技术意思一样,此处的“用户字典”指专门用来存储已知密钥的字典。
用户字典必须包含空密钥和常见的默认密钥,否则有些“傻”程序可能会无法解未加密扇区。
默认的 “空密钥” 为 6 字节 “FF”,除此之外,还有些非常简单的密钥,可以包含在用户字典中一并视为空密钥
注意:空密钥本身仍是密钥,读写前一样需要三次握手解密,不能叫做“没有密钥”
FFFFFFFFFFFF
000000000000
A0A1A2A3A4A5
D3F7D3F7D3F7
B0B1B2B3B4B5
AABBCCDDEEFF
加密程度
技术上,卡片所有扇区都是加密的。无加密/半加密/全加密 的这种说法只是为了便于理解而已。
加密程度最直观的定义是:
- 所有扇区所有密钥均为空密钥,即为无加密卡
- 部分扇区使用空密钥,部分扇区使用非空密钥,即为半加密卡
- 所有扇区所有密钥均使用非空密钥,即为全加密卡
理解了直观定义后还必须要明白:
虽然用词上为 X加密卡,但实际加密状态相对于用户,由用户已知密钥决定,与卡片本身无关。
例如:
一张卡使用不同的 16个A/B密钥 对所有 16个扇区进行了加密。我不知道其中的任何密钥,拿这张卡对我而言即为全加密卡;
同样这张卡,我知道了其中的 3个扇区 的密钥,能解密这三个扇区,那么还是对我而言,它就变成了半加密卡,对完全不知道密钥的人来说仍是全加密卡;
同样这张卡,我知晓了所有的密钥,那么对我而言,它就变成了无加密卡。
理解了这点,从相对角度看,另一种定义是:
- 卡片所有密钥已知 —— 无加密(已破解)
- 卡片存在未知密钥 —— 半加密(未破解)
- 卡片所有密钥未知 —— 全加密(未破解)
密钥破解
可以称呼为密钥的 获取/恢复/破解(同一回事但是要分情况)
密钥破解的入手点可分为:卡侧、读卡器侧、卡+读卡器
卡片漏洞破解
卡侧破解,这里的漏洞指利用卡片本身的漏洞,不同厂商不同代的M1卡含有不同的漏洞。攻击者在读卡时可以尝试利用所有已发现的硬件漏洞,并互相配合,简单快速获取数据和密钥。
Darkside 漏洞
针对旧版全加密卡。当卡片接收到读卡器发出的部分正确的认证请求时,会使用密钥流加密的 NACK (否定确认)代码(4 bit)进行响应。由于 NACK 代码很小,可以快速执行暴力破解,再通过 XOR 操作获取相应的 keystream。重复该过程即可恢复完整密钥。
Darkside 漏洞可以在全加密卡上辅助 Nested 攻击。但多数 M1 卡都已修复了这一漏洞。
PRNG(伪随机数生成器)漏洞
旧版卡片在认证过程中使用简单的线性反馈移位寄存器(LFSR)来生成 Nonce ,熵值很低。并且初始状态与通电时间戳强相关,可预测。
通过收集多次认证会话的 NT、NR,利用数学推导,压缩可能的密钥空间,可在短时间内暴力破解得出密钥。
PRNG 漏洞通常被 Nested 攻击所利用。
Nested 嵌套攻击
仅适用于半加密卡。只要卡片有至少一个已知密钥或空密钥,就可以尝试嵌套攻击。
由于 Crypto1 密钥校验过程存在线性关联,攻击者可先利用已知密钥进行正常认证,收集 Nonce ,然后在另一个未知密钥的扇区执行认证,收集 Nonce 。并通过监控两个连续身份验证之间的时间来计算两个随机数之间的“距离”,通过差值反推遍历未知密钥。
嵌套攻击算法分为三种:
- Nested attacks 嵌套攻击:基础的知一求全破解
- Hardnested attack 硬嵌套攻击:提供新的算法,可高效破解强随机数
- Static Nested attack 静态嵌套攻击:针对破解部分复旦静态随机数卡
根据 PRNG 的三种情况对应进行合适的攻击:
-
Weak PRNG(弱)
基于LFSR(线性反馈移位寄存器)实现,生成的随机数熵值低,可预测。
易受基础 Nested 攻击 -
Hard PRNG(强)
引入了更复杂的算法,生成的随机数难以预测
能防御基础 Nested 攻击,但 Hardnested 攻击仍然有效 -
Static PRNG(静态)
卡片在认证过程中使用固定的数值作为
NT,典型代表是 Fudan 卡片。
这是一种对抗破解的策略,能防御 Nested 和 Hardnested 攻击,同时也催生了针对性的 Static Nested 攻击。
上海复旦电子的“无漏洞卡(俗称)”一直在与嵌套攻击对抗,目前最新一代卡(半加密)可抵御上述三种嵌套攻击。
硬件后门
主要针对复旦电子无漏洞卡,利用到一个表现上像是后门的算法漏洞。
安全研究员 Philippe Teuwen 发现了M1卡中隐藏了多年的一个硬件后门。通过在命令字段中设置单个比特位,可将认证从标准的 KeyA/KeyB 切换到后门密钥,利用后门可以直接在没有身份认证的情况下访问所有卡数据。
包含后门的卡型极广,包括:复旦电子的 FM11RF08S、FM11RF08、FM11RF32、FM1208-10,以及较旧的 NXP MF1ICS5003/MF1ICS5004 和 Infineon SLE66R35 。
侦测/嗅探破解
进行侦测需要访问读卡器,进行嗅探需要访问卡+读卡器
侦测/嗅探破解常用于应对全加密卡,尤其是某些无漏洞卡。
侦测(无卡嗅探)

侦测攻击专用于破解密钥。设备模拟未破解卡的已知数据(主要是UID),获取读头发送的NR。即使没有访问过原卡,依然可以尝试直接侦测。侦测通常需要重复多次以收集足够多的的随机数对。
嗅探(有卡嗅探)

嗅探攻击时,设备置于卡和读卡器之间,监听两者通信时交换的数据。其中对破解密钥有用的就是三次握手时产生的随机数:NT、NR、Enc(NT⊕NR)、Enc(NR) 。
破解
获取随机数后直接解方程即可得 Key
$Enc(NR)=Crypto1(K,NR)$
$Enc(NT⊕NR)=Crypto1(K,NT⊕NR)$
MFkey 用来求解恢复密钥,其代码功能通常已包含在各个破解设备的应用功能中,如 Flipper zero、Proxmark3 等,可在侦测或嗅探完成后直接运行。
Mfkey32 适用于两组 32 位密钥流身份认证,用于侦测破解密钥。Mfkey32v2 是现在更常用的增强版本,提高了效率,Mfkey64 适用于完整的 64 位密钥流身份认证,用于有卡嗅探破解密钥。
局限
不同读卡器的 功能/权限 不同,有的读卡器并不带有目标卡的全部密钥,仅侦测这样的读卡器就只能获取部分扇区的 Nonce,解出部分密钥。此时可以先尝试 Nested 漏洞破解,仍无法全部破解的话再继续侦测其它读卡器。
例子:酒店房卡,只侦测房门读卡器并不能解全卡,但侦测电梯梯控读卡器可以一次获取所有密钥
此外还有两种例外情况,分别发生在高级与低级的读卡设备上,哪种情况通常一眼便知:
- “低级”的读卡器可能仅识别 UID。根本就不使用密钥进行解卡,因此无法获取随机数。
- “高级”的读卡器硬件防火墙支持防侦测/防嗅探功能。能够主动检测到攻击设备并拒绝认证。
字典/暴力破解
卡侧破解,通俗易懂,适用于所有M1卡
爆破字典用于存储来自各处的常见密钥,数量几百到几千不等,盲目的挨个试密钥成功率较低。
某些读卡/复卡器配套的应用程序平台提供了针对具体地区的云解卡、云端密钥数据库等功能。允许用户间有偿或无偿的分享指定位置(社区、大楼等)的卡片密钥集,极大提高了字典破解成功率。
暴力破解通常包含在一些读卡/复卡设备的配套桌面软件里,可以指定扇区开始跑。
纯粹的全卡爆破效率极低,仅应该用于【无后门无漏洞卡】+【全部防侦测/防嗅探读头】的无懈可击的卡系统下,耗尽一切手段仍无法破解的 M1 卡片。
卡片复制
为了防止被恶意盗刷或破坏,普通的 M1 卡片 0 扇区 0 区块数据出厂写死,卡号不可修改,不适用于复制卡片。但卡复制的确能带来很多便利。一旦有了需求,也就有了利益、矛盾和各种新产物。
需求
中国魔术卡(Chinese Magic Card)及其UID可改写特性的出现是以下一切可能的开始。
复制卡片所带来的便利处包括但不限于:
-
多人共用
最简单直接的用途。例如家人间使用多张数据完全相同的卡片开小区门禁等
-
备份防丢或丢失重制
为应对卡片意外丢失,可写好多张实体卡备用。或保存转储文件后,随时重写一张使用
-
按个人喜好自定义卡片
按照 轻便、美观 等需求,可选择市场提供的大量定制卡片、卡贴、指环、表带 代替原卡
-
自制一卡通实现多卡合一
(见后文)
-
手机手环卡模拟
(见后文)
一卡通
一卡通/All-in-One:有些组织互相合作,发行官方的多合一卡方便客户将同一张卡用于各种不同的服务。原理很简单,不同服务的读卡系统拥有预先分配好的密钥和扇区。它们可能共同读取UID,但各自仅根据密钥访问指定的一个或几个扇区即可。你也可以自行分析出不同扇区的作用。
自行实现卡片多合一需要一定运气:
例如:有两个读卡系统,均使用 MIFARE Classic 1K 卡;一号系统只读取UID和读写2扇区,二号系统只读写14、15扇区不检测UID。不同读卡系统使用的数据不冲突,就可以将不同卡片多合一。
如果两个系统操作的扇区不冲突,但均检测各自不同的 UID,可询问两个系统各自的管理员是否支持开自定义新卡。若任意一方支持,就使用包含了另一系统卡片 UID 的空白卡开卡,使得两系统使用相同 UID 的卡片,再合并数据即可。
手机手环卡模拟
手机手环通过 NFC 硬件的卡模拟功能也能满足大多数的复制卡需求。与魔术卡相比,其最大优点是便利性,毕竟自己在外出时手机手环都会随时携带;其次是还能帮助用户实现无钥匙,避免卡片等小物件遗忘或丢失。
魔术卡
魔术卡/Magic Card/UID Changeable Card,亦称复制卡。笔者个人认为称呼“复制卡”不方便区分动名词,因此倾向于称呼“魔术卡”,下文内容也均会使用该称呼。
从国人开始,民间鼓捣出一套 UID 卡,所有数据包含 0扇区 0区块可随意擦写。正如其名它的最初目的就是复制 UID。魔术卡使复制 M1卡易如反掌,安全性也大大降低。随之而来就是迭代的 —— 各种防火墙与各种魔术卡的对抗。
一代/Gen1
- UID卡,通过后门指令修改 0 块,带指令响应
- FUID卡,0 扇区 0 区块写入数据后立即锁死,整张卡变为普通卡状态
- UFUID卡,0 扇区 0 区块可不锁(响应UID卡指令),或用指令手动锁死(普通卡状态)
一代卡通过指令修改0块,优点是即使写入无效数据,也不会写死卡,能随意的重写。缺点是如今很多刷卡系统防火墙会尝试检测 UID 魔术卡指令响应,检测到后会拒绝刷卡。
目前最新的 (U)FUID魔术卡允许 0扇区 0区块在写入后被锁定,整卡变成普通的 M1卡状态。这基本能通过所有的防火墙检测。虽然锁定是一次性操作不可撤销,但卡片本身成本较低,可大量购买。
FUID/UFUID卡出现较晚。但由于同样用一代卡指令操作0扇区0区块,因此归类为一代卡衍生版本。
二代/Gen2
- CUID 卡,改为密钥写 0 块,舍弃掉了指令和指令响应
CUID 卡的机制是用 key 对 0 扇区进行认证后允许修改 0 区块,不存在后门,不会被检测。能重复使用且保持低成本,还能轻松配合手机软件写卡。缺点是一旦在 0扇区 0块写入了无效数据(SAK、ATQA等),则卡片报废。
虽然 1K CUID卡最为常见,但市面上也存在 4K CUID卡型。两者均为 4 字节 UID。
防火墙对抗 CUID 卡的方法,是每次刷卡时故意篡改 0扇区 0块数据,例如卡号。普通卡不允许写入不会有任何影响,CUID 卡则会失效(需要重写正确数据)或报废。如果读卡器尝试写入 0扇区 0块数据立即检测修改,即可一次检测出 CUID卡(但该法并不常见)。
此外有些花里胡哨“*UID卡”蹭着名声,含糊不清的宣称各种防检测。可一律视为营销,无需研究。
三代/Gen3
- APDU 卡,使用标准 APDU 指令修改 0 块,添加更多卡型支持
三代卡使用合规的 ISO 7816 APDU 指令修改 0 块,使其完全没有后门特征,因此可绕过大多数防火墙。三代卡重新支持锁定 0扇区 0块,锁定后变为普通卡状态不可解锁。
三代卡支持设置密码以运行后门指令。如果密码不正确,卡片不会有任何响应。
三代卡开始,单张魔术卡开始同时支持 Classic 全系卡型和 4、7 字节卡号,具体包括:
-
S50(1K卡) + 4字节UID
-
S70(4K卡) + 4字节UID
-
S20(Mini) + 4字节UID
-
S50(1K卡) + 7字节UID
-
S70(4K卡) + 7字节UID
-
S20(Mini) + 7字节UID
防火墙到这一代就基本放弃去主动检测魔术卡了,而是更多的采用滚动码防复制。(详见下文)
四代/Gen4
- 添加了 影子模式/shadow mode,又称 滚码复位/数据还原/GTU卡/GUID卡 等
四代卡的最大特点是影子模式。启用后,当卡片收到外部写入数据请求时,卡片不会真的写入数据,只会按 ISO14443A 标准汇报【写入成功】,并将要写入的数据存在临时缓存中。
当读卡器为了验证进行回读检查时,卡片会回报缓存中的数据欺骗读卡器,让读卡器确认数据已写入。刷卡结束断电后,缓存的数据消失。实际卡片数据则始终不会改变。
功能最全面的四代卡(或被称为:终极魔术卡/Ultimate Magic Card)不仅支持影子模式,还能支持所有卡型(全系 MIFARE Classic、MIFARE Ultralight、NTAG )。
有些卡片加入了恢复模式。如果卡片写错了数据导致软锁死,可以通过特定物理操作重置。
与三代卡相同,后门指令受密码保护,如果密码不正确,卡片不会有任何响应。
由于各种因素,不同魔改的四代卡具体功能并不相同,成本和价格也不相同。例如有的GTU卡仅支持 MF1K,但成本相对终极魔术卡低的多且仍能适用于大多数场景。无论如何,购买前应根据个人需求询问卖家确认。
终极四代卡是目前魔术卡天花板,但一张卡到底只是一张,多功能带来的实用性见仁见智。
如何选择?
- 对于复制1K卡型,CUID卡 和 UFUID卡 足矣
- 如有滚动码复位需求,选择 4代卡 或支持影子模式的设备
- 用腻了物理卡和钥匙扣?了解如何优雅的使用 手机/手环 刷卡
- 8槽终极魔术卡模拟 + 设备读写破解操作 + 高低频支持 的解决方案?了解 变色龙Ultra
滚动码
滚动码/滚码/Rolling Code:安全机制,在其它无线电通信中(如汽车钥匙)也很常见。
关于
滚动码很好理解,例如某个块里记录一个数字0,读卡系统记录卡号和对应滚码。每刷一次卡,读卡器先验证滚码,再修改滚码,使读卡系统和卡内的数字同步+1。
在复制了多张卡后,未使用的卡滚动码不同步。如果读卡系统启用滚码验证,并检测到 原卡/魔术卡 的错误滚码,则会拒绝刷卡或封禁卡号。使其无法使用。
滚动码有效的防止了多卡共用、恶意复制盗刷等问题。这使得任何人无论如何复制原卡,只有带最新滚码的卡正常可用,想要切换卡就必须再复制以同步数据。
数字+1 或其它数字运算是最简单的滚动码,很容易分析。更高安全性系统的滚动码使用 无规则的/加密运算的 字符串,更难分析出滚动规律,甚至根本没有规律。
- 带滚码验证的系统在识别到错误滚码后可能拒绝刷卡,也可能直接封卡号,取决于管理员设置。
- 对于 数字+1 或 日期 滚码,有些读卡系统不一定会去检测,只是单纯记录刷卡次数和时间。
想要知道一个滚码刷卡系统如何处理错误滚码,不检测?允许?拒绝?封禁? 方法只有亲自试试。
破解
在离线系统上,滚动码通常存在初始值
不加密的滚码初始值可能是 00、20、FF 。加密的无从知晓,只能开新卡并在首次刷卡前读取到
初始值的作用是为了让离线并应用了滚动码的系统自动注册新卡信息。系统识别到滚动码初始值后,会将其视作新开的卡片(合法卡)。新卡注册信息;老卡重置滚码,并根据算法从初始值开始滚码。
这种初始值漏洞能直接绕过滚码验证。要反复利用,只需在每次刷卡后,重置滚动码为初始值即可。
由此人们发明了上文中支持 影子模式/数据还原 的四代魔术卡,它能在刷卡后自动重置到刷卡前的数据。主要作用就是保持滚动码始终为初始值,跳过验证机制,使得滚码系统下的多卡复制和共用重新变得可行。
恶意行为
以下行为仅应在合法合规的前提下用于研究和学习
封卡
完全解卡并得到指定UID和密钥后,攻击者可在 卡/读卡系统 两侧 篡改/封禁 对应卡片
-
卡侧 - 篡改
由于具有写入权限,攻击者可使用任意的自定义密钥和数据,在几秒内将乱码覆盖写入受害者卡片的对应区块,使其数据丢失且无法进行读卡认证。对于普通用户,这等同于卡片报废。
-
系统侧 - 封禁
出现滚码错误,金额被篡改等异常数据,均可能导致卡片在系统中被封禁。攻击者读取卡片后,可篡改敏感数据,再 复制/模拟 受害者卡片,刷卡并触发封禁。使受害者无法用卡。
盗刷
现代系统中所有与金额等敏感数据相关的卡,金额数据都同时保存在卡与服务器。并且所有提高卡内金额的操作都要联网并与服务器验证。
有些卡同时用于在线系统和离线系统。离线系统不会联网,独立处理卡片数据,某些情况下较不安全
-
**在线系统:**常见于自动售货机、自助充值机、收银台、智能门禁等
在线刷卡系统同步服务器,常用来储值/扣款等。
-
**离线系统:**常见于电梯梯控、简易巴士刷卡器、简易停车场闸机等
离线刷卡系统不能连接服务器,通常只负责处理扣款不会储值。
当在线刷卡系统读取卡片时,若识别到卡内金额比服务器端更少,则可能认为其在离线系统进行了扣款,会同步在服务器端扣款(也可能直接封禁)。但若卡内金额比服务器端多,则视为篡改并封禁。
如果确定了消费系统在线/离线情况,可以测试能否无限使用离线刷卡系统消费。
有些卡内直接通过ASCII编码存储用户姓名和组织内编号(身份认证),如果修改*&编h#?%‘.
防御手段
根治一切问题的唯一方法就是淘汰所有M1卡片和系统,替换为CPU卡。
如果仍需依赖M1卡系统,用户和管理员都有一些可选措施来缓解安全性问题。
个人:保护自己的卡片
1.防漏洞破解:
检查卡片是否是半加密卡。若是,可自行使用强密钥对无用扇区进行全加密处理。
检查卡片是否存在硬件后门。若存在,可使用无漏洞的带密码保护的魔术卡替换。
2.防恶意复制:
携带M1卡时,也可使用“防盗刷卡包”保存卡片,这种卡包类似于法拉第笼,能屏蔽内外电磁通信。
使用手机手环模拟M1卡时启用 刷卡振动/响铃提示、解锁后刷卡 等安全功能。
个人/管理员:使用安全的门禁读卡器
安全级别最低的门禁卡读卡器会只识别卡号(UID)。而卡号是任何设备包括手机都可以直接读取的(贴兜秒出),而且很容易模拟或爆破。别有用心的人想非法获取通行权限较为轻松。
- 很多社区等大门门禁只识别卡号。如果有设置保安,那还可以接受
- 公司学校等组织内门禁只识别卡号的话就并不安全了,建议联系相关人员更换
- 对于支持录入自定义卡片的家用智能门锁,需自行确认其实现方式。若只识别卡号那显然极不安全,务必不要使用
安装视频监控,监视门禁卡刷卡位置非常有必要。但监控到底是被动手段,不能阻止恶意闯入。
管理员:使用密钥算法替换统一密钥
传统发卡系统下发的所有用户卡片均采用完全相同的(一个或多个)密钥,非常不安全
更安全的做法的读卡系统自定义一套密钥算法。发卡时,卡密钥由卡号等唯一识别信息通过运算得出,再写入卡片。然后在读卡系统内存储相同的算法,不需要存储密钥。读卡时,读卡系统即可按卡号算出密钥并解密。
密钥算法机制确保离线刷卡系统正常工作的同时,允许任意的不同用户卡带有不同的密钥。
这样一来,每位用户破解后仅能访问各自的卡片,自行复制或使用手机模拟。搭配难以从卡侧破解的全加密无漏洞卡,可有效提高用户侧安全性。
最后
重复:遵守法律法规。作者及本站不会为你造成的一切形式的损失或任何违法违规行为负责
欢迎任何读者随时勘误或补充信息
玩的开心 : )