文章分为三章来讲解。
第一章 基本原理及结构,公开资料,已阅读过的可以跳过
第二章 为自己整理后的浅谈

一、S50存储结构及扇区、块原理

  1. M1 卡分为 16 个扇区,每个扇区由 4 块(块 0、块 1、块 2、块 3)组成,(我们也
    将 16 个扇区的 64 个块按绝对地址编号为 0~63,存贮结构如下图所示:
  2. 第 0 扇区的块 0(即绝对地址 0 块),它用于存放厂商代码,已经固化,不可更改。
  3. 每个扇区的块 0、块 1、块 2 为 数据块,可用于存贮数据。数据块可作两种应用:
    (1) 用作一般的数据保存,可以进行 读、写 写操作。
    (2) 用作数据值,可以进行 初始化值、加值、减值、读值操作。
  4. 每个扇区的块 3 为 控制块,包括了密码 A、存取控制、密码 B。具体结构如下:
  5. 每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取
    控制。存取控制为 4 个字节,共 32 位,扇区中的每个块(包括数据块和控制块)的
    存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的 三个控
    制位。控制位定义如下:
    块 0: C10 C20 C30
    块 1: C11 C21 C31
    块 2: C12 C22 C32
    块 3: C13 C23 C33
  6. 三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如
    进行减值操作必须验证 KEY A,进行加值操作必须验证 KEY B,等等)。如下两图说明了三个控制
    位在存取控制字节中的位置。(注:控制位为4 字节,但字节 9 为备用字节)
对块 0 的存储控制结构如下所示:

nfc 0扇区数据分析_存储控制

完整的存取控制结构如下所示:

nfc 0扇区数据分析_S50_02

  1. 数据块(块 0、块 1、块 2)的存取控制如下:

例如:当块 0 的存取控制位 C10 C20 C30 = 1 0 0 时,表示:
验证密码 A 或密码 B 正确后可读。
验证密码 B 正确后可写。
不能进行加值、减值操作。

  1. 控制块块 3 的存取控制与 数据块(块 0、1、2)不同,它的存取控制如下:

例如:当块 3 的存取控制位 C13 C23 C33=0 0 1 时,表示:
密码 A:不可读,验证 KEYA 或 KEYB 正确后,可写(更改)。
存取控制:验证 KEYA 或 KEYB 正确后,可读、可写。
密码 B:验证 KEYA 或 KEYB 正确后,可读、可写。


二、存储控制浅谈

我相信刚接触S50的人,看完存储控制这部分应该是很懵的。当然也包括我,现在说一下自己的浅谈,给刚学习的同学一些指引。技术有限,也刚接触,如浅谈有错误、有问题的地方请指出。

1. 首先定义一份演示数据

nfc 0扇区数据分析_nfc 0扇区数据分析_03


看图可以了解到,数据样本扇区6的控制块,KEYA:000000000000,控制位:FF078069,KEYB:000000000000。

2. 开始分析

(1)首先把控制位的Hex(十六进制)转Bin(二进制),下方表格中的字节表示数据在控制块中的第几字节。虽然控制位为4字节,但是字节9为备用字节,并没有参与到控制中,这里就不再分析以防混乱。(不理解的同学请看本文第一章,先看理论)

字节

Hex

Bin

字节6

FF

1 1 1 1 1 1 1 1

字节7

07

0 0 0 0 0 1 1 1

字节8

80

1 0 0 0 0 0 0 0

那么将以上数据套入第一章第6节的图完整的存取控制结构(尖括号内为以上的数据,方括号内为控制位,带_b的为控制位取反,对于控制位不理解请看第一章5,6节):

结构

7

6

5

4

3

2

1

0

字节6

<1>[C23_b]

<1>[C22_b]

<1>[C21_b]

<1>[C20_b]

<1>[C13_b]

<1>[C12_b]

<1>[C11_b]

<1>[C10_b]

字节7

<0>[C13]

<0>[C12]

<0>[C11]

<0>[C10]

<0>[C33_b]

<1>[C32_b]

<1>[C31_b]

<1>[C30_b]

字节8

<1>[C33]

<0>[C32]

<0>[C31]

<0>[C30]

<0>[C23]

<0>[C22]

<0>[C21]

<0>[C20]

再次整理数据后得到(不理解的看第一章第5,6,7,8节):
块0 存储控制为 : C10 | C20 | C30,控制码为>000
块0说明:验证KeyA或KeyB后,可读可写,可做增减值操作

块1 存储控制为:C11 | C21 | C31,控制码为>000
块1说明:验证KeyA或KeyB后,可读可写,可做增减值操作

块2 存储控制为:C12 | C22 | C32,控制码为>000
块2说明:验证KeyA或KeyB后,可读可写,可做增减值操作

块3 存储控制为:C13 | C23 | C33,控制码为>001
块3说明:(1)前6字节,KeyA不可读,验证KeyA或KeyB后可写。
(2)中间4字节,存取控制:验证 KEYA 或 KEYB 正确后,可读、可写。
(3)后6字节,KeyB:验证 KEYA 或 KEYB 正确后,可读、可写。


三、结尾

写得比较仓促,有时间后再进行补充。