M1 card crack

判断卡片类型

这张卡就是本次实现的对象 ,一张废弃的校园卡,以下所有操作都以此卡展开
在这里插入图片描述

我们使用flipper的NFC功能扫描该卡片。我们直接read
![[Pasted image 20240831075934.png]]

![[Pasted image 20240831080255.png]]

我们得出最终结果该卡是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。

![[Pasted image 20240831080556.png]]

图上可以看到,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 小时,这已经是可以接受的破解时间了。
![[Pasted image 20240831080711.png]]

破解的流程

  1. 利用 Nested Authentication 漏洞,搜集足够多的 Nonce。例如,M1 卡有 64 个 Block,不一定全部存满了数据,没有记录数据的 Block 通常用的出厂默认密钥,我们可以通过认证这个 Block 来读取别的未知 Block 数据。

  2. 利用 Sum Property 和 Filter Flip 来减少搜寻空间,减少可能的密钥数量

  3. 暴力破解,遍历剩余可能的所有密钥。
    其中,第一步利用了 Authentication 的漏洞,最后一步是因为 Crypto1 的算法加密细节被逆向工程完全公开,导致我们可以在高性能计算机上快速尝试可能的密钥。最重要的是第二步,Sum Property 和 Filter Flip 大大减少了搜寻空间,以至于我们可以在个人笔记本上,只花1分钟就能计算完所有剩余的密钥。
    这是最后破解完的部分数据。
    ![[Pasted image 20240831081835.png]]

这是破解出来的密钥
![[a4adcc7a89f1a166202b2ac43d036efa.png]]

参考文献:CRYPTO1: 密码分析学 (门禁卡破解) - 知乎 (zhihu.com)

本文仅为技术讨论和研究提供参考 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luciferau

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值