原文链接: https://lov2.netlify.app/mifare-classic-ev1-1k/
MIFARE Classic EV1 代表了 MIFARE Classic 产品系列的最高演进阶段,继承了所有以往版本的优良特性。它提供 1K 和 4K 内存版本,分别满足不同应用需求
介绍中的 1k 和 4k 为内存容量,比较常见的为 1k 版本

通过这张来自 APP:NFC tools 的截图可以得到刚刚扫描卡片的标签类型为 MIFARE Classic 1K
 
上世纪的 Crypto1 算法已不安全
在 2008 年,研究人员通过切割芯片并用显微镜拍照的方式,逆向工程了 MIFARE Classic 芯片,并恢复了CRYPTO1 算法。在同一时期,其他研究人员采用软件导向方法,恢复了密码和通信协议的逻辑描述。特别是研究了 CRYPTO1 流密码的可塑性,以读取卡片的第一个扇区的所有存储块。这些先前工作的结果是对身份验证协议和加密算法的完全逆向,从而导致了多个漏洞的识别。主要漏洞之一是卡片用于生成发送给读卡器的随机数的伪随机数生成器 (PRNG) 的设计不佳,因为可以预测卡片将使用的下一个随机数。
简而言之对 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字节 的 NUID 和 7字节 的 UID 版本的制造商块。


复制卡的注意事项(以下知识多数来自淘宝评论区看到的图片)
0 扇区不能随意读写,0 扇区的数据规则如上,0 扇区写不符合算法规则的数据会导致卡片锁死
byte0 - byte3 为 UID
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, 大写

byte5 为 0x08
byte6 为 0x04
byte7 为 0x00
byte5、byte6、byte7 是 m1 卡片类型不可随意更改,否则容易把卡写死
至此 dump 原卡 UID 计算 byte4 后将前 5 字节写入新卡即可(注意: 很多原卡是不能直接写入 UID 块的,解决方案是购买符合使用需求的卡,考虑到兼容性建议购买 CUID,FUID 卡片),不过这仅仅是按照 UID 是识别的卡的复制方案
至于读加密区数据的卡,还需要解密后再写入白卡(下次再写)
引用:
未引用但同样值得一看: