存取控制指符合什么条件才能对卡片进行操做。测试
S50和S70的块分为数据块和控制块,对数据块的操做有“读”、“写”、“加值”、“减值(含传输和存储)”四种,对控制块的操做只有“读”和“写”两种。spa
S50和S70的每一个扇区有两组密码KeyA和KeyB,所谓的“条件”就是针对这两组密码而言,包括“验证密码A能够操做(KeyA)”、“验证密码B能够操做(KeyB)”、“验证密码A或密码B均可以操做(KeyA|B)”、“验证哪一个密码都不能够操做(Never)”四种条件。ci
这些“条件”和“操做”的组合被分红8种状况,正好能够用3位二进制数(C一、C二、C3)来表示。it
数据块(每一个扇区除区尾块以外的块)的存取控制以下表所示:table
控制位权限 |
访 问 条 件 (验证哪一个密码)二进制 |
|||||
C1密码 |
C2数据 |
C3查询 |
读 |
写 |
加值 |
减值(含传输和存储) |
0 |
0 |
0 |
KeyA|B |
KeyA|B |
KeyA|B |
KeyA|B |
0 |
1 |
0 |
KeyA|B |
Never |
Never |
Never |
1 |
0 |
0 |
KeyA|B |
KeyB |
Never |
Never |
1 |
1 |
0 |
KeyA|B |
KeyB |
KeyB |
KeyA|B |
0 |
0 |
1 |
KeyA|B |
Never |
Never |
KeyA|B |
0 |
1 |
1 |
KeyB |
KeyB |
Never |
Never |
1 |
0 |
1 |
KeyB |
Never |
Never |
Never |
1 |
1 |
1 |
Never |
Never |
Never |
Never |
从表中能够看出,
C1C2C3=000(出厂默认值)时最宽松,验证密码A或密码B后能够进行任何操做;
C1C2C3=111不管验证哪一个密码都不能进行任何操做,至关于把对应的块冻结了;
C1C2C3=010和C1C2C3=101都是只读,若是对应的数据块写入的是一些能够给人看但不能改的基本信息,能够设为这两种模式;
C1C2C3=001时只能读和减值,电子钱包通常设为这种模式,好比用S50作的公交电子车票,用户只能查询或扣钱,不能加钱,充值的时候先改变控制位使卡片能够充值,充完值再改回来。
控制块(每一个扇区的区尾块)的存取控制以下表所示:
控制位 |
密码A |
存取控制 |
密码B |
|||||
C1 |
C2 |
C3 |
读 |
写 |
读 |
写 |
读 |
写 |
0 |
0 |
0 |
Never |
KeyA |
KeyA |
Never |
KeyA |
KeyA |
0 |
1 |
0 |
Never |
Never |
KeyA |
Never |
KeyA |
Never |
1 |
0 |
0 |
Never |
KeyB |
KeyA|B |
Never |
Never |
KeyB |
1 |
1 |
0 |
Never |
Never |
KeyA|B |
Never |
Never |
Never |
0 |
0 |
1 |
Never |
KeyA |
KeyA |
KeyA |
KeyA |
KeyA |
0 |
1 |
1 |
Never |
KeyB |
KeyA|B |
KeyB |
Never |
KeyB |
1 |
0 |
1 |
Never |
Never |
KeyA|B |
KeyB |
Never |
Never |
1 |
1 |
1 |
Never |
Never |
KeyA|B |
Never |
Never |
Never |
从表中能够看出,
密码A是永远也读不出来的,若是用户的数据块指定了验证密码A却忘了密码A,也就意味着这个数据块做废了,但本扇区其余数据块和其余扇区的数据块不受影响;
存取控制老是能够读出来的,只要别忘了密码A或密码B;
存取控制的写控制在设置时必定要当心,一旦弄成了“Never”,则整个扇区的存取条件再也没法改变,后悔都找不到地方,只能仰天长叹了;
C1C2C3=001(出厂默认值)时最宽松,除了密码A不能读以外,验证了密码A其余读写操做均可以进行;
还有一个有意思的现象是当C1C2C3=000、C1C2C3=010和C1C2C3=001时,全部的操做都不使用密码B,这时候密码B占据的6个字节能够提供给用户做为普通数据存储用,至关于每一个扇区增长了6字节的用户可用存储容量。
因为卡片出厂的默认值C1C2C3=001,因此对于新买来的卡片,不要使用密码B进行认证,不然会致使区尾块和数据块都没法进行任何操做。我测试过不一样厂家的新卡片,有的验证密码B后确实扇区内的全部块都没法操做,但有的卡片不能操做区尾块,却能够操做数据块,本文以NXP的原装卡为准。固然用户能够放心,新卡不让你验证密码B而你却验证了,不会对卡照成什么伤害,改回用密码A验证,卡片仍是能够正常使用的。
S50的每一个扇区有4个块,这四个块的存取控制是相互独立的,每一个块须要3个bit,四个块共使用12个bit。在保存的时候,为了防止控制位出错,同时保存了这12个bit的反码,这样一个区的存储控制位在保存时共占用24bit的空间,正好是3个字节。咱们前面说存取控制字有四个字节(区尾块的Byte6~Byte9),实际上只使用的Byte六、Byte7和Byte8,Byte9没有用,用户能够把Byte9做为普通存储空间使用。各块控制位存储格式以下:
|
|
块3(区尾块) |
块2 |
块1 |
块0 |
Byte6 |
b3 b2 b1 b0 |
块3-C1-反 |
块2-C1-反 |
块1- C1-反 |
块0-C1-反 |
b7 b6 b5 b4 |
块3-C2-反 |
块2-C2-反 |
块1- C2-反 |
块0-C2-反 |
|
Byte7 |
b3 b2 b1 b0 |
块3-C3-反 |
块2-C3-反 |
块1- C3-反 |
块0-C3-反 |
b7 b6 b5 b4 |
块3-C1 |
块2-C1 |
块1- C1 |
块0-C1 |
|
Byte8 |
b3 b2 b1 b0 |
块3-C2 |
块2-C2 |
块1- C2 |
块0-C2 |
b7 b6 b5 b4 |
块3-C3 |
块2-C3 |
块1- C3 |
块0-C3 |
因为出厂时数据块控制位的默认值是C1C2C3=000,控制块的默认值是C1C2C3=001,而Byte9通常是69H,因此出厂白卡的控制字一般是FF078069H.
S70的前32个数据块结构和S50彻底一致。后8个数据块每块有15个普通数据块和一个控制块。显然若是每一个数据块块单独控制将须要8字节的控制字,控制块中放不下这么多控制字。解决的办法是这15个数据块分为三组,块0~4为第一组,块5~9为第二组,块10~15为第三组,每组共享三个控制位,也就是说每组控制位C1C2C3控制5个数据块的存取权限,从而与前32个扇区兼容。