简介
最近家里的门禁坏了想给常来的朋友们配个钥匙方便进出,就在咸鱼上找了买了 wcopy 这种经典 GUI 复制器。找的时候发现变色龙出了新版本(Chameleon Utral)就打算研究一下有什么不同。这才发现之前发的一篇关于 NFC 的实际上是在我初步接触设备的时候的浅显感受,里面几乎在原理层面没有一点描述,完全就是一篇使用说明。不幸的是,我的知识储备停留在了那里。几年过去了,搜索能力和学习能力都得到了提升,于是我就想着彻底把这个 M1 复制的工作原理搞明白,于是有了这篇博客。
本文并非自主探究结果,而是基于两篇主要论文/《无线电安全攻防大揭秘》以及若干网友博客以及在AI的帮助下总结学习而成的学习笔记结果。
卡片分类
正规发卡分类
现行使用的卡片基本可以分为 IC 卡/ID 卡/CPU 卡,其中区别可以按照工作频率大范围分为(IC + CPU)+ ID,然而需要知道的是 IC 卡和 CPU 卡的区别实际上类似猴子和人,属于是两只发展方向。
最为经典的 NFC 卡,江湖人称“M1 卡”,是恩智浦半导体开发的可用于非接触式智能卡。现在我们进行复制或者尝试折腾的绝大部分 13.56MHz 的卡片都是如此。
不严谨的说,13.56MHz 是一个基础门槛,具体区分可以认为是市面上绝大部分手机能否直接读取卡号(也就是识别)来判断。而进一步的,能否被手机直接复制,或者不能直接复制(能读取卡号)但是借助工具设备还是可以实现复制的就大概率是 M1 卡或者及其变体。当然,不能复制但能读取卡号的还有可能是 CPU 卡,不在本文的讨论范围内(我不会)。对于根本无法被手机感应的卡片大概率是 ID 卡,也就是工作频率为 125KHz,这两者频率差相差过大,一般来说商用手机不会设置两个部分的感应芯片。
从网上获取 IC+ID 双卡合一可以发现实际上就连这种商业卡在设计的时候都需要给不同的工作频率单独设置芯片和线圈。

复制卡分类
IC 卡
普通 M1 卡的制卡过程不可逆,主要的“不可逆”就是 UID 也就是卡片的卡号不可改变,具有唯一性。但是作为复制卡,自然是可以进行修改卡号的,这是所有复制卡的基础。而在此基础上,又根据不同的特性分为了以下的几种复制卡。
(表格来自 ID 卡 IC 卡的复制卡种类介绍_厦门孚远电子科技有限公司)
| 卡类型 | 芯片名称 | 频率 | 重复擦写 | 备注说明 |
|---|---|---|---|---|
| IC 卡 | M1 卡 | 13.56MHZ | ✘ | 普通卡,0 块(卡号块)出厂为锁定状态,不可用于复制,只能授权,物业卡为些卡,俗称授权卡 |
| IC 卡 | UID 卡 | 13.56MHZ | ✔ | 经典复制卡,可以反复擦写,无法穿防火墙 |
| IC 卡 | CUID 卡 | 13.56MHZ | ✔ | 穿防火墙 IC 复制卡,对于 UID 卡复制成功却刷卡无效的情况下,可以使用此卡复制 |
| IC 卡 | FUID 卡 | 13.56MHZ | ✘ | 一次性穿防火墙 IC 复制卡,对于 CUID 卡复制成功刷卡无效的情况下,可以使用此卡复制 |
| IC 卡 | UFUID 卡 | 13.56MHZ | ✘ | 一次性穿防火墙 IC 复制卡,但区别在于此卡支持手动锁卡,没有锁卡之前就是一张 UID 卡,锁卡之后不支持擦写 |
| IC 卡 | GTU 卡 | 13.56MHZ | ✔ | 可以自动复位数据的 IC 复制卡,用于滚动码防复制系统,支持反复擦写 |
| IC 卡 | GDMIC 卡 | 13.56MHZ | ✔ | 可以自动复位数据的 IC 复制卡,用于滚动码防复制系统,支持反复擦写,功能同 GTU 卡,生产厂商不同 |
需要注意的是,表格中多次提到的几个概念在此作具体说明:
防火墙:主要目的求实就是识别是复制卡还是原卡。实现路径主要依赖于判断第 0 扇区第 0 块存储(UID 卡号区)是否可写,如果卡片(UID 卡)对于读卡设备发出的写卡指令0x43进行响应,那么说明这是复制卡从而拒绝解锁。接下来我们讨论的“写入”,都是基于第 0 扇区第 0 块存储 UID 卡号区。M1卡:UID 厂家自带,录入者只能写入其他区域,不能修改卡号。CUID卡: 就是屏蔽了0x43这个指令,但是实际上它可以直接被写入。也就是说不需要开始写的信号直接写入。实际上这种卡片已经可以过市面上绝大部分的设备了。FUID / UFUID卡:初始状态和 CUID 一样,但 只能写一次。一旦写入成功,芯片内部会物理熔断或逻辑锁死,变成真正的“只读”,彻底免疫防火墙的写入测试。
滚动码:部分高级电梯梯控会使用到这个技术,就是每次进行刷卡行为之后,卡中的数据部分都会被修改,也就是防重放攻击。一般是一个特定的标志位。但是对于严格使用滚动码技术, 真实数据库同步的系统,复制完新卡并且使用之后老卡就会失效。自动复位数据:这是适用于非绝对严格的滚动码系统。具体表现为部分非高级门禁不具备数据库,他的识别方式为验证数据内容是否符合逻辑输出规范。在进行刷卡操作的时候,除了在标志位进行+1(简单来说),还会尝试在其他部分写入脏数据。对于 CUID 卡来说这部分脏数据就会影响数据的合规性检验,而正常的 M1 卡这个部分不应该会被写入。具有这个功能的卡片就能防止老式的滚动系统(只验证数据的合规性,就是不该出现脏数据的地方不出现)。还能通过不严格的新型系统,也就是在这种系统中,由于数据库中保存的标志位和卡片中的标志位相差不是很大(卡片中是 10,但是数据库已经是 11 了),数据库就会认为上次没有成功写入而放弃这个 11 而接受这个 10 的标志位。当然这也是有风险的,对于智能的系统而言,如果某一个 UID 卡片的标志位一直来回跳转(新卡是 11 但是老卡还是 10,下次新卡是 13 老卡已经是 14)就有可能标记为异常甚至封禁该 UID。
ID 卡
(表格来源同上)
| 卡类型 | 芯片名称 | 频率 | 重复擦写 | 备注说明 |
|---|---|---|---|---|
| ID 卡 | T5577 卡 EM4305 卡 5200 卡 | 125KHZ | ✔ | 可擦写复制的 ID 卡 |
| ID 卡 | F8268 卡 | 125KHZ | ✔ | 穿防火墙 ID 复制卡,用于 ID 卡复制成功刷卡无效的情况 |
ID 卡一般没有加密的部分,正常的 ID 卡只有一个唯一固定的 UID,也就是卡号,另外在没有其他的加密手段,所以现在的 ID 卡被认为是不安全的。
ID 卡防火墙也是发出写指令来观察卡片是否回显。
M1 工作原理
卡片物理结构组成
M1 卡的标准提出是以下这篇 论文,其中对于卡片结构和工作原理做了详细的介绍

集成电路芯片内含 1 Kbyte EEPROM、RF 接口和数字控制单元。能量和数据通过天线传输,卡中天线为几匝线圈,直接连接到芯片上。不再需要额外的组件。以下是各个物理结构的介绍(来自 GPT)。
RF 接口 (RF Interface):仓库的“传达室” – 它是芯片和外界沟通的 唯一窗口。
- 翻译与供电:它把空中的无线电波转换成电能给芯片供电(因为它没有电池),同时把电波里的信号变成数字信号传给里面的单元。它既是“电源插座”,也是“翻译员”。
防冲突单元 (Anticollision):窗口的“一米线” – 如果有好几张卡同时靠近读卡器,这个单元就开始工作了。
- 排队机制:它确保读卡器在同一时间只和 其中一张卡 说话,让其他卡先“闭嘴”排队,防止大家一起开口导致信号乱成一团。
EEPROM:仓库的“储物格”– 这是真正存数据的地方,总共 1KB,分成了 16 个房间(扇区)。
- 数据存储:你的卡号、余额、门禁权限都锁在这里。每个房间都自带两把锁(Key A 和 Key B)和一张说明书(控制位),决定了谁能进来读或者写。
认证模块 (Authentication):“验票处”– 这是进入 EEPROM 之前的必经关卡。
- 核对暗号:当你想要访问某个储物格时,认证模块会从 EEPROM 里读取那个房间的“正确暗号”,然后和读卡器提供的暗号进行对比。只有对上了,它才会拉开挡在 EEPROM 前面的逻辑闸门。
控制和算术逻辑单元 (Control and ALU):仓库的“管理员” – 它负责具体的体力活。
- 存取指令:它听从读卡器的指挥,负责把数据从 EEPROM 搬出来,或者把新数据存进去。
- 自动算术:如果你是公交卡,它能直接完成“加钱”或“扣钱”的计算,而且存得非常严谨(特定冗余格式),防止数据存错。
加密单元 (Crypto Unit):仓库的“碎纸机与密信员” – 它保证你和读卡器之间的通话不被偷听。
- 通讯加密:它使用特定的算法(CRYPTO1),把你们之间传输的所有数据都变成乱码。即使有人在空中截获了信号,没有加密单元的配合,他也看不懂信里写了什么。
EEPROM分类和结构
但是实际上关于EEPROM大小和分区情况还大有说法。主要分为两种包括:Mifare Classic 1K和 Mifare Classic 4K
- Mifare Classic 1K:有1KB的EEPROM内存,分为四个扇区,每个扇区包含16个区块,一个区块为16B;
- Mifare Classic 4K:有4KB的EEPROM内存,分为32个扇区,前16个扇区每个扇区4个块,后16个扇区每个扇区16个块,每个块16字节 (Bytes)
这个是EEPROM的功能分区
| 结构 | 作用 | 类型 |
|---|---|---|
| 扇区 | 存储数据的基本逻辑单元。 | 必要 |
| 区块 | 存储数据的最小物理单元,分为数据区块和尾块。 | 必要 |
| 数据区块 | 存储用户数据。 | 存放数据 |
| 尾块(扇区尾块) | 存储扇区的密钥和访问权限,控制对扇区内数据区块的访问。密钥用于身份验证,访问权限定义了哪些密钥可以执行哪些操作(读、写等)。访问权限是影响卡安全的关键因素。存储的内容分为密钥A,密钥B,访问控制 | 固定 |
密钥存储和长度:
- 尾块中存储密钥 A 和密钥 B。
- 类型:用于扇区访问控制,基于 CRYPTO-1 加密算法。
- 长度:MIFARE Classic使用的密钥长度为48位(6字节)。
密钥区分:
- 密钥A和密钥B单独存在,具体权限由访问控制字段来设置,可以一个设置只读,一个设置只写,也可以两个都设置写,由访问控制位决定。
- 读卡器一次只能提供一个密钥,不能同时进行验证。
安全相关的固定结构:
- 访问控制位 (Access Bits):位于尾块,定义了各个区块的访问权限。这些位决定了哪些操作(读、写)可以被哪些密钥所执行。不正确的权限设置是安全漏洞的源头之一。通常是 3 个 bit 位组成,多个 bit 位组合控制整个扇区的访问权
- UID (Unique Identifier):每张卡都有唯一的UID,用于区分不同的卡。但是,论文中提到,有些“兼容MIFARE”的卡可能会有重复的UID,这削弱了UID的唯一性。并且部分生产厂商使用的是同一套UID
- LFSR: 位于卡中,用于生成伪随机数(nonce)用于认证过程。如果LFSR使用静态种子值,或者生成的随机数具有可预测的模式,则会引入安全风险。在早期提出的卡片攻击漏洞中,就是利用了生成的随机数可预料来实现的攻击。
访问注意:
- 扇区是最小的访问控制单元: 在MIFARE Classic中,访问控制的最小粒度是扇区级别,而不是区块级别。密钥A和密钥B控制着对整个扇区的访问权限。这意味着,一旦你使用正确的密钥对一个扇区进行了身份验证(Authentication),接下来你就可以读取或者写入该扇区内的任何数据块(前提是你具有相应的权限,访问控制位允许你这样做)。
- 身份认证是关键: 你必须先通过身份认证,才能访问扇区内的任意区块,每一次访问验证只能访问当前扇区内的区块,密钥只对当前区块负责。
- 访问控制位决定了能做什么: 即使你身份认证通过了,访问控制位仍然决定了你能对该扇区内的区块做什么。假如访问控制位设置了只允许读取所有区块,那么即使你通过了身份验证,也无法对扇区的任意区块进行写入操作。
加密区别,什么叫半加密,什么叫全加密:
- **半加密:**部分或者全部扇区使用了默认密钥,能够被带有nfc功能的手机直接复制。
- **全加密:**设置密钥的时候使用了强密码。
卡片工作原理
结合上述的物理结构,接下来将结合上述物理结构的概述与论文中出现的工作原理图来具体展示卡片的工作原理。

简单来说这个流程图概括了以下几个工作流程:
寻卡与选择阶段 (Identification and Selection)
- POR (Power On Reset):卡片进入读卡器磁场后上电复位。(RF 接口)
- Request Standard/All:读卡器发出信号,询问磁场内是否有卡。(RF 接口)
- Anticollision Loop (防冲突循环):如果有多张卡,读卡器通过这个循环选出其中一张,并获取其 Serial Number (UID)。(防冲突单元)
- Select Card:正式锁定该 UID 的卡片。(防冲突单元)
时间消耗:无冲突时约 3ms。
三轮认证阶段 (Authentication Procedure) —— 核心安全区(Authentication)
- 3 Pass Authentication (Sector specific):这是你之前关注的“三轮握手”。
- 关键点:所有的加密通信都从这里开始。它必须针对特定扇区(Sector specific)进行。
- 漏洞插入点:你提到的 Darkside 或 Nested 攻击,都是卡在这个阶段,通过伪造读卡器的认证请求(Request)或分析卡片返回的加密随机数($n_T$)来工作的。
时间消耗:约 2ms。
存储操作阶段 (Memory Operations)(Control and ALU + Crypto Unit)
一旦认证成功,逻辑门开启,读卡器可以对该扇区执行具体的指令:
- Read/Write Block:读写 16 字节的数据块。
- Increment/Decrement:数值增减(常用于公交卡余额)。
- Transfer/Restore:将计算结果转存到存储区。
时间消耗:读取约 2.5ms,写入较慢约 6.0ms。
停止阶段 (Halt)
- 操作完成后,读卡器发送 Halt 指令让卡片进入休眠,直到离开磁场重新上电。
M1如何进行三轮认证
第一步:卡片发送随机数 $n_T$ (Pass 1)
- 动作:读卡器发送认证指令(包含要访问的扇区和密钥类型 A 或 B)。
- 响应:卡片生成一个 32 位的随机数 $n_T$(Nonce of Tag),并以明文形式发送给读卡器。
- 目的:这个随机数作为后续加密运算的“挑战码”,确保每次认证的会话内容都是唯一的,防止重放攻击。
第二步:读卡器发送 $n_R$ 和 $a_R$ (Pass 2)
- 动作:读卡器收到 $n_T$ 后,生成自己的 32 位随机数 $n_R$。然后利用内部存储的 密钥(Key) 和 Crypto-1 算法,对 $n_T$ 进行加密运算,得到一个响应值 $a_R$(Answer of Reader)。
- 传输:读卡器将 $a_R$ 和自己的随机数 $n_R$ 发送给卡片。
- 校验:卡片用自己的密钥解密并验证 $a_R$。如果 $a_R$ 正确,说明读卡器拥有合法的密钥,卡片初步信任读卡器。
第三步:卡片发送 $a_T$ (Pass 3)
- 动作:卡片在验证读卡器成功后,同样利用密钥和算法,对读卡器发来的 $n_R$ 进行加密运算,生成响应值 $a_T$(Answer of Tag)。
- 传输:卡片将 $a_T$ 发送给读卡器。
- 校验:读卡器收到后进行验证。如果 $a_T$ 正确,说明卡片也拥有正确的密钥,读卡器完全信任卡片。
关键特性
- 双向认证:不仅仅是读卡器检查卡,卡片也在检查读卡器。
- 全过程加密:从第二步读卡器的响应开始,所有传输的数据都经过 Crypto-1 流密码加密。
- 安全性现状:虽然这种机制设计得很巧妙,但由于 S50 使用的 Crypto-1 算法已被破解,现在可以通过“嵌套认证攻击”(Nested Attack会在接下来的章节介绍)等手段在几秒内提取出密钥。
以上是AI的回答,实际上所有的攻击都是针对这个三轮认证展开的,会在下一个章节展开。于此同时对于变色龙为什么在侦测之后就能得到一个简单的密钥然后就可以结合原卡进行破解,可以逐步展开一层神秘的面纱。变色龙侦测原理也是利用了这个。

M1卡正常发卡流程
综上所述可以得到正常的发卡流程是什么样的:
- 获取一张全新的M1卡,使用默认密钥
FFFFF... - 记录UID,并且绑定个人
- 使用默认密钥访问扇区,添加用户信息例如学生学号余额信息
- 修改默认密码,设置强密码
- 修改权限控制位,设置密码不可修改权限控制位
针对于M1的攻击
如何复制一张全加密M1卡?
- 准备工具:
- 具有pm3功能的读卡器(pm3太贵了 我这里用的是wcopy)
- 变色龙侦测卡
- 拿到M1卡之后放到读卡器上尝试解密,发现进度条卡住了,怎么都没有办法成功解密复制,意识到这大概率是全加密卡。

- 变色龙设置为侦测模式,在读卡器上来回试探,获取密钥
- 获取密钥之后勾选“使用密钥”并且填入,重新进行破解,成功解密,能够到处卡片镜像dump文件
- 但是需要注意的是,当拿着这个dump文件重新导入的时候,看到的数据仍然是加密后的没有被解密的情况
攻击方式
简单分类
Darkside 攻击 (暗面攻击)
这是最基础、最“暴力”的逻辑攻击,通常用于完全没有任何已知密钥的卡片(全加密卡)。
- 针对对象:Crypto1 的认证反馈(Error Codes)。
- 攻击原理:当攻击者发送一个错误的加密请求时,由于 Crypto1 算法的设计缺陷,卡片在报错时会泄露一部分内部状态信息。Darkside 攻击通过不断尝试并观察卡片返回的“加密校验错误”响应,利用概率统计学在几分钟内定位到密钥的内部状态。
- 特点:它是“从无到有”的突破口。只要破获了一个扇区的密钥,就可以转向更快的“嵌套攻击”。
- 但实际应用中,通常 需要配合 已知的部分密钥信息,才能更有效地进行攻击。
- 具体细节看一看“如何预测LFSR输出结果?”
嵌套认证攻击 (Nested Attack)
这是 M1 卡漏洞中最经典的攻击方式,也是 PN532 等工具最常用的功能。
针对对象:Crypto1 的逻辑缺陷和伪随机数发生器 (PRNG)。
前提条件:已经知道卡片中至少一个扇区的密钥(通常利用默认密钥
FFFFFFFFFFFF)。攻击原理:攻击者先用已知密钥进行合法认证,此时卡片的加密流已经处于激活状态。接着,攻击者在不中断连接的情况下,请求认证另一个(未知密钥的)扇区。
由于 M1 卡的 PRNG(伪随机数发生器)在已知时间轴下是可预测的,攻击者可以根据已知扇区的随机数,推算出未知扇区随机数的可能值,从而极快地破解出所有扇区。
Hardnested 攻击 (硬嵌套攻击)
针对“加固型”M1 卡(即修复了 PRNG 漏洞,使随机数变得更难预测的卡片)。
针对对象:随机数关联性。
攻击原理:加固后的卡片修复了 Nested 攻击利用的简单线性关系,使得随机数看起来很随机。但研究人员发现,由于硬件计算能力的限制,这些随机数之间依然存在某种复杂的非线性相关性。
Hardnested 攻击通过收集大量的(通常是几千组)认证交互数据,利用高性能计算(复杂度约为 $2^{35}$)来进行“生日攻击”或“离线字典碰撞”。
特点:计算量大,通常需要电脑 CPU 跑几分钟甚至几小时。PN532 基本跑不动,需要 Proxmark3 配合电脑完成。
静态嵌套攻击 (Static Nested Attack)
这是一种针对特定型号(如部分国产兼容卡、复旦卡等)的特殊攻击。
针对对象:静态随机数 (Static Nonce)。
攻击原理:某些兼容芯片为了简化电路,其随机数发生器存在严重缺陷——在特定条件下(例如断电重启后),卡片发出的随机数(Nonce)是固定不变的,或者是每次上电都循环相同的序列。
攻击者通过多次重置卡片,强制其发出相同的静态随机数,从而将复杂的加密认证降维打击,直接通过简单的数学查表或抵消运算获得密钥。
总结对比表
| 攻击名称 | 核心利用点 | 难易程度 | 硬件需求 |
|---|---|---|---|
| Darkside | 认证报错泄露的信息 | 中等 (全加密卡首选) | PN532 / PM3 |
| Nested | PRNG 随机数可预测性 | 极低 (最常用) | PN532 / PM3 |
| Hardnested | 复杂非线性相关性 | 极高 (针对加固卡) | Proxmark3(必选) |
| Static Nested | 随机数不更新(静态) | 低 (针对特定缺陷卡) | PN532 / PM3 |
Crypto1 算法的问题
使用这个算法的加密卡 M1 Mifare Classic 物理渗透-Mifare Classic S50(IC)卡分析 - FreeBuf 网络安全行业门户
以下插图来自《无线电安全攻防大揭秘》P11

实际上这个48-bit LFSR的设计存在相当大的问题,首先先来解释一下图片中各个组件的作用:
- PRNG (伪随机数生成器):
- 这是读卡器 (Reader) 发送给卡片的一个随机数,称为 Challenge。
- 这个“随机数”实际上由 PRNG 产生。PRNG 的质量直接影响了整个加密过程的安全性。一个好的 PRNG 应该产生具有良好统计特性的、难以预测的序列。
- 图中的
Challenge向上箭头指向Response的生成过程,向下箭头则直接参与后续的计算。
- UID (唯一识别码):
- 这是 MIFARE Classic 卡的唯一标识符 (Unique Identifier)。每个卡都有一个独特的 UID。
- UID 是固定的,不随每次交易改变。
- UID 和
Challenge通过异或运算 (⊕) 结合在一起。 异或的结果是生成密钥流的其中一个输入。
- 异或门 (⊕):
- 这个异或门将来自
PRNG的Challenge与卡片的UID进行混合。这种混合的目的是增加密钥流的复杂性和随机性,使得攻击者更难预测密钥流。 - 从安全角度来看,简单的异或混合可能不足以抵抗高级攻击。
- 这个异或门将来自
- 与门 (AND):
- 图中的 异或门 的输出,与 Challenge 信号连接与门
- 与门的结果是另外一个输入,输入到异或门
- 异或门 (⊕):
- 这个异或门的作用是将上游的两个信号混合,作为对 48-bit LFSR 的输入。
- 48-bit LFSR (线性反馈移位寄存器):
- 这是整个加密系统的核心组件。LFSR 是一个由移位寄存器和反馈函数组成的电路。
- LFSR 的作用是生成伪随机序列,这个序列被用作密钥流。
- LFSR 的初始状态 (种子) 由之前的异或结果决定。
- LFSR 的反馈函数决定了序列的生成方式。一个设计良好的 LFSR 应该具有长的周期和良好的统计特性。
- 图中从
48-bit LFSR引出多个箭头,表示 LFSR 的多位输出会进入f(x)函数。
- f(x) (非线性函数/S-盒):
- 这是一个非线性函数,通常被称为 S-盒 (Substitution Box)。
- S-盒的作用是增加密钥流的混淆性和扩散性,使得密钥流与明文之间的关系更加复杂。
- S-盒是密码学中重要的组件,能够抵抗线性密码分析等攻击。
f(x)的输出就是最终的 Keystream。
- Keystream (密钥流):
- 这是由
LFSR产生的伪随机序列经过f(x)处理后的结果。 Keystream会被用于加密或解密数据。- 图中
Keystream箭头向上, 与 Response 结合,生成最终的密文返回发卡器。
- 这是由
- Response (响应):
- 这是一个从卡片发回读卡器的加密后的数据。
- 卡片利用最终的 Keystream 和一些数据异或,就组成了 Response
48-bit LFSR 问题所在
Crypt-1使用的加密是对称加密
倒推结果:当攻击者对于卡片的攻击的时候掌握了这个
Keystream之后,就可以根据这个加密密钥来解密监听得到的卡片数据,也就是说一旦得到了这个Keystream就可以直接dump出卡片的原文,从而直接实现复制或者修改。而特定扇区的密钥A/B是参与身份验证的,就是说密钥A/B参与组成了最后用于加解密的
Keystream随机数
PRNG的生成受到密钥A/B的影响,扇区密钥就是在这个阶段影响最后的Keystream那么一旦LFSR的结果可以预测,那么紧接着
Keystream就可以预测,那么用于保护扇区的密钥也就被绕过了接下来的问题就是如何预测
LFSR的结果?
如何预测LFSR输出结果?
我们前面提到Crypt-1算法使用的是对称加密
结合
Darkside攻击来说,因为它正是利用了这个原理但是实际上这个
Darkside的开始需要一个Keystream来开始做异或,当然这个Keystream是不完美的,不然就没有下面的故事了,具体的值大概率是需要通过变色龙来获取一个区块的密钥来推出不完整的Keystream的,那么通过这个不完美的Keystream结合CRC的校验和错误值(当然其实伪造一个随机的Keystream也会让CRC进行报错,但是这样其实没什么用,因为这个区间太大了)。也就是说在启动
Darkside攻击之前需要一个已知的扇区的密钥和对应的Keystream。这是侧信道攻击,使用的侧信道是卡片返回的 CRC 错误码。
以下是AI展开(讲的比我好)
理解这一点需要了解 MIFARE Classic 在读写块时,如果校验失败会返回错误码,而这些错误码泄露了 keystream 的前几位。1. Darkside 攻击的整体框架:
如同之前所述,攻击的目标是恢复 LFSR 的内部状态,从而预测 Keystream。 为了达到这个目的,需要收集足够多的 Keystream 比特。 获取 keystream 的方法通常是在认证之后,进行块的读写操作。
2. 利用错误码泄露Keystream:
MIFARE Classic 有一个重要的特点:当读写块操作的校验失败时,卡片会返回一个特定的错误码。 通过分析这个错误码,攻击者可以推断出 Keystream 的前几位。
- 错误码的含义: 具体来说,MIFARE Classic 的错误码包含了有关传输过程中发生错误的类型信息。 某些错误码直接指示了在 CRC 校验中发现了错误,而 CRC 校验的过程涉及 Keystream 的使用。
- 错误码与CRC校验的关系: 在MIFARE Classic中,数据块以附加的CRC字节进行保护。读写操作都涉及卡片内部计算CRC并与发送的CRC进行比较。如果CRC校验失败,则会产生一个错误代码。由于数据和CRC都被Keystream加密,错误代码发生的方式与使用Keystream加密的数据之间存在关系,因此我们可以从中提取有关Keystream的信息。
- 如何获取 Keystream 信息:
- 精心构造数据: 攻击者可以精心构造要写入卡片的数据,并故意修改数据中的某些比特。 这里的数据是明文数据,在发送之前会与 keystream(上面获取的不完美的
Keystream) 进行异或运算再发送给卡。 - 触发校验错误: 通过上述操作,攻击者可以尝试触发卡片返回特定的错误码。 如果明文数据和错误码已知,就可以反推出 keystream 的前几位. 具体来说,通过选择特定的数据块并计算期望的 CRC 值, 通过故意引入错误并观察返回的错误代码,就能提取到 keystream.
- 重复实验: 这是一个重复实验过程,通过不断尝试和分析错误码,可以逐步恢复更多的 Keystream 比特。
- 精心构造数据: 攻击者可以精心构造要写入卡片的数据,并故意修改数据中的某些比特。 这里的数据是明文数据,在发送之前会与 keystream(上面获取的不完美的
3. 详细示例:
假设攻击者要向一个扇区写入数据,并知道需要进行 CRC 校验。 以下是一个简化的例子:
- 选择数据块: 攻击者选择想要写入的数据块(16 字节)。
- 计算 CRC: 计算该数据块的 CRC (循环冗余校验) 值。
- 修改数据和 CRC: 攻击者可能会故意修改数据块中的一个比特,或者修改 CRC 值,以引入错误。
- 发送数据到卡片: 将修改后的数据块和 CRC 值发送到卡片。 数据和 CRC 会首先和 keystream 进行异或加密,再进行传输。在卡里收到数据后,会用内部的密钥进行解密,然后计算 CRC 。
- 观察错误码: 卡片收到数据后进行 CRC 校验。由于数据或 CRC 被修改过,校验将失败,卡片会返回一个错误码。
- 分析错误码: 攻击者分析返回的错误码。 不同的错误码可能指示了不同的校验错误类型,例如 CRC 校验错误。
- 推断 Keystream 比特: 根据错误码的类型和修改的数据,攻击者可以推断出 Keystream 的前几位或某些特定位置的比特值,因为卡片接收到的数据是被 keystream 加密过的。
- 重复上述过程: 攻击者重复上述过程,每次修改不同的数据比特或 CRC 值,并记录返回的错误码。 通过多次重复,攻击者可以收集到足够的 Keystream 信息。
4. 恢复 LFSR 状态并破解密钥
收集到足够的 keystream 之后,就可以使用之前提到的方法(解线性方程组)恢复出内部状态,并预测后续的 keystream,从而进行进一步的攻击(如破解密钥、克隆卡片等)。
5. 重要注意事项:
- 这种方法需要仔细的实验和分析。
- 不同的 MIFARE Classic 卡片可能返回不同的错误码。
- 错误码的具体含义可能取决于卡片的固件版本。
- 实际的攻击过程可能比这个例子复杂得多。
总结:
通过精心构造数据、故意引入错误并分析 MIFARE Classic 返回的错误码,攻击者可以逐步获取 Keystream 的信息。 这种方法是 Darkside 攻击的一个重要组成部分。 结合其他技术,攻击者最终可以恢复 LFSR 的状态,预测 Keystream,并破解卡片的密钥。
Proxmark3 攻击
MIFARE Classic:暴露静态加密的无视变体 — MIFARE Classic: exposing the static encrypted nonce variant
(15 封私信 / 28 条消息) 当全加密 M1 卡沦陷之后 - 知乎
可以编写 lua 脚本, 为什么 pn532 或者其他板子无法完成这个实验?
Proxmark3 能够实现更底层的协议分析和控制,因此可以用于一些高级的攻击场景,比如对新的、或者应用了特殊安全机制的卡片进行研究和破解。不过笔者没钱买,所以这部分没法探究。
但是pn532之类的芯片是高度封装的,没有留下精细调试的接口,不能控制细微的信号。
Chameleon
变色龙侦测原理
据前文提到的三轮认证,实际上侦测获取密钥主要就是更具这个三轮认证来实现的攻击。
以Chameleon Ultra为例,是针对读卡器的攻击,当然常规来说针对卡片的攻击使用的是PM3。虽然Chameleon Ultra 也可以对卡片进行攻击了,但是不讨论这个。本文中提到的Chameleon 都是针对读卡器的攻击。
侦测本质上都是伪装成一张正常的卡片骗取读卡器经过特定扇区密钥加密后的响应值,也就是流程图中的$a_R,当发送的随机数$n_T可控并且可以获取响应值$a_R,那这不就是一个标准的选择明文攻击吗?
什么是Mfkey32
就是用来建立发送的随机数$n_T和响应值$a_R之间的方程,y=f(x)
版本区别
Chameleon Mini 和 Ultra 的主控芯片不同。Chameleon Ultra 的新芯片在性能上更强大,支持更复杂的卡片模拟和交互,但 并非完全不支持 Sniffing。 只是 Ultra 的 Sniffing 不像 Mini 那样 纯粹被动。
因此,Chameleon Mini 更适合 隐蔽地监听,分析真实卡片与读卡器的交互过程,并且更难被检测到。 而 Chameleon Ultra 必须主动出击,通过模拟不同的卡片输入,观察读卡器的响应,以此来分析协议或尝试破解。
由于 Ultra 的硬件性能更强,它可以模拟更多类型的卡片,并且能够执行更复杂的安全测试和攻击。 但是,Ultra 的主动模拟行为也更容易被检测到。
然而由于财力限制,笔者几乎接触到的所有Chameleon都是Utral或者变种,没有接触过存粹使用sniff进行监听的行为。