MIFARE Classic EV1 1K Crad 探索、复制、与解密

MIFARE Classic EV1 代表了 MIFARE Classic 产品系列的最高演进阶段,继承了所有以往版本的优良特性。它提供 1K4K 内存版本,分别满足不同应用需求

👆🏻来自 MIFARE官网

介绍中的 1k4k 为内存容量,比较常见的为 1k 版本

通过这张来自 APP:NFC tools 的截图可以得到刚刚扫描卡片的标签类型为 MIFARE Classic 1K

上世纪的 Crypto1 算法已不安全

在 2008 年,研究人员通过切割芯片并用显微镜拍照的方式,逆向工程了 MIFARE Classic 芯片,并恢复了CRYPTO1 算法。在同一时期,其他研究人员采用软件导向方法,恢复了密码和通信协议的逻辑描述。特别是研究了 CRYPTO1 流密码的可塑性,以读取卡片的第一个扇区的所有存储块。这些先前工作的结果是对身份验证协议和加密算法的完全逆向,从而导致了多个漏洞的识别。主要漏洞之一是卡片用于生成发送给读卡器的随机数的伪随机数生成器 (PRNG) 的设计不佳,因为可以预测卡片将使用的下一个随机数。

上一段转自 看雪 -- 针对NFC-RFID屏蔽卡的信号绕过攻击

the Netherlands about a new card-only attack on the Crypto1 algorithm

简而言之对 Crypto1 的攻击方法为:已知卡上一个秘钥,即可导出其他所有秘钥

受影响的产品包括

  • MIFARE Classic®,
  • MIFARE Plus® in Security Level1 only,
  • data being encrypted with Crypto1 on emulations,
  • licensed products to third parties and
  • counterfeit products using the Crypto1 algorithm.

官方表示已有改进方式

但使用此算法的卡直至 2023 年仍被广泛使用


👇🏻官方介绍汉化

数据完整性

以下机制是在非接触式通信链路之间实现的
读卡器和卡确保数据传输非常可靠;
•每块16位CRC
•每个字节的奇偶校验位
•位计数检查
•用位编码区分“1”、“0”和“无信息”
•通道监控(协议序列和位流分析)

内存构造

1024 × 8位EEPROM存储器由4个块组成16个扇区。一个块包含16个字节

格式如下

Manufacturer block (制造商块/扇区)

This is the first data block (block 0) of the first sector (sector 0). It contains the IC manufacturer data. This block is programmed and write protected in the production test. The manufacturer block is shown in Figure 6 and Figure 7 for the 4-byte NUID and 7-byte UID version respectively.

汉化: 这是第一个扇区(扇区0)的第一个数据块(块0),它包含 IC 制造商的数据。该块在生产测试中被编程和写保护。图6图7 分别显示了 4字节NUID7字节UID 版本的制造商块。


复制卡的注意事项(以下知识多数来自淘宝评论区看到的图片)

0 扇区不能随意读写,0 扇区的数据规则如上,0 扇区写不符合算法规则的数据会导致卡片锁死

byte0 - byte3UID

byte4 为 check byte 算法 byte4 = byte0 \oplus byte1 \oplus byte2 \oplus byte3

\oplus 为异或符号,不懂的话百度即可

byte4 计算代码,语言为 Python, 没有环境的话用计算器算就好了

rawUID = '33:44:55:66' # str类型, 假设这是你的UID, 记得替换为自己的UID
source = rawUID.split(':') # 切片到list
source = [int(i, 16) for i in source] # hex转int, hex本身可以xor 但这里是str类型 所以用16进制的规则将其转为int
# celc byte4
temp = source[0] 
for i in range(1, 4):
    temp = temp ^ source[i]
print(str(hex(temp))[2:].upper()) # hex转str, 去掉0x, 大写

byte50x08

byte60x04

byte70x00

byte5byte6byte7m1 卡片类型不可随意更改,否则容易把卡写死


至此 dump 原卡 UID 计算 byte4 后将前 5 字节写入新卡即可,不过这仅仅是按照 UID 是识别的卡的复制方案

至于读加密区数据的卡,还需要解密后再写入白卡(下次再写)


引用:

未引用但同样值得一看: