判断卡片类型
这张卡就是本次实现的对象 ,一张废弃的校园卡,以下所有操作都以此卡展开
我们使用flipper的NFC功能扫描该卡片。我们直接read
我们得出最终结果该卡是M1 1K卡,也就是S50卡 。
Mifare 1卡是属于非接触式逻辑加密卡。MIFARE MF1是符合ISO/IEC 14443A的非接触智能卡。其通讯层(MIFARE RF 接口)符合ISO/IEC 14443A标准的第2和第3部分。其安全层支持域检验的CRYPTO1数据流加密。而CRYPTO1算法早已经在2015年宣布理论死亡。
以下是Crypto1 Stream Cipher 的初始化过程。在 Crypto1 加密细节公开后,对于一个 Stream Cipher 而言,只要能弄清内部状态是如何初始化的,我们就能生成一模一样的 keystream。
图上可以看到,Crypto1 是利用 ( K, uid⊕nT, nR) 来初始化内部状态的,这也是为什么前面提到,只要 nT⊕uid 的值相同, nR⊕ks1 就是固定的 (由于 PRNG 的漏洞,我们可以通过控制上电时间生成一样的 Nonce)。
如果我们有一张要复制的 M1 卡,用来初始化内部状态的 ( K, uid⊕nT, nR) 几个参数中,它的密钥 K 和 UID 都是固定的。由于我们已经知道了 Crypto1 的算法细节,我们可以通过收集一些 Nonce,来反复初始化 Crypto1 的状态,通过遍历尝试 239 种可能的密钥 K ,如果生成的 keystream 一模一样,说明我们尝试对 K 了。但是尝试 239 种可能实在是太慢了,有没有办法减少需要尝试的 K 数量呢?
下面这张图是 Crypto1 生成 Keystream 的流程,我们可以看到它竟然只用奇数位生成 Keystream,例如 9,11,13,15 … 47 位。我们这样就可以把奇数位和偶数位分开,例如先固定 20 位偶数位,再固定 19 位奇数位,这样就只需要尝试 220+219=1572864≈220.58 种可能。
假如在 CPU 上计算,尝试一种可能需要 5ms (实际会更快), 1572864∗5=7864320 毫秒,大约只需要 2 小时,这已经是可以接受的破解时间了。
破解的流程
-
利用 Nested Authentication 漏洞,搜集足够多的 Nonce。例如,M1 卡有 64 个 Block,不一定全部存满了数据,没有记录数据的 Block 通常用的出厂默认密钥,我们可以通过认证这个 Block 来读取别的未知 Block 数据。
-
利用 Sum Property 和 Filter Flip 来减少搜寻空间,减少可能的密钥数量
-
暴力破解,遍历剩余可能的所有密钥。
其中,第一步利用了 Authentication 的漏洞,最后一步是因为 Crypto1 的算法加密细节被逆向工程完全公开,导致我们可以在高性能计算机上快速尝试可能的密钥。最重要的是第二步,Sum Property 和 Filter Flip 大大减少了搜寻空间,以至于我们可以在个人笔记本上,只花1分钟就能计算完所有剩余的密钥。
这是最后破解完的部分数据。
这是破解出来的密钥
参考文献:CRYPTO1: 密码分析学 (门禁卡破解) - 知乎 (zhihu.com)
本文仅为技术讨论和研究提供参考 。