首页 > 分类 > 网络百科 > 文章内容

手机模拟 NFC 卡的基础应用探索

小区物业给的一卡通,既是门禁卡,又是电梯卡。有时候不免来去匆忙忘记带卡,虽然不至于进不了大门上不了电梯,但总归找物业或者叫邻居都是麻烦事儿,所以产生了一种偷懒到极致的想法:每天手机不离身,那就索性把手机的 NFC 功能充分发挥下,让手机模拟这张小区一卡通。每次进门上电梯都刷手机,这样岂不是连卡都省了?

经过验证,思路是可行的,但实现的经历颇为坎坷。

先找度娘搜到了一款 NFC 模拟软件,名为 Card Emulator,国人大神制造。软件用于安卓手机,使用方法是用软件读取想模拟的卡片,读入后该卡片信息通过软件保存到手机中,在要刷卡时用软件激活保存的信息,再把手机的 NFC 区在刷卡器上一刷即可。亲测成功用手机刷开门禁!楼门进来了,可是我把手机贴在电梯刷卡器上,它没反应,我上不了电梯。

对于这种状况非常疑惑,试了很多次都无解。通过阅读了一些文献,我逐步揭开了迷之一卡通的神秘面纱。

小区的一卡通,从卡片分类上来讲属于 NXP MIFARE Classic 1K 卡,简称 M1 卡。NXP 为厂商;MIFARE 是芯片名称;Classic 直译为经典,理解成卡类型即可;1K 指卡片容量。目前这种卡已经成为一种标准,所以 NXP 的 M1 卡未必就是 NXP 生产的。M1 卡属于 IC 卡的一种,而目前市面上绝大多数 IC 卡都是 M1 卡。

M1 卡的存储结构非常简单,它有 16 个 Sector(扇区),每个扇区包含 4 个 Block(块),即共计 64 个块。扇区的命名从 0 开始,到 15 结束;块的命名从 0 开始,到 63 结束。也就是说,0 扇区包含 0-3 块,1 扇区包含 4-7 块,……,15 扇区包含 60-63 块。上图所示,够清晰吧~

以上为数据存储结构,再简单说下存储方式。每个扇区的 4 个块中,前 3 个负责储存数据,第 4 个则是控制块,负责保存读取前三个块用的 Key(密钥)。密钥为 KeyA 和 KeyB,他们根据控制位的设置分别起作用。这里特殊说下 0 扇区:它的第 1 块,即 0 块存储的并不是数据,而是厂商信息,包括卡片 ID、生产厂家、生产时间等。厂商块无权限限制,可以随意读取。而厂商块以外的其他数据块,则必须要知道控制块中的密钥才能读出。

Card Emulator,本质是软件读取了存储在厂商块的卡片 ID,并把这个 ID 写入 NFC 配置文件,让手机也可以发射相应的卡片 ID 信号给刷卡器。这个配置文件路径是 /etc/libnfc-nxp.conf,实际上如果我们知道卡片 ID 后再手动修改这个文件,达到的效果是一样的。但是,NFC 配置文件中并没有相应于卡片数据区的部分。这就表明手机是先天不支持模拟卡片“数据”的,而只能模拟卡片 ID。

基础知识就这样,回到之前的问题:为什么可以模拟门禁而不可以刷动电梯?答案应该显而易见了,这是由于门禁的刷卡器识别的是卡片 ID,而电梯识别的却是卡片数据。发射卡片 ID 给电梯刷卡器,就等于对一个只知道我“名”的人报我的“姓”,理所当然电梯刷卡器不识别。

当然,在搞清楚这个原理之前,我还做过一些其他尝试,包括使用开源硬件 Proxmark 3 强行破解门禁卡的所有扇区密钥,包括联系到 Card Emulator 开发者咨询是否可以搞出模拟卡片数据的软件,但是由于“先天不足”,用手机模拟小区一卡通完整功能的计划宣告失败。当然,我们要注意是“完整功能”,电梯上不了,至少我还可以进大门。对于 M1 卡,有很多的刷卡器是设置为只识别卡片 ID 的,所以手机模拟卡片的用武之地仍然很大,包括我们生活中的 ** 卡和 *** 卡(此处涉及敏感信息,手动屏蔽)。

最后,我向软件开发者问了个问题:“使用手机模拟出整张卡片的数据区,这种功能是否能通过定制 ROM 来实现?”大神的回答是:“这个也许可以。”看来,这又成了我寄托给手机 ROM 定制大神的另一个希望吧。

您可能还会对这些文章感兴趣
评论总数 8(访客评论 4 / 作者评论 4)
    • @老杨 是的,移动网速越来越快,所以我想今后的趋势将是所有的事物都可以联网,并通过手机这个媒介实现人与万物的互联互动。

发表评论

您的电子邮箱地址不会被公开。必填项已用 * 标注

你好,新朋友!

emojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemojiemoji