这次折腾的起因很简单:我是 iPhone 用户,想出门少带一张校园卡。

当时手里的 iPhone 没有能直接把这张校园卡录进去、再刷门禁的现成入口。手机天天带,卡却还得单独记着带,总觉得可以省掉一点麻烦。这里说的是我当时那张卡和设备的使用情况,不是说 iPhone 没有 NFC。

调查了一圈,最后的办法非常朴素:手机录不进去,那就在手机壳里放一张薄卡。

看起来像拿手机开门,实际干活的还是壳里的卡。多少有点物理外挂的意思。

为什么选 PN532 和 CUID

主要就是便宜。

按我 2025 年 11 月购买时的价格,一个 PN532 模块十几块钱,CUID 卡片背贴一两块钱一张。背贴很薄,可以放进手机壳里,不用再单独掏卡。这是当时的购买价格,现在买多少钱还得看具体模块和卡片。

两样东西各干各的:PN532 负责在电脑旁读写,CUID 卡负责之后随身带着开门。不是把 PN532 也接到手机上,更不需要每天背着一块开发板去刷门禁。

选 CUID,也是因为这类卡允许改写普通卡通常不能随意改写的标识区域。不过市面上卡片的类型和兼容性有差别,名字一样,不代表每个读卡器都认。

薄、便宜、能用于自己的门禁,这几项就是当时的选型要求。

接上电脑,先把卡读出来

当时用的是 MifareOne Tool,读取之后再用 WinHex 看数据。现在翻回项目文件夹,这两个工具和当时留下的备份目录都还在。

我当时处理的重点在 0 扇区附近的卡片标识数据,检查后写入 CUID 背贴卡,再拿去做实际的门禁使用测试。按我的使用记录,这张背贴确实能打开当时测试的华师门禁,日常少带一张卡的目标就算达到了。

这里留一个需要纠正的记忆细节。我最初把操作记成了“后两位 BCD 校验、写入前 10 位”,但这个说法不够准确:BCD 是数字编码方式,MIFARE Classic 常见 UID 场景里提到的校验通常叫 BCC;“位”又可能指十六进制字符,也可能是字节。0 扇区和其中的 0 块也不是同一个范围。

仅凭这句回忆,已经无法确定具体字段、校验范围和写入长度,因此这里不还原操作步骤。原始备份包含卡片数据,也不作为公开演示文件。

至于结果,也只说到我实际用过的范围:当时测试的门禁可以使用。没有逐个测试学校所有读卡器,更没有分析后台到底验证了哪些字段,不能据此说华师所有门禁都采用同一种机制。

门能开了,水卡和饭卡呢

这两部分我没有继续复制。

一方面,按当时查到的资料,我把它理解为涉及 CPU 卡与 M1 兼容部分的情况,继续做会复杂不少。但具体芯片型号、哪些应用运行在哪个部分,我没有做完整确认,不能只凭门禁能用就反推整张卡的结构。

另一方面,也确实没这个需求。最初只是想开门时少掏一张卡,这件事已经解决了,没有必要顺手把消费功能也列进待办。

同一张卡能开门、打水、吃饭,不代表这些终端用了相同的验证方式。门禁替代成功,说明不了消费认证也能复制,更不说明拿到了余额或者支付能力。

这次只解决了门禁需求,水卡和饭卡没有继续研究。

后来看到的 CPU 卡研究

如果对更底层的通信分析感兴趣,可以了解一下 Proxmark3,也常被简称为 PM3。我当时了解到的部分入门设备大概一两百元,比这次的 PN532 方案贵一些,具体仍取决于版本、固件和配套。

不过,买一台 PM3 并不等于什么卡都能复制。它能做通信分析,最终能观察到什么、能不能验证某种问题,还取决于卡片协议、认证方式和读卡器的实现。这次我的门禁方案没有靠它完成。

卡片数据与使用范围

这次最后得到的东西,就是手机壳里一张很薄的背贴。没有打通 iPhone 的系统 NFC,也没做出什么通用校园卡工具,但解决了我当时开门要另带一张卡的小麻烦。

工具可以研究,自己的卡片数据却不适合拿来当公开素材。UID、dump、密钥和个人信息都别随手贴到论坛或仓库里,截图也先检查有没有漏出来。

同样,有权使用原卡,不自动等于发卡方允许制作副本,实际使用还要遵守学校和门禁管理方的规则。研究限定在自己有权测试的设备和卡片上,不拿他人的卡做实验,也别用于未授权进出或盗刷。

这就是我在 2025 年 11 月用过的办法:让手机壳带着卡,开门时少掏一样东西。