摘要 — 目的与说明
本文对一张标准 M1(MIFARE Classic)校园卡的多个扇区数据进行了逐字节的解析,重点说明了 1 号扇区(学号存储)与若干用于余额/交易记录的扇区的编码规则与推断逻辑。出于隐私保护,已对可直接识别个人身份的数据(如完整学号、具体发卡日期)进行脱敏处理,防止个人隐私泄露。
(其实早就写完了 为什么现在放是因为校园卡这学期终于电子化了 防止有人拿这个做坏事)
本文可能较为枯燥 对mifare卡片不感兴趣的可以先去了解一下相关知识再来看本文~
零.介绍
MIFARE Classic卡片每个扇区由 4 个块(Block 0–3)构成,每块 16 字节(总 64 字节)。
哈尔滨商业大学的校园卡有内容的扇区分别是0-3 共四个扇区
一.0扇区
0扇区主要存储卡片信息,这里简略介绍一下:
块 0:D499322444080400030E51042248E61D
块 1:0219230417AA22AA3135022306153032
块 2:D6580000D6DCBDA1002020202608010B
块 3:32C9382459A8FF07806932C9382459A8
上面是一串示例数据(已脱敏处理,并不是真的
1.块0
其中 0 扇区的块0 通常包含卡片的基本信息,如 UID、ATQA、SAK 等。
ATQA (Answer to Request)是卡片返回给读卡器的响应之一,通常用于标识卡片类型。不同类型的卡(如 MIFARE Classic、MIFARE DESFire 等)具有不同的 ATQA 值。比如这张卡的ATQA值就是44 00,代表该卡片是一个 MIFARE Classic 卡。
SAK (Select Acknowledge)是卡片在响应选中请求时返回的字节,表示卡片的类型和支持的协议。SAK 值通常是卡片的某种属性标识,可以帮助识别该卡是否支持某些操作或协议。这张卡的SAK是08,表示这是一张支持加密的 MIFARE Classic 卡。不同的值代表不同的卡片支持能力,例如是否支持 ISO 14443-A 或加密功能。
UID (Unique Identifier)每张 MIFARE 卡都有一个唯一的 UID,用于区分不同的卡片。这张卡片的UID就是D4863224,每张卡都不一样,可以用来唯一标识该卡片。
最后还有1 字节的BCC:4F。BCC 用于校验卡片信息是否正确。它是通过对 UID 和其它字节进行某种运算生成的值,用于防止数据传输过程中的错误。(就是校验码)
2.块1
逐部分拆解:0219 →疑似是学院编码(例:计算机与信息工程学院)。
2304 → 发卡日期 + 月份编码(例:2023 年 04 月)。
17 → 可能是日或流水号。
AA22AA → 疑似用户权限/身份类别标识(待验证)。
313502 → 可能是学校代码或区域码。
230615 → 疑似日期(2023-06-15)。
3032 → ASCII "02",可能是批次号或类别标记。
3.块 2(大概是附加信息 / 扩展字段)
D6580000D6DCBDA1002020202608010B
没分析出来,但是0020202020 → 存在 ASCII 空格填充。
4.块 3(扇区尾部:密钥 + 访问控制)
32C93824****FF07806932C93824****
结构(16 字节固定格式):
密钥 A(6 字节):32C93824****
访问控制位(4 字节):FF078069
密钥 B(6 字节):32C93824****
该块用于控制本扇区的读写权限。密钥AB为两个用来读写该扇区的密钥,部分卡片中密钥不一样或者一个读一个写。
二、 1 号扇区
原始扇区
块 0:FF [学号前 10 字节(ASCII编码)] 000100FFFF
块 1:[学号后 2 字节(ASCII编码)] 20 20 20 20 20 20 31 31 FF FF 00 00
块 2:00000000000000000000000000000000
(全 0或全 FF)
块 3:A8AFAE6A**** FF078069 A8AFAE6A****
逐项解析
1. 块 0(基本信息)
存储内容:学号的前 10 个字符,以 ASCII 编码形式写入。在样本中该区域在块 0 的特定字节位置为可直接读取的 ASCII 串,因此这里我认为是为学号前缀。
2. 块 1(附加信息)
存储内容:学号的后 2 个字符(ASCII),其余字节为空白填充(0x20)或其它固定标识(例如 31 31)。该设计使得整个学号被分散存放于扇区的块 0 与块 1 中。
3. 块 2(额外/未用)
我的现在补办的这张校园卡这个扇区全是0,而上一张卡全是FF,猜测是初始化方式不一样或者区分单双数卡(?)
4. 块 3(访问控制)
存储:密钥 A(6 字节)、访问控制字(4 字节)、密钥 B(6 字节)。
正常来说密钥 A 与密钥 B 相同(在该样本中均为 A8AFAE6A****),访问控制字为 FF078069。
同上,该块控制本扇区的读写权限,防止未授权访问。结论(关于学号存储)学号被分为“前 10 位放块 0、后 2 位放块 1”的方式存储,均以 ASCII 编码写入;块 3 提供扇区级别的访问控制保护。
三.扇区 2、3
1) 数据结构概览每扇区同样由 4 个块构成(16 字节 * 4)
例:
1D0900352088130114058400AE01A5042
FFF3131FFFF******00FFFF0000FFFF
00000000000000000000000000000000
66A286A0****FF07806966A286A0****
一般发现:
块 0(第 1 个 16 字节):通常包含余额信息与账户/标识片段。
块 1(第 2、3 个 16 字节):猜测为固定或冗余数据+身份证号后六位(应该是卡片默认密码)。
块 2 0填充块 3(第 4 个 16 字节):扇区钥匙与访问控制字。
2) 若干块 0 的示例(脱敏处理,作为余额解析示例)
样本 A(16 字节):
73 03 00 35 26 88 13 01 AA 05 84 00 AF 01 A5 D9
→ 余额 8.83 元(以分为单位存储)。
样本 B:
1D 09 00 35 20 88 13 01 14 05 84 00 AE 01 A5 04
→ 余额23.33 元。
(以上为示例字节串;详细字节位置说明见下)
3) 余额的编码与校验推断余额位置:
在样本中,余额以 分 为单位以 2 字节形式存储(高低位逆序),位于块 0 的前 2 字节。
例如:8.83 元 → 十进制 883 → 十六进制 0x0373,在卡中以 73 03 出现(低字节优先)。23.33 元 → 2333 → 0x091D → 存为 1D 09。
校验/辅助字节:块 0 的后续字节(如第 9–10 字节与第 12–13 字节在样本中变化)似乎与余额的小数/整数部分或交易状态相关,可能为简单的校验码(通过异或、加法或其它位运算得到)。或者可能是刷卡机具的设备号,具体就不得而知了。
四.关于扇区2和3的额外发现
根据个人刷卡统计,猜测是扇区2存储的数据用于联网交易,扇区3存储的金额为离线交易。
例如:
A持卡去食堂刷卡 扇区2和3同步更新金额
A持卡去坐校车 在校车上刷卡机刷卡,此时只会更新扇区3的金额信息,扇区2保持不变。等到A再次前往食堂刷卡时,实时金额以扇区3为准,完成后扇区2和3再次同步。
五.总结
其实没啥总结的 也没分析出什么,算是大概摸清楚了校园卡的体系结构。希望本文章对你研究Mifare卡片有所帮助。
Comments NOTHING