转自:http://blog.sina.com.cn/s/blog_683b6e4f0102vtfm.html
随着社会的发展,智能卡在很多领域得到了广泛的应用。特别是非接触卡,由于使用方便以及功能强大的特点,在管理、公交、工作证、身份识别等领域得到了快速的普及和推广。
非接触卡已经逐步发展成为一个独立的跨学科的专业领域。它将大量来自完全不同专业领域的技术综合到一起:如高频技术、电磁兼容性技术、半导体技术、数据保护和密码学、电信、制造技术和许多专业应用技术等。
Mifare是NXP公司生产的一系列遵守ISO14443A标准的射频卡,包括Mifare S50、Mifare S70、Mifare UltraLight、Mifare Pro、Mifare Desfire等,由于Mifare的巨大影响力,业内有时把其它公司生产的遵守ISO14443A标准的射频卡也称为“Mifare”,尤其是Mifare S50卡片,几乎就是ISO14443A标准的代言人。Mifare系列卡片有时也根据卡内使用芯片的不同,Mifare UltraLight称为MF0,Mifare S50和S70称为MF1,Mifare Pro称为MF2,Mifare Desfire称为MF3。
Mifare智能卡的核心是Philips公司的微模块(微晶片),其通讯层(MIFARE RF接口)符合ISO/IEC 14443A标准的第2和第3部分。其安全层支持域检验的CRYPTO1数据流加密。常用的有S50,S70。
Mifare S50的容量为1K字节,常被称为Mifare Standard,又被叫做Mifare 1,是遵守ISO14443A标准的卡片中应用最为广泛、影响力最大的的一员。S50的卡类型(ATQA)是0004H。Mifare S70的容量为4K字节。常被称为Mifare Classic,S70的卡类型(ATQA)是0002H。
这些卡片都有一个全球唯一的序列号,序列号的长度可能是4字节,7字节或10字节。当多张卡片同时进入读写器的射频场时,卡片遵守面向比特的防冲突机制,由读卡器选出唯一的一张卡片进行操作。读写器操作完一张卡片后,可以发送休眠命令让这张卡片进入休眠状态,而读卡器继续对其他卡片进行操作。
根据信号发送和接收方式的不同,ISO/IEC14443-3定义了TYPEA、TYPEB两种卡型。它们的不同主要在于载波的调制深度及二进制数的编码方式。从读写机具向卡传送信号时,二者是通过13.56Mhz的射频载波传送信号。
以飞利浦,西门子公司为代表的TYPEA。它发送100%ASK调制修正的Miller编码,传输速率106kb/s;接收-副载波调制847.5kHz的Manchester编码。简单说,当表示信息‘1‘时,信号会有0.2-0.3微妙的间隙,当表示信息‘0‘时,信号可能有间隙也可能没有,与前后的信息有关。这种方式的优点是信息区别明显,受干扰的机会少,反应速度快,不容易误操作;缺点是在需要持续不断的提高能量到非接触卡时,能量有可能会出现波动。
以摩托罗拉,意法半导体公司为代表的TYPEB。它发送10%ASK调制数位编码NRZ(不归零制),传输速率106kb/s;接收-副载波调制847.5kHz数位编码BPSK(二进制相位键控)传输速率106kb/s。即信息‘1‘和信息‘0‘的区别在于信息‘1‘的信号幅度大,即信号强,信息‘0‘的信号幅度小,即信号弱。这种方式的优点是持续不断的信号传递,不会出现能量波动的情况;缺点是信息区别不明显,相对来说易受外界干扰,会有误信号出现,当然也可以采用检验的方式来弥补。
从typeA和typeB的比较可以看出以下几点:
1)从读写器到卡的调制,typeA用100%ASK,因此信号区别明显,易于检测,抗干扰能力强;但在每一位的传送(传输速率为106kb/s时,传送周期为9.4μs)中,有约3的信号间隙μs,这时的读写器到卡的能量供应中断,必须在卡内电路中加一个大容量电容以维持一定的能量供应;而typeB用10%ASK,卡片可以从读写器获得持续的能量;但信号区别不明显,容易造成误读/写,抗干扰能力较差。
2)typeA卡片能量的中断会导致卡片时钟的中断,而回避时钟中断问题又可能留一个后门,让“单步跟踪”有机可乘。
3) 当试图提速时,如传送速率为212kb/s时,位传送周期仅为4.7μs,这种情况下3μs的中断已大于传送周期的60%,而传送速率为424kb/s 时,位传送周期仅为2.35μs,这种情况下3μs的中断已经使系统无法工作,既typeA无法实现这种速度传递,无法提速!
4)typeA的防冲突需要卡片上较高和较精确的时序,因此需要在卡和读写器中分别加一些硬件,而typeB的防冲突可以用软件来实现。
由以上对比可以看出,两种技术很难说孰优孰劣,这也是国际ISO组织确定两种标准的原因之一。然而对公交系统来说,需仔细分析一下,最好是采用一种标准。在公共汽车上,干扰很大,打卡时间又必须非常快,所以误信号出现的机率越小越好,从这个方面来说,采用TYPEA相对来说适合一些。另外,由于受国情限制,公交在短期内采用非接触CPU卡的机会不大,一般会采用非接触逻辑加密卡。在使用非接触逻辑加密卡的过程中,由于卡里没有CPU在工作,对能量的持续性要求并不是很强,所以TYPEA可以很好的工作,这也是TYPEB力推非接触CPU卡的原因,它们基本不生产非接触逻辑加密卡。
根据信号发送和接收方式的不同,ISO/IEC14443-3定义了TYPEA、TYPEB两种卡型。它们的不同主要在于载波的调制深度及二进制数的编码方式。从读写机具向卡传送信号时,二者是通过13.56Mhz的射频载波传送信号。
以飞利浦,西门子公司为代表的TYPEA。它发送100%ASK调制修正的Miller编码,传输速率106kb/s;接收-副载波调制847.5kHz的Manchester编码。简单说,当表示信息‘1‘时,信号会有0.2-0.3微妙的间隙,当表示信息‘0‘时,信号可能有间隙也可能没有,与前后的信息有关。这种方式的优点是信息区别明显,受干扰的机会少,反应速度快,不容易误操作;缺点是在需要持续不断的提高能量到非接触卡时,能量有可能会出现波动。
以摩托罗拉,意法半导体公司为代表的TYPEB。它发送10%ASK调制数位编码NRZ(不归零制),传输速率106kb/s;接收-副载波调制847.5kHz数位编码BPSK(二进制相位键控)传输速率106kb/s。即信息‘1‘和信息‘0‘的区别在于信息‘1‘的信号幅度大,即信号强,信息‘0‘的信号幅度小,即信号弱。这种方式的优点是持续不断的信号传递,不会出现能量波动的情况;缺点是信息区别不明显,相对来说易受外界干扰,会有误信号出现,当然也可以采用检验的方式来弥补。
从typeA和typeB的比较可以看出以下几点:
1)从读写器到卡的调制,typeA用100%ASK,因此信号区别明显,易于检测,抗干扰能力强;但在每一位的传送(传输速率为106kb/s时,传送周期为9.4μs)中,有约3的信号间隙μs,这时的读写器到卡的能量供应中断,必须在卡内电路中加一个大容量电容以维持一定的能量供应;而typeB用10%ASK,卡片可以从读写器获得持续的能量;但信号区别不明显,容易造成误读/写,抗干扰能力较差。
2)typeA卡片能量的中断会导致卡片时钟的中断,而回避时钟中断问题又可能留一个后门,让“单步跟踪”有机可乘。
3) 当试图提速时,如传送速率为212kb/s时,位传送周期仅为4.7μs,这种情况下3μs的中断已大于传送周期的60%,而传送速率为424kb/s 时,位传送周期仅为2.35μs,这种情况下3μs的中断已经使系统无法工作,既typeA无法实现这种速度传递,无法提速!
4)typeA的防冲突需要卡片上较高和较精确的时序,因此需要在卡和读写器中分别加一些硬件,而typeB的防冲突可以用软件来实现。
由以上对比可以看出,两种技术很难说孰优孰劣,这也是国际ISO组织确定两种标准的原因之一。然而对公交系统来说,需仔细分析一下,最好是采用一种标准。在公共汽车上,干扰很大,打卡时间又必须非常快,所以误信号出现的机率越小越好,从这个方面来说,采用TYPEA相对来说适合一些。另外,由于受国情限制,公交在短期内采用非接触CPU卡的机会不大,一般会采用非接触逻辑加密卡。在使用非接触逻辑加密卡的过程中,由于卡里没有CPU在工作,对能量的持续性要求并不是很强,所以TYPEA可以很好的工作,这也是TYPEB力推非接触CPU卡的原因,它们基本不生产非接触逻辑加密卡。
MIFARE集成电路芯片内含EEPROM、RF接口和数字控制单元。
在RF射频接口电路中,主要包括有波形转换模块。它可将卡片读写器上的13.56MHZ的无线电调制频率接收,一方面送调制/解调模块,另一方面进行波形转换,将正弦波转换为方波,然后对其整流滤波,由电压调节模块对电压进行进一步的处理,包括稳压等,最终输出供给卡片上的各电路。POR模块主要是对卡片上的各个电路进行POWER-ON-RESET(上电复位),使各电路同步启动工作。
数字电路部分主要包括:ATRmodule,AntiCollisionmodule,Select Applicationmodule,Control & Arithmetic Unit, RAM/ROMUnit, Crypto Unit.
Control & Arithmetic Unit(控制及算术运算单元)这一单元是整个卡片的控制中心,是卡片的“头脑”。它主要进行对整个卡片的各个单位进行微操作控制,协调卡片的各个步骤;同时它还对各种收/发的数据进行算术运算处理,递增/递减处理,CRC运算处理,等等。是卡片中内建的中央微处理机(MCU)单元。
RAM主要配合控制及算术运算单元,将运算的结果进行暂时存储,如果某些数据需要存储到EEPROM,则由控制及算术运算单元取出送到EEPROM存储器中;如果某些数据需要传送给读写器,则由控制及算术运算单元取出,经过RF射频接口电路的处理,通过卡片上的天线传送给卡片读写器。RAM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工作范围内)将被清除.同时,ROM中还固化了卡片运行所需要的必要的程序指令,由控制及算术运算单元取出去对每个单元进行微指令控制。使卡片能有条不紊地与卡片的读写器进行数据通信。
Crypto Unit( 数据加密单元)完成对数据的加密处理及密码保护。加密的算法可以为DES标准算法或其他。
该单元主要用于存储数据。EEPROM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工作范围内)仍将被保持。用户所要存储的数据被存放在该单元中。
Mifare S50把1K字节的容量分为16个扇区(Sector0-Sector15),每个扇区包括4个数据块(Block0-Block3),我们也将16个扇区的64个块按绝对地址编号为0~63,每个数据块包含16个字节(Byte0-Byte15),64*16=1024。
Mifare S70把4K字节的容量分为40个扇区(Sector0-Sector39),其中前32个扇区(Sector0-Sector31)的结构和Mifare S50完全一样,每个扇区包括4个数据块(Block0-Block3),后8个扇区每个扇区包括16个数据块(Block0-Block15)。我们也将40个扇区的256个块按绝对地址编号为0~255,每个数据块包含16个字节(Byte0-Byte15),256*16=4096。
型号 |
扇区号 |
名称 |
绝对块 |
Mifare S50 |
sector0 |
厂商代码 |
B0 |
数据块 |
B1 |
||
B2 |
|||
扇区尾块 |
B3 |
||
- - - Sector15 |
数据块 |
B60 |
|
B61 |
|||
B62 |
|||
扇区尾块 |
B63 |
||
Mifare S70 |
- - - Sector31 |
数据块 |
B124 |
B125 |
|||
B126 |
|||
扇区尾块 |
B127 |
||
- - - - - - - - - Sector39
|
数据块 |
B240 |
|
B241 |
|||
B242 |
|||
B243 |
|||
B244 |
|||
B245 |
|||
B246 |
|||
B247 |
|||
B248 |
|||
B249 |
|||
B250 |
|||
B251 |
|||
B252 |
|||
B253 |
|||
B254 |
|||
扇区尾块 |
B255 |
0扇区0块是特殊的数据块,用于存放制造商代码,包括芯片序列号,此块只读。出于安全和系统需求,此块是制造商在生产过程中编程后写保护的。
普通数据块可通过数据块备份进行数据完整性的管理。一般每块16个字节中有两个用来存放校验码和备份块的地址。各区均有3个16字节的块用于存储数据(区0只有两个数据块以及一个只读的厂商代码块)。
数据块可作两种应用:
1) 用作一般的数据保存,可以进行读、写操作。例如用于非接触门禁管理。
2) 用作数值块,可以进行加值、减值、转存和恢复。例如用于电子钱包,可直接控制存储值,如增值、减值。在用于非充值卡的一种情况(‘001’)下,只能够读和减值。在另一种情况(‘110‘)下,可以用key B充值。
数值块具有电子钱包功能(有效命令:read,write, increment,decrement, restore, transfer)。数值块有固定的数据格式,它采用冗余存储方法以保证其数据的正确性。以便于错误检测、纠错和备份管理。数值块格式如下:
字节号 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
存储形式 |
VALUE |
VALUE-1 |
VALUE |
A |
A-1 |
A |
A-1 |
|||||||||
说明 |
数值 |
地址 |
Ø 数值:有符号4字节数值。数值的最低字节存储在最低地址字节。负值以标准的2的补码形式存储。出于数据完整性和安全原因,数值存储三次,两次不取反,一次取反。
Ø 地址(Adr):1字节地址,当进行备份管理时,可用于保存块的地址。地址保存四次。两次取反,两次不取反。在increment、decrement、restore和transfer 操作中,地址保持不变。它只能通过write命令更改。
对密钥和控制位的读写取决于尾块(块3)的访问控制位,分为“禁止”、“KEYA”、“KEY B”和“KEY A|B”( KEY A或KEY B)。
字节号 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
说明 |
密钥A |
读写控制 |
密钥B(可选) |
在每个扇区最后一个块即区尾中存放有密钥A、访问条件、密钥B等内容,它们用于控制对该扇区的操作。其中第0-5字节为48位的密钥A;第6-8字节为访问控制条件;第9字节为备用区可用于存放特殊的应用数据,如存放数据备份区的地址;剩下的6个字节存放密钥B,如用户不需要密钥B,则可用于存放一般的应用数据。由于区尾中访问条件的数据很重要,因此使用了冗余存储的方法。
控制位字节具体说明如下:
bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字节6 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
字节7 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
字节8 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
字节9 |
|
|
|
|
|
|
|
|
例如:M1的卡片初始控制字为:7F078800,我们对它分析如下:
字节6-7F:01111111
字节7-07:00000111
字节8-88:10001000
字节9-00:0000 0000
那么我们可以得出:
块0 |
C10 |
C20 |
C30 |
0 0 0 |
块1 |
C11 |
C21 |
C31 |
0 0 0 |
块2 |
C12 |
C22 |
C32 |
0 0 0 |
块3 |
C13 |
C23 |
C33 |
0 1 1 |
块3的访问控制位为011,根据下表查得:
密码A:不可读;验证KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读;验证KEYB正确后,可写。
密码B:不可读;验证KEYB正确后,可写。
访问控制位 |
所控制的访问对象 |
注释 |
|||||||
KEY A |
访问控制位 |
KEY B |
|||||||
C1 |
C2 |
C3 |
读 |
写 |
读 |
写 |
读 |
写 |
|
0 |
0 |
0 |
禁止 |
Key A |
Key A |
Key B |
Key A |
Key A |
Key B可读 |
0 |
1 |
0 |
禁止 |
禁止 |
Key A |
禁止 |
Key A |
禁止 |
Key B可读 |
1 |
0 |
0 |
禁止 |
Key B |
Key A|B |
禁止 |
禁止 |
Key B |
|
1 |
1 |
0 |
禁止 |
禁止 |
Key A|B |
禁止 |
禁止 |
禁止 |
|
0 |
0 |
1 |
禁止 |
Key A |
Key A |
Key A |
Key A |
Key A |
Key B可读 传输配置状态 |
0 |
1 |
1 |
禁止 |
Key B |
Key A|B |
Key B |
禁止 |
Key B |
|
1 |
0 |
1 |
禁止 |
禁止 |
Key A|B |
Key B |
禁止 |
禁止 |
|
1 |
1 |
1 |
禁止 |
禁止 |
Key A|B |
禁止 |
禁止 |
禁止 |
|
访问控制位 |
所控制的访问操作 |
用途 |
|||||
C1 |
C2 |
C3 |
读 |
写 |
加值 |
减值 转存 恢复 |
|
0 |
0 |
0 |
key A|B1 |
key A|B1 |
key A|B1 |
key A|B1 |
传输配置状态 |
0 |
1 |
0 |
key A|B1 |
key B1 |
禁止 |
禁止 |
读写块 |
1 |
0 |
0 |
key A|B1 |
key B1 |
禁止 |
禁止 |
读写块 |
1 |
1 |
0 |
key A|B1 |
key B1 |
key B1 |
key A|B1 |
数值块 |
0 |
0 |
1 |
key A|B1 |
禁止 |
禁止 |
key A|B1 |
数值块 |
0 |
1 |
1 |
key B1 |
key B1 |
禁止 |
禁止 |
读写块 |
1 |
0 |
1 |
key B1 |
禁止 |
禁止 |
禁止 |
读写块 |
1 |
1 |
1 |
禁止 |
禁止 |
禁止 |
禁止 |
读写块 |
注:在传输配置状态下,必须用key A认证。
如果相应扇区尾块Key B可读,则不得用作认证。如果读写器试图用灰色行的访问控制条件以Key B认证任何扇区的任何块,卡将在认证后拒绝所有后续存储器访问。
读写器呼叫磁场内的卡片,卡片对呼叫做出应答。对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26);对于已进行过读写操作并进入休眠状态的卡片,卡唤醒(WAKE-UP,0x52)。其中卡请求(REQA)只能呼叫处于休闲(Idle)状态的卡片,卡唤醒(WAKE-UP)可以呼叫所有卡片,包括处于休眠(Halt)和休闲状态的卡片。
收到卡呼叫命令后,卡片将对命令做出应答(AnswerTo Request,ATQA), 读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。ATQA有两个字节,第一个字节的值没有规定(RFU),第二个字节的高两位b7b6表示卡序列号长度 (“00”为4字节,“01”为7字节,“10”为10字节), b5位的值没有规定(RFU),b4-b0表示是否遵守面向比特的防冲突机制,如果遵守,b4-b0必须有且仅有1位为1。通常情况下,Mifare S50的ATQA是0004H,Mifare S70的ATQA是0002H。
当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。该过程返回一个被选中的卡的序列号。序列号Serial Number存储在卡片的Block 0中,共有5个字节,实际有用的为4个字节,另一个字节为序列号Serial Number的校验字节,。智能的反冲突功能允许同一工作区域中有不止一张卡同时工作反冲突算法每次只选择一张卡确保对被选中的卡正确执行操作而且同一区域中的其他卡不会破坏数据。
选择被选中的卡的序列号,并同时返回卡的容量代码。选择被选中卡的序列号,并同时返回卡的容量代码Tag Size(前"08",代表容量返回值,现已改"88",无特殊意义)。RWD使用选择卡命令选中其中一张卡进行确认和存储器相关操作卡返回Answer To Select ATS码=08h, RWD通过ATS可以确定被选中的卡的类型。
Mifare系列产品不仅卡片要认证读写器的身份,读写器也要认证卡片的身份,这种认证称为相互认证。常见的认证方法是使用密码或者叫口令。口令一旦被听到,就会泄露。而密码没有规律性,而且可通过随机数加密,所以相互认证是利用随机数加密验证的。Mifare系列所采用的相互认证机制被称为“三次相互认证”,如下图所示。
a) 读写器指定要访问的区,并选择密钥A或B。
b) 卡从位块读区密钥和访问条件。然后,卡向读写器发送随机数B。(第一轮)
c) 读写器利用密钥和随机数计算回应值。回应值A连同读写器的随机数B,发送给卡(第二轮)。
d) 卡通过与自己的随机数比较,验证读写器的回应值A,再计算回应值并发送(第三轮)。
e) 读写器通过比较,验证卡的回应值。
在第一个随机数传送之后,卡与读写器之间的通讯都是加密的。认证的过程中多次提到“事先约定的算法”,到底是什么样的算法呢。这个没有具体规定,但有一个要求是必须的,就是这个算法一定要有密码和随机数的参与。认证过程中的任何一环出现差错,整个认证将告失败。必须从新开始。
三次相互认证后可执行下列操作:
· 读(Read):读数据块
· 写(Write):写数据块
· 减值(Decrement):减少数据块内的数值,并将结果保存在临时内部数据寄存器中。
· 加值(Increment):增加数据块内的数值,并将结果保存在数据寄存器中。
· 转存(Restore):将临时内部数据寄存器的内容写入数值块。
· 暂停(Halt ):将卡置于暂停上作状态
飞利浦的MIFARE卡由于它的高安全性在市场上得到广泛应用,比如我们乘车用的公交卡,学校和企业食堂的饭卡等等.它每个扇区有独立的密匙(6个字节的密码),在通信过程中首先要验证密匙才能读写数据.它的关键技术在于密匙的验证采用三重加密的DES算法,(即:读写器与卡之间传送的密匙是通过随机数加密的),不象早期的EMID卡和atmel的T557卡都是明码传输,所以在开始一度认为是最安全的卡,被广泛的当做电子钱包使用.
自从08年有人成功破解了M1卡,曾一度造成恐慌.2008年,互联网上公布了破解Mifare Classic IC芯片(即M1芯片)密码的方法;德国研究员亨里克·普洛茨(HenrykPlotz)和弗吉尼亚大学计算机科学在读博士卡尔斯滕·诺尔(KarstenNoh1)成功地破解了恩智浦半导体的Mirare经典芯片的安全算法;德国Virginia大学和荷兰Radboud大学两个独立研究小组分别证实了Mi-fare芯片的易受攻击性,并发表了破解芯片加密算法的论文<<“Wirelessly Pickpocketing a Mifare Classic Card”(无线窃取M1卡)>>以及演示了实际操作芯片的破解过程。阐明了M1卡在报文产生奇偶位和所谓嵌套认证两个方面的漏洞;利用此漏洞,攻击者可以通过工具仅仅研究该工具与M1卡之间通讯数据便可以成功破解该卡的所有密钥,从而克隆这张卡.
文章认为:M1在产生奇偶校验位时将数据链路层和安全通信层本该分层处理的协议混为一谈,先校验后加密,并且重复使用了加密校验位的密码。这是不符合安全原则的并确实可被利用。
1) 暴力破解
即使是暴力破解,也需要先得到确切的明文和对应的码流。这大约要进行1536次认证过程,用时在一秒钟之内。不过还要进行离线暴力破解,估计在36分钟可完成。但是需要专用的硬件设备。
2) 以读卡器的挑战值做变量
这里说的读卡器实际上指的是用来模拟读卡器的攻击工具,下个攻击亦如此。这种攻击又可称选择密文攻击,想法用工具控制被攻击的卡每次在认证时产生同一挑战值,而读卡端则回应不同值。这种攻击需要大约28500次的认证过程,用时约15分钟,然后计算密钥,用时约一分钟。
3) 卡的挑战值做变量
这种攻击与攻击2类似,但需要使自己的工具的挑战值为常数,而令卡的挑战值数不断变化。需要预制一个384 GB的状态表。要进行4096次认证。大约用时2分钟。
4) 嵌套认证攻击
这种攻击假设攻击者已知了至少一个扇区的密钥,他可以根据漏洞得到其它密钥的32位,然后对其它16位进行穷举攻击。只需3次认证(时间可以忽略不计)。离线攻击计算时间约为一秒。M1卡嵌套认证的漏洞使得攻击者在得知一个扇区的密钥后可较容易的再破解其它任何扇区的密钥从而做到对该卡的全面破解。这在以前的攻击中并不容易做到,因为一个应用系统的读卡器不一定能产生其系统中所有卡的所有扇区的密钥,如果设计系统时就没有考虑使用所有扇区的话。
现有国内公交卡普遍采用的基于PSAM/ISAM卡的密钥管理系统。通常采用的做法是使用一个Value Block作为钱包,KeyA负责消费,KeyB负责充值(包括消费)。KeyA的分散密钥放在PSAM中,KeyB的分散密钥放在ISAM中(如果采用充值联机则KeyB可联机获得)。PSAM和ISAM提供了密钥的外部存储方式,通过特定的分散算法得出M1的密钥,计算过程发生在终端或后台系统中。
而目前破解机制直接对M1卡发生作用,完全绕过、无视了PSAM等安全机制。同样,一卡一密通过采用不同卡片不同密钥的做法增加破解难度,但面对高效率的破解算法也形同虚设。必须重视的是,现有公交卡系统高度依赖密钥管理系统、一卡一密等安全机制,采用的数据结构基本是统一的、公开的状态,这就意味着一旦破解密钥就几乎处于不设防状态,即使数据结构不公开也不能寄予希望。
公交卡系统虽然也采用了黑名单等系统审计监控机制,但与银行卡系统的黑名单机制存在非常大的区别:公交卡采用脱机黑名单,容量受到终端设备的限制,而且属于滞后处理(通常生效和处理周期不小于T+1天);银行卡采用联机黑名单,容量基本不受限制,而且属于实时处理(即时生效和处理)。
MIFARE卡被破解问题的严重性是不容置疑的,首先,Crypto1攻击的源代码已经公开发布(http://code.google.com/p/crapto1/),属于开源项目,可任意从网上免费下载;其次,配套的几款读卡器(ProxMark,OPENPCD)也可公开从网上订购;再加上攻击算法效率的提高,实际上恶意用户破解M1密钥的成本(还包括时间成本)已经降到了非常低的水平,已经达到大规模扩散所需要的条件。
公交卡系统将面临的攻击方式包括以下两种:
1)克隆:恶意用户通过破解现有合法卡的密钥并读取全部数据后,复制到多张空白IC卡上。
2)篡改:恶意用户通过破解现有合法卡的密钥后,直接篡改该卡的钱包余额等关键数据。
从攻击效果来看,克隆能够在一张合法卡的基础上制作多张伪卡,而篡改只能在合法卡本身的基础上制作伪卡。
由于现有M1卡采用了全球唯一的、不可篡改的uid物理卡号,而公交卡系统的密钥基本使用物理卡号进行分散计算获得,如果要实施克隆攻击,必须具备复制uid的能力,即具备M1卡的生产制造能力。而目前能够生产兼容M1卡的是非常有限的几个厂家,基本不可能自己做出非法克隆的事情,也不可能应恶意用户的要求进行订单生产。虽然通过硬件配合软件能够成功模拟M1卡并且能够与读卡器进行正常通讯,但离产品化还有较大距离。
有种观点认为,只要是采用了一卡一密、实时在线系统,或非接触逻辑加密卡的ID号,就能避免密钥被解密。其实,非接触逻辑加密卡被解密就意味着M1卡可以被复制,使用在线系统尽管可以避免被非法充值,但是不能保证非法消费,即复制一张一样ID号的M1卡,就可以进行非法消费。现在的技术使用FPGA就可以完全复制。基于这个原理,Mifare的门禁卡也是不安全的。
其实最重要的是,安全是一个系统级别的概念,安全的系统是有一系列的安全措施来保证的,比如密钥多级分散、比如用PSAM卡而不是终端自身软件计算密钥、比如卡片内保存密文而不是明文等等一系列的措施来增加最终破解的难度,并保证被破解后的损失降低到最低。安全不是只靠单一的卡片来保证的。另外大家可以注意的是,最终破解卡片的其实都不是软件暴力破解的,而是剖片等硬件手段起到了至关重要的作用,这其实是对半导体厂商提出了更高的要求,如何让逆向工程的难度更大。所以不是说CPU卡就一定比M1卡安全,如果芯片自身的安全级别不够,通过剖片、甚至简单的黑客手段都能容易的获知卡片的密码,那么是不是CPU卡其实都毫无意义,而且CPU卡用的公开算法只会让其安全性比M1还不如(算法破解都免了)。这就是为什么半导体厂商一直很强调自己的芯片过了EAL5+认证,而国产芯片在这部分其实还存在相当的差距。