哈尔滨商业大学校园卡扇区分析

Yuluoxk 发布于 6 天前 23 次阅读


摘要 — 目的与说明

本文对一张标准 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卡片有所帮助。

此作者没有提供个人介绍。
最后更新于 2025-09-04