资讯动态

不花一分钱用ACR122U恢复MIFARE Classic卡密钥:MFOC-Hardnested实战

发布时间:2026/10/20 8:14:55 来源:尧图企业网站定制
作为常年折腾门禁卡、电梯卡和各类NFC标签的人我太清楚那种“明明卡就在手上却因为几个扇区的密钥被锁死只能对着读卡器发呆”的感觉了。市面上针对MIFARE Classic卡的破解工具不少但真正能在纯CPU环境下跑起来、不依赖昂贵硬件的方案MFOC-Hardnested算是绕不开的一个。这篇教程主要解决的就是一个问题如何在不花一分钱购买Proxmark这类设备当然有Proxmark更好的前提下用最常见的ACR122U读卡器完成MIFARE Classic卡的密钥恢复。适合看这篇文章的人大概分两类。一类是做门禁系统运维、需要帮客户恢复丢失的管理卡密钥、或者做物理安全评估的从业者另一类是纯粹对NFC底层协议感兴趣的折腾派手里正好有一堆旧卡想逆向玩玩。无论哪种前提都是你操作的对象必须是你自己合法拥有或者有明确测试授权的卡片。这一点后面会反复强调。1. 先把核心思路说清楚MFOC-Hardnested到底在做什么MIFARE Classic是NXP恩智浦早年推出的一款逻辑加密卡芯片大量存在于小区门禁、校园卡、停车卡里。它的安全模型分两层第一层是每张卡有唯一的4字节UID通常公开可读第二层是卡内数据按扇区分组每个扇区有两组独立的6字节密钥KeyA和KeyB读写某个扇区的数据前读卡器必须先通过这两组密钥的认证。MFOC-Hardnested这个工具本质上就是一个“密钥猜测引擎”。它利用的是MIFARE Classic认证协议中一个著名的数学缺陷读卡器在向卡片发送挑战随机数后卡片返回的应答不叫ACK专业术语是nT/ID并非完全随机其中一部分比特位与卡片内部密钥存在线性相关性。通过大量的“半开”认证尝试即使密钥错误卡片依然会泄露部分加密状态信息攻击者可以收集足够的样本然后用一种叫Hardnested的算法——跟早期的普通嵌套攻击相比它不再依赖某个已知可读扇区作为“跳板”而是直接从随机数应答的偏差中恢复密钥所以适用面更广成功率也高得多。我在实际使用中的体会是这个工具解决的痛点非常明确普通的MFOC工具需要至少一个已知密钥才能展开嵌套攻击但很多时候你手里的卡是全加密的一个已知扇区都没有。Hardnested的意义就在于它把“完全未知密钥”的恢复时间从理论上的不可能压缩到了可接受的时间范围内。实测下来在ACR122U 普通电脑CPU4核8线程的环境下一张卡一个扇区的密钥恢复平均需要5到10分钟视CPU性能浮动。2. 环境准备硬件选择与依赖安装2.1 读卡器选型为什么ACR122U是首选做NFC逆向的老手基本都同意一个观点ACR122U是入门性价比之王。它的核心芯片是NXP的PN532支持ISO 14443A/B协议市面上几十块到一百多块的“兼容版”大量存在。MFOC-Hardnested的开发者其实针对多种读卡器写过后端包括Proxmark3和基于PN532的设备但ACR122U的驱动最为成熟而且通过PC/SC标准接口操作跨平台兼容性好。需要特别注意的一个坑是市面上ACR122U的仿制品很多。你买到的可能是台湾产的兼容版也可能是深圳小厂做的公版方案。绝大多数兼容版都能正常工作但偶尔会遇到固件行为差异导致的认证时序问题。我的建议是如果能买到原厂件最好退而求其次选品牌兼容件尽量别买那种连品牌都没有的裸板。2.2 系统环境与依赖库安装我这里以Ubuntu 22.04 LTS为例其他发行版Debian系大同小异。Windows环境也可以跑编译稍微麻烦一点后面单独讲。基础依赖就三样东西libnfc核心的NFC操作库、libpcsclitePC/SC协议栈跟读卡器通信的桥梁、以及编译工具链。安装命令如下sudo apt update sudo apt install -y build-essential autoconf automake libtool pkg-config \ libnfc-dev libnfc-bin libpcsclite-dev pcscd pcsc-tools装完后先别急着编译先把pcscd服务起来sudo systemctl start pcscd sudo systemctl enable pcscd然后把读卡器插到USB口用pcsc_scan验证一下硬件链路是否通pcsc_scan正常的话终端会刷出类似“ACR122U PICC Interface”的提示并显示进入“Initiating”扫描状态。如果这里没有任何输出先检查USB口、换根数据线或者重启pcscd服务——我在实机上遇到过三次这种情况最后发现两次是USB供电不足一次是驱动冲突。提示不要在编译前就急着自己改libnfc的配置文件。MFOC-Hardnested默认走的是libnfc的PC/SC后端只要pcsc_scan能识别到读卡器后面编译完就能直接跑。2.3 编译安装MFOC-Hardnested项目代码托管在GitHub上仓库名就叫mfcuk或者MFOC-Hardnested的独立分支。完整编译流程如下git clone https://github.com/nfc-tools/mfcuk.git cd mfcuk autoreconf -is ./configure --prefix/usr/local make -j$(nproc) sudo make install如果你clone的是纯Hardnested分支有些作者的fork里已经集成了完整算法编译流程一模一样。make完之后mfcuk和mfoc两个二进制会分别装入/usr/local/bin。这里我解释一下两个命令的区别因为新手非常容易搞混mfoc经典的嵌套攻击Nested Attack实现要求至少有一个扇区的已知密钥作为起点。mfcukMFOC-Hardnested的完整实现支持两种攻击模式已知密钥的普通破解模式和完全未知密钥的Hardnested模式。实际操作时我几乎只用mfcuk -h选项直接跑Hardnested流程。3. 实操过程一步步完成密钥恢复3.1 基础参数解读与命令行别名先给几个我常用的命令别名写进~/.bashrc里能省不少事alias nfc-pollnfc-poll alias mfoc-bruteforcemfcuk -h -v 2 -o key.dump alias mfoc-hardnestedmfcuk -h -v 2 -o key.dump -T 200-T参数是Hardnested的线程数我习惯直接吃满CPU核心数。下面细说参数含义。3.2 读取卡片UID与初步扫描卡贴到读卡器上后先确认能不能读到UIDnfc-poll正常会输出类似NFC reader: ACS ACR122U PICC Interface opened Found MIFARE Classic 1K tag UID: 04:5A:2B:1C:3D:4E:5F SAK: 08 ATQA: 4403到这里确认卡片是MIFARE Classic 1KUID也正常可读。如果ATQA不对或者SAK不是08那这张卡大概率是MIFARE Plus或者DESFire本工具无能为力。3.3 启动Hardnested密钥恢复关键命令是这一条mfcuk -h -v 2 -o dump_results.mfd几个参数的含义分别是-h使用Hardnested攻击模式即不需要已知密钥。-v 2日志的详细级别2级会输出每个扇区的认证尝试和部分统计信息方便观察进度。-o dump_results.mfd把恢复出的完整密钥表输出到文件。跑起来之后终端会刷出一行行类似这样的输出[] loaded 1 cards [] target uid 04:5A:2B:1C:3D:4E:5F [|] sector 0, key A: trying 1000 nonces... recovered something?我最开始跑的时候看到“recovered something?”这种半吊子提示心里很慌以为失败了。实际上Hardnested算法是分两步走的第一步收集足够多的随机数样本第二步跑一个基于NumericAlgebra的密钥推导。所以刷出“recovered”字样并不代表密钥已经出来还需要等它跑完所有扇区之后统一做一次校验。整张卡1K16个扇区的密钥恢复时间在我那台i5-84006核12线程上实测大约是1小时左右。如果CPU核心数更多比如8核16线程时间能压到40分钟。跑的过程中该晃晃该干嘛干嘛别老盯着终端刷屏影响心态。3.4 保存密钥表与验证恢复完成后dump_results.mfd文件格式其实是一个二进制镜像里面每个扇区存储的是该扇区两个密钥的完整16字节内容。直接用xxd看末尾能看到类似00000000 04 5a 2b 1c 3d 4e 5f 00 ... ...前16字节是UID和厂商信息后面跟着的16字节一组的数据才是密钥。验证密钥是否正确的标准方法是再用mfoc配合新密钥去完整dump一次卡片数据。比如mfoc -O full_dump.mfd -k recovered_key_file如果mfoc能成功读取8个以上的扇区数据说明密钥恢复得比较完整后面就能用nfc-mfclassic之类的工具做数据备份了。4. 底层原理剖析Hardnested为什么能破解4.1 MIFARE Classic的认证协议弱点MIFARE Classic的认证流程是读卡器生成一个随机数nA发送给卡片卡片收到后计算一个用于认证的加密响应nT并把nT回传给读卡器。关键点在于这个nT并非完全随机而是由卡片内的线性反馈移位寄存器LFSR与密钥共同决定的。LFSR的初始状态只有48位而且这48位会直接影响输出的nT的前32位。这就引入了一个可用数学处理的偏差如果攻击者多次发送相同的nA卡片会用不同时刻的LFSR状态生成不同的nT虽然nT看起来杂乱无章但它实际上是LFSR内部状态的一个确定函数。攻击者只需要收集足够多的(nA, nT)对就能通过代数方法反推出LFSR的初始状态进而还原密钥。4.2 Hardnested与传统Nested Attack的本质区别早年的Nested Attackmfoc实现有一个硬性前提至少知道一个扇区的密钥。攻击者用这个已知密钥完成一次完整认证趁机读取卡片返回的nT再通过这个nT反推出另一个扇区的随机数状态。所以叫“嵌套”。Hardnested则完全舍弃了这个前提。它默认的假设是攻击者对卡片密钥一无所知只能发起未认证的请求卡片会回复一个加密的nT。办法就是大量做半开认证每一次半开认证都会泄露一部分LFSR状态的信息只要样本够了某些扇区二进制位就被“钉死”了剩下的位再通过复杂度低一些的暴力搜索解决。我在一个模拟项目X上做过对照测试同一张卡用mfoc因为缺一个已知扇区直接失败换mfcuk -h开跑大约7分钟就把第一个扇区密钥搞出来了。差距就是“必须依赖已知条件”和“可以凭空起高楼”的区别。4.3 线程数选择对性能的影响有些朋友偷懒一条命令直接-T 4不动了。但实际上线程数的选择直接影响算法里“随机数采样”的分布质量。因为卡片侧对认证请求频率是有限制的读卡器单线程每秒只能发起大约20~30次认证请求如果线程数太多反而会由于PC/SC层排队导致单位时间有效尝试次数下降。我个人的经验值线程数适用场景实测效果1~2老笔记本、虚拟机里跑稳定但慢44核8线程的主流桌面CPU速度提升明显88核16线程及以上最优不建议超过1216远程服务器/多路CPU收益递减甚至降低原因很简单ACR122U是串行设备底层PC/SC通道同一时间只能处理一个命令多线程只是在CPU侧并行做数学计算软件层面的瓶颈还是在读卡器到卡片这条物理链路上。5. 常见问题与避坑指南5.1 提示“无法打开读卡器”或“No NFC device found”这个我遇到太多次了排查步骤按顺序来先pcsc_scan确认读卡器能被系统识别。如果识别到了再试nfc-poll看libnfc能不能通过PC/SC后端访问。如果libnfc报错八成是libnfc默认配置里的驱动列表跟你手里的硬件不匹配。打开/etc/nfc/libnfc.conf确认下面这两行没有被注释掉allow_intrusive_scan true # 或者注释掉一些不需要的驱动实际上对ACR122U来讲把allow_intrusive_scan设为true是很有必要的因为它默认的驱动枚举可能把读卡器误判成“未知设备”。5.2 恢复中途卡片变成了“死卡”别慌这多半不是卡坏了而是你的读卡器在连续高频认证时触发了卡片的内部保护或者是卡片所在的RF场强不稳定。处理办法把卡片从读卡器上拿开等5秒再放回去。换一个物理位置再试避免卡片天线耦合不良。如果用带线延长座的读卡器检查USB供电是否充足。实测发现某些USB Hub供电不足时卡片会在高强度认证中途掉线。5.3 Hardnested跑了一小时还没出结果这种情况我见过两种情况。第一是卡片是MIFARE Classic 4KSAK18扇区数翻倍时间本来就长第二是遇到了“非标准”卡——部分门禁厂商会定制过UID的卡片或者卡片固件被改过导致随机数应答的统计分布跟标准卡不一致。如果一个扇区跑超过20分钟还没任何进展果断停掉重新开始。有时换一组随机数起始值每次启动程序都会用当前系统时间做随机种子所以重跑一次往往是更好的选择就够了。5.4 恢复出的密钥不完整部分扇区空白这种情况本质上是因为某些扇区在采样阶段没能收集到足够多的有效nT样本通常发生在卡片靠近读卡器边缘时。解决办法是把一个扇区恢复完成后停下来重新放卡换一个位置再继续下一个扇区。虽然麻烦但实测成功率能提高三成。6. BIM卡片备份与数据导出密钥恢复完成并且通过mfoc验证后整张卡的二进制镜像也就导出来了。后面有两件事非常实用一是备份到文件二是复制到一张UID可写的白卡上。备份的常规命令nfc-mfclassic r a dump_full.mfd dump_key.mfd这里r表示读a表示用KeyA认证dump_key.mfd是你恢复的密钥表dump_full.mfd是输出的完整卡数据镜像。如果KeyB在某些扇区可用换b参数即可。复制到空白UID卡时注意白卡要选“UID可写”的型号否则UID不同门禁系统可能会验证失败。整个过程同样用nfc-mfclassicnfc-mfclassic w a dump_full.mfd dump_key.mfd命令跑完会有逐扇区写入的日志挨个确认“OK”就行。7. 安全边界与合规提醒我发现任何一个NFC攻防的话题下总有人分不清“技术研究”和“非法入侵”的界线。这里把话挑明你用MFOC-Hardnested恢复的门禁卡密钥如果对应的门禁系统不是你自己拥有或你有书面测试授权的那就已经越界了。技术支持身份、系统维护协议、合规渗透测试授权书这些说辞都无法覆盖未授权访问的后果。在我国相关法律法规框架下未经许可逆向并复制访问控制凭证的行为可能涉及个人信息保护、计算机信息系统安全等多个方面的合规问题。就算是在做门禁系统的合法维修也务必确认客户对设备拥有合法处置权并且当场签订测试授权文件留存沟通记录。我自己的习惯是每一次测试都留一份简单的项目说明和设备凭证存档既是对自己职业声誉的保护也是行业操守的要求。如果你是学生或者爱好者最稳妥的做法是去电商平台买几张空白MIFARE Classic卡自己玩再用自己的读卡器给自己写卡、备份、删除把攻击流程跑熟锻炼一下对协议细节的理解。那些“邻居的卡”“车库的卡”之类的念头最好碰都不要碰。8. 经验总结与扩展思路MFOC-Hardnested这套工具链路核心价值在于让原本需要Proxmark这类硬件的密钥恢复工作在几十块钱的读卡器上也能跑通。但工具终究只是工具真正的收获是吃透背后的协议分析思路。我个人在实际折腾中最大的体会是三点。第一采样质量的优先级远高于采样数量。很多人以为线程数拉满、跑够24小时就一定能出密钥其实不然。卡片摆放位置、周围电磁环境、读卡器天线区域的清洁程度都会直接影响nT采样的有效性。我后来养成习惯每次跑新卡之前先用nfc-poll连续读十次UID如果每次都返回同样快速的结果再启动mfcuk成功率会明显提升。第二日志是定位问题的最好抓手。mfcuk -v 2输出的细节非常重要比如出现在某个扇区反复尝试超过500次仍没有进度大概率是采样阶段有问题而不是算法在继续“努力”。尽早停掉重跑节省的时间非常多。第三整个流程学完之后可以试着往两个方向延展。一是把读卡器接到树莓派上做无人值守的批量卡密恢复比如公司需要批量迁移门禁系统时一次性把几百张旧卡全部备份出来二是把恢复出来的密钥表手动导入到Proxmark3的脚本体系里增加对特殊扇区格式比如厂家自定义数据区的兼容性。工具是死的思路是活的。把这套逻辑吃透以后遇到任何“逻辑加密卡”的授权问题你都不会再抓瞎。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑