关于电子单程双程车票(卡)的数据安全性问题探讨(一)
目前在各个城市的公共交通系统(地铁、公交巴士等)中广泛地使用了电子车票来作为进出站的控制,其中对于最简单的单程/双程车票的应用,一般我们会使用廉价的Mifare Light 卡(芯片)或上海华虹SHC1102卡(芯片)或复旦微电子FM11RF005卡(芯片)等来作为识别载体。这些车票的封装形式、可能的物理形状为一个圆形的“Token”筹码等。
一.Mifare Light 卡
Mifare Light 卡的开发目的是为了在Mifare 技术平台中,为了高度集中于对芯片的存储器容量进行优化,满足“small memory application”(小存储容量应用)而设计的一款Mifare家族系列产品。注意,由于Mifare Light 卡是Mifare家族系列产品中的一员,特别地,它是Mifare 1 S50卡片的一种转换产品,即在卡片内部的容量等方面采取了小型化,从Mifare1 S50的16Kbits(2Kbytes)缩小到Mifare Light 卡的384bits(48字节),但是Mifare Light 卡仍然保持了大部分的Mifare1 S50卡芯片的特性,因此,对Mifare Light 卡的读写操作,可以完全使用/兼容已经应用在Mifare 1 S50卡的读写设备。
相比于Mifare 1 S50卡,由于Mifare Light 卡在存储器容量上得到了极大的优化、缩小处理(小容量卡),因此在(性能)价格(比)上具有非常大的优势,但存储容量的缩小,一般也只是适合于作为一个应用的卡片载体(例如单程或双程电子车票)。而Mifare 1 S50卡则可以适用在一些比较复杂的多个电子应用的项目中,例如作为可以反复充值的地铁/公交储值卡等。
如下是Mifare Light卡的一些主要特性和技术指标:
1.卡片容量为384位(48字节)的低功耗EEPROM存储器
2.具有唯一的32位(4字节)卡片序列号
3.含有16位(2字节)的数值计数器(芯片中已含有可以防止数据被分割破坏的功能),如果加上需要反写的数值计数器,总共占用8字节—64bits
4.128位(16字节—4页)的用户可编程序数据区(如果用户不启用上述的数值计数/校验功能,则数据区容量可达192位—24字节)
5.用户可自定义数据存储器中数据的读/写控制权限,有两套密码(KEYA和KEYB)来配合完成
6.读写距离:在10cm以内(与天线有关)
7.卡片内无需电源
8.Mifare Light卡兼容Mifare 1 S50卡的读/写设备模块,表现在:
(a)工作频率:13.56MHZ
(b) 通信速率:106KB波特率
(c)防冲突:同一时间可处理多张卡
(d)具有数据整体性校验功能(16bit的CRC,偶校验,位编码,位流计算,RF位通道监控等)
(e)具有和Mifare 1 (S50)卡相同的认证功能(authentication)和RF通道加密功能(RF channel encryption)
注意,上述第8条第(e)款的功能的启用或禁止,对于Mifare Light卡和读写器设备之间的空中交换的卡片数据或读写器命令数据的加密特性有直接的关联!如果读写器模块的RF通道加密功能被禁止,则空中交换的数据将是以“明文”方式存在,一旦数据被在此非法截取,将威胁到卡片原始数据的安全保密特性!!!
如果是一张单程地铁车票,这一威胁表现在:一张单程地铁车票中的数据可以被准确无误地被截取。
如何避免这一安全保密性不受到威胁,在应用系统开发阶段,应该在读写器模块(例如RC530/531等)的相应的RF通道寄存器设置中,必须启用加密特性,设置相应的寄存器数值!!!也就是将卡片和读写机具的空中数据传输模式由“transparence mode”(“明文数据模式”)设置为“encryption mode”(“加密数据模式”),由此避免卡片原始数据的安全保密特性受到被截取的威胁。
如果处于“encryption mode”,即使卡片数据被截取,由于截取者很难从已截取的(加密的)数据中反向推倒出卡片中的原始数据(除非该截取者知道这一加密算法),从而保护了卡片中的原始数据的安全保密特性!!!
如何设置读写模块的专用芯片,例如RC500/RC531等,可以查阅相应的文档资料。一般地,我们应该关注这些相关的寄存器的设置:
Control Register (Addr=0x09);Channel/Redundancy Register (Addr=0x22);Crypto1 Keys;LoadKey(Addr=0x19);Authent1(Addr=0x0C);Authent2(Addr=0x14);Working with the Transmit/Receive Command (Addr=0x1A, 0x1E,0x16);等等。如图所示为相关的一些寄存器(RC530)内部控制寄存器等。
如果控制寄存器(Control Register)中的第3个位(bit)Crypto1On被设置为“1”(在Mifare Light 卡片和读写器进行相互认证操作Authent2完成后),则,读写器和Mifare Light卡片进行非接触通信的空中数据将全部被加密,不再是明文传输。
举个简单的例子,如果单程车票(Mifare Light芯片)卡片中的钱包数据为5(元人民币),则实际读写器接收到的空中数据将不是“0x05”,而是一个经过了加密算法运算后的数据,例如可能为“0x1a2b3c”。由于一般人员不会知晓这一加密算法的构造,因此,即使他非常不容易地截取拿到了这个数据“0x1a2b3c”,他也没有办法回塑、反推到具体的钱包数据为“5”元还是其它数额等。钱包的数据仍然是安全保密的。
另外,作为一个非常专业的IC卡应用系统开发人员,本身还必须对钱包数据(一次性的单程/双程车票或反复使用的地铁/公交储值卡内的钱包数据)执行“一卡一密”的钱包数据加密。加密的结构和算法如下简单说明一下。
加密算法:可以采用公开标准的DES算法或3-DES算法;(具体的算法程序等比较复杂,如果有兴趣,可以与笔者联系获得。)
加密结构:如图所示为相应的一种典型的关系型加密结构。我们可以把DES算法看作是一个“黑盒子”,内部所有的数据和运算是保密的、不可逆的。
加密操作说明如下:
如果要求加密的钱包金额数据B=0x10(元),而该张单程车票的唯一卡号为A=0x0001, 控制密钥为C=0xFFFF,则该张单程车票的加密后的钱包数据D(可能)=0x1a2b3c;(注意,一般从数据D是不可能推倒出数据输入量B的准确值的,这是由DES加密算法的“不可逆推特性”所决定的,否则不能作为加密算法!)
如果要求加密的另外一张单程车票的唯一卡号为A=0x0002,而所有其它的输入量A和C都一样(也即同样在两个单程车票中存入相同的钱包金额数据B=0x10(元)),则加密算法此时的输出量D(可能)=0x2a3c4d;等等,但是绝对不可能是和前一张的输出量D(=0x1a2b3c)相同!!!à 这一特性是由加密算法(DES或3-DES或RSA或其它算法)的“不同输入量一定形成不同的输出量”这一特性来决定的!!!
尽管两张单程车票的钱包金额相同,但实际存储在单程车票内部对应的数据是完全不同的,也即达到了“一卡一密”的目的!如果有任何的数据截取行为发生,受到威胁的只是当前的这张卡片(单程车票),整个应用系统还是非常安全的、保密的!并且如果截取者要改写钱包数据到这张卡片(单程车票),则如果他不知加密算法,不知该张卡片号(输入量A)、具体钱包金额(输入量B)和应该写入卡片的钱包金额(输出量D)之间的关系,那么写入的数据(输出量D)是无法正确还原到输入量B的。(读写器在读到该数据D后将做DES逆算法,将算出的D和卡片发送的该数据D相互比较,如果不一致,则认为卡片数据已遭篡改!)
Mifare Light卡存储结构
Mifare Light卡共有384位,分为12页,每页为4个字节。存储结构如下:
页号 |
字节0 |
字节1 |
字节2 |
字节3 |
|
Page 0 |
SerNr(0) |
SerNr(1) |
SerNr(2) |
SerNr(3) |
Block 0 |
Page 1 |
SerNr(4) |
Size Code |
Type(0) |
Type(1) | |
Page 2 |
Data(0) |
Data(1) |
Data(2) |
Data(3) |
Data1 |
Page 3 |
Data(4) |
Data(5) |
Data(6) |
Data(7) | |
Page 4 |
Value(0) |
Value(1) |
Value_b(0) |
Value_b(1) |
Value |
Page 5 |
Value(0) |
Value(1) |
Value_b(0) |
Value_b(1) | |
Page 6 |
KeyA(0) |
KeyA(1) |
KeyA(2) |
KeyA(3) |
KeyA |
Page 7 |
KeyA(4) |
KeyA(5) |
AC-A |
AC-A_b | |
Page 8 |
KeyB(0) |
KeyB(1) |
KeyB(2) |
KeyB(3) |
KeyB |
Page 9 |
KeyB(4) |
KeyB(5) |
AC-B |
AC-B_b | |
Page A |
Data(0) |
Data(1) |
Data(2) |
Data(3) |
Data2 |
Page B |
Data(4) |
Data(5) |
Data(6) |
Data(7) | |
总计=12页 |
|
|
|
|
|
( 注:_b表示取反;AC-A_b为AC-A的取反数值 )
1) 第0、1页存放着Mifare Light卡的序列号等信息,只可读。
2) 第2、3页及最后A、B两页数据块,可存贮一般的数据。
3) 和4、5页为数值块,可作为重要数据(例如钱包)使用,两字节的值以正和反两种形式存贮。只有减值操作,没有加值操作。如果不做钱包使用,则可以做为普通的数据块使用。
4)第6、7、8、9页存储着密码A(6字节)、密码B(6字节)及存取控制AC。
5)一次写操作可以操作一个页(4个字节),一次读操作可以操作两页(8个字节)。
6)第7页中的2字节(AC-A和AC-A_b)、第9页中的2字节(AC-B、AC-B_b)为数据存储控制字节,存储控制字节以正写和反写的形式各存一次。
存储控制字节AC-A和AC-B的数据格式如下,字节(byte)中每个位(bit)如果为“1”,则“使能”相应的功能;反之,如果是“0”,则关闭相应功能。
Bit 7 |
--- |
Bit 6 |
--- |
Bit 5 |
Data2—Write –Enable |
Bit 4 |
Data2—Read—Enable |
Bit 3 |
Key+AC—Write—Enable |
Bit 2 |
Value—Write—Enable |
Bit 1 |
Data1—Write—Enable |
Bit 0 |
Data1—Read—Enable |
例如:如果AC-A的数据=“0xFF”=“11111111”b,则表示:
页Data1:可读、可写;
页Value:可写;
AC-A:可写;
Data2:可读、可写;
二.上海华虹 SHC1102卡
上海华虹集成电路有限公司的 SHC1102 集成电路(IC)是非接触式IC卡芯片系列中面向低成本应用的一个产品,它能够用小型天线完成与读写终端之间的射频通信,其技术和测试标准符合ISO/IEC 14443-Type A 的国际标准,具有非常强的经济性和可靠性。SHC1102 芯片适用于轨道交通AFC收费系统中的可回收单程票、防伪无线电子标签、电子门锁、身份识别及代币筹码等领域。
主要技术参数
1.工作频率:13.56 MHz
2.通信速率:106k bps
3.调制方式:ISO/IEC 14443 Type A
4.工作温度:-20℃至80℃
5.存贮容量:512 bits
6.无电池: 无线方式传递数据和能量
7.读写距离:在距读卡器天线0-40 mm区域内能正确进行数据交换和完成各项操作
8.采用半双工通讯协议
9.在无线通讯过程中通过以下机制来保证数据完整
i.---每帧有16位CRC检验
ii.---每字节有奇偶校验位
iii.---检查位数
iv.---用编码方式来区分l、0或无信息
10.数据安全性
i.---相互认证
ii.---每张卡的序列号唯一
iii.---传输密钥保护
11.灵活的的存储结构
i. ---512 位EEPROM (16 Blocks × 4 Bytes × 8 Bits )
ii. ---分为2个不同访问条件的数据区 ( DATA 1、DATA 2 )
iii. ---每个块为最小访问单位,由4个字节组成
iv. ---每个芯片可定义自己独立的密钥 (4 Bytes )
12.数据保持时间大于10年
13.擦写次数大于10万次
14.典型交易时间小于200ms
数据交易流程
当 SHC1102 芯片接收到读写器的指令后,经过指令译码,通过控制逻辑进行数据处理,并返回相应的处理结果。
当华虹 SHC1102 位于读写器的有效工作范围之外时,芯片处于无电状态,不能进行任何操作;当其进入读写器的有效工作范围,芯片上电复位,进入等待状态,在此状态下可正确接收和响应读写器发送的询卡/应答指令,并进行相互认证、读、写等操作。
数据操作指令
询卡/应答
读写器通过发出指令来确认是否有华虹非接触式IC卡产品(SHC1102)进入其操作范围,并通过应答确认产品的类型。并由产品类型确定相互之间的通讯协议和通讯速率。卡应在确认被选中后返回卡的用户码(CID)。
认证
SHC1102进入读写器的有效工作范围并正确响应之后,读写器与SHC1102标签之间要进行相互认证。只有都通过了认证,读写器才能开始对卡进行权限操作。(非权限读操作无需认证即可进行)。
认证过程如下:
(A) 读写器认证标签:通过非权限读指令获得标签的序列号(UID)和应用数据区1(DATA1)的数据,判别其内容和数据结构,验证标签的合法性。验证通过后,读写器将有关的数据按相应算法进行处理,产生密钥发送给标签。
(B) 标签认证读写器:标签在初始化时被写入4个字节的密钥,该密钥由标签的序列号(UID)和应用数据区1(DATA 1)中的有关内容按相应的算法运算产生。通过验证(A)中读写器所发送的密钥可确认读写器的合法性。
读写操作
在完成必要的认证后,读写器就可以开始对SHC1102进行读写操作了。
读:读一个块,直接读或经认证后读
写:写一个块,必须先通过认证
停止
将 SHC1102设置为停止等待状态。
存储区结构
存储区结构
SHC1102中的EEPROM存储区容量为512 Bits,分成16个块(Block),每个块由4个字节组成,每个字节有8位。块是存储区的最小访问单位。
SHC1102芯片中EEPROM存储区的结构如图所示:
Block No. (块号) |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
0 |
CID0 |
CID1 |
MID0 |
MID1 |
1 |
UID0 |
UID1 |
UID2 |
UID3 |
2 |
DATA 1 |
DATA 1 |
DATA 1 |
DATA 1 |
… … |
DATA 1 |
DATA 1 |
DATA 1 |
DATA 1 |
7 |
DATA 1 |
DATA 1 |
DATA 1 |
DATA 1 |
8 |
Password |
Password |
Password |
Password |
9 |
DATA 2 |
DATA 2 |
DATA 2 |
DATA 2 |
… … |
DATA 2 |
DATA 2 |
DATA 2 |
DATA 2 |
15 |
DATA 2 |
DATA 2 |
DATA 2 |
DATA 2 |
制造商块
块0、块1是特殊的数据块,用于存放制造商代码(MID)、客户代码(CID)、唯一序列号(UID),称制造商块。制造商块中的数据由芯片制造商在生产过程中写入,数据只读,不可改写。
· 制造商代码(MID): 2 Bytes
· 客户代码(CID): 2 Bytes
· 唯一序列号(UID): 4 Bytes
密钥块
块8专用于存放认证的密钥,称密钥块,此块存放的数据须通过认证后才可读或可改写。
应用数据区 1 ( DATA 1 )
· 应用数据区1 :块2 ~ 块7 (DATA 1)
· 访问控制条件:读 ―― 无条件; 写―― 认证 Key
应用数据区 2 ( DATA 2 )
· 应用数据区2 :块9 ~ 块15 (DATA 1)
· 访问控制条件:读 ―― 认证 Key; 写―― 认证 Key
注意事项
当对密钥块中的数据进行写操作时,需要良好的操作环境(将标签置于可靠的读写区域中),以防止发生写操作非正常中断,造成该标签被自锁而无效。
传输密钥在芯片测试或标签出厂时写入,其内容可以由客户指定;传输密钥由厂商通过秘密途径提供给标签的用户或系统集成商。