一卡通(M1卡)破解过程记录——理论篇

前些日子在研究学校的一卡通安全,在此记录一下一卡通破解的全过程,仅用作学习交流,切勿用于违法用途

 其他几篇: 一卡通(M1卡)破解过程记录——准备篇              获取扇区密钥            数据分析篇

理论篇参考了国内外的一些文献,写的比较杂乱,如有错误请指正,有条件的推荐去谷歌一些外文文献了解其原理,如《Attack.MIFARE》、《Dismantling_MIFARE_Classic》、《Pickpocketing.Mifare》、《The-MIFARE-Hack-1》和《A Practical Attack on the MIFARE Classic》等。

M1卡扇区密钥及控制属性

M1卡的块3数据直接决定了M1卡的访问权限,在使用M1卡之前我们需要设定好合适的控制块,从而使M1卡可以在一个RFID系统下的多台读卡器上正常工作。在M1卡设计之初为了保障其兼容性,恩智浦公司对控制块的设置有着统一的规范,而在M1卡发卡后RFID系统管理者根据实际需要设定每个扇区各自的密码及存取控制字节在后续的对一卡通的攻击过程中,我们需要使用正确的控制属性来修改数据并确保其能在其他读卡器上被正常识别。

大部分情况下我们只需要知道每个扇区的块3(即第4块)掌握整个扇区的控制权限,想要对扇区操作需先获取块3内容,对块3内容操作务必要小心,如果错误操作了控制块就会导致卡被锁死。如果使用的是PHILIPS原始芯片的卡片,且控制字 = FF078069时,通过某台读卡器进行B密钥验证后可读写卡片,说明这台读卡器有BUG。最大的可能性是这个读卡器并不区分AB密钥。
我们可以做个简单的实验,将AB密钥设为不同的值,例如先将密钥BLOCK改写为如下:111111111111FF078069222222222222此时KeyA = 111111111111, KeyB =  222222222222然后用可以通过B密钥读写的读卡器进行操作,就会发现问题所在。

                    FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
                                 密钥A             存取控制           密钥B  

块3存取控制字节中共有三个控制位对应不同数据块或控制块的读写条件,定义为:"CmXn",其中Cm代表每块控制位号(C1~C3),X代表某块所属扇区号(0~15), n代表该扇区内某块号。例如C173 表示7扇区内块3的第1控制位,其他扇区和块的控制位表示法以此类推。

  控制位表示方法

存储块

控制位1

控制位2

控制位3

存储块属性

块0

C1X0

C2X0

C3X0

用户数据块,(0区0块除外)

块1

C1X1

C2X1

C3X1

用户数据块

块2

C1X2

C2X2

C3X2

用户数据块

块3

C1X3

C2X3

C3X3

密钥存取控制块

各扇区数据块0~块2的三个控制位以正反两种形式存在于块3的存取控制字节中,它决定该块的访问权限(例如进行减值及初始化值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制位在存取控制字节(6~9字节)中的对应位置表所示,其中“_b”表示按位取反。  

  控制位在控制字节的对应位置

位号

字节号

7

6

5

4

3

2

1

0

所属

块3

控制位

块2

控制位

块1

控制位

块0

控制位

块3

控制位

块2

控制位

块1

控制位

块0

控制位

字节6

C2x3_b

C2x2_b

C2X1_b

C2X0_b

C1x3_b

C1x2_b

C1X1_b

C1X0_b

字节7

C1x3

C1X2

C1x1

C1X0

C3x3_b

C3x2_b

C3x1_b

C3X0_b

字节8

C3X3

C3X2

C3X1

C3X0

C2x3

C2x2

C2x1

C2X0

字节9

BX7

BX6

BX5

BX4

BX3

BX2

BX1

BX0

 

针对M1卡不同权限的控制位如表所示,其中M1卡的制造初始值为000;字节9为备字节,默认值为69例如,某区块的3个存取控制位C1Xn,C2Xn,C3Xn设置为000时,只需验证密AB其中之一即进行取、写入加值减值及初始化操作。该初始值主要供制造商和发卡商卡片功能及修复卡片使用,确认所有读写加密功能均正常(存取控制默认初始值为"FF078069")后,再依据使用需设置新的存取控制权限值,进行用户数据操作和修改新的用户密码

  块0、块1、块2的存取控制权限

C1Xn C2Xn C3Xn

取权限

入权限

加值

减值初始化

0 0 0

KeyAB可用

KeyAB可用

KeyAB可用

KeyAB可用

0 1 0

KeyAB可用

不可用

不可用

不可用

1 0 0

KeyAB可用

KeyB可用

不可用

不可用

1 0 0

KeyAB可用

KeyB可用

KeyB可用

KeyAB可用

0 0 1

KeyAB可用

不可用

不可用

KeyAB可用

0 1 1

KeyB可用

KeyB可用

不可用

不可用

1 0 1

KeyB可用

不可用

不可用

不可用

1 1 1

不可用

不可用

不可用

不可用

再如当某区块0的存取控制位C1X0,C2X0,C3X0设置100时,验证密码A或密码B正确后可读出其数据;只有验证密码B正确后才可允许改写数据;不能进行加值,减值等操作

以厂商初始值"FF 07 80 69"为例,说明存取控制条件对数据块的影响。对控制字节取厂商默认值C1X0,C2X0,C3X0C1X1,C2X1,C3X1C1X2,C2X2,C3X2设置为000;C1X1,C2X2,C3X3设置为001密钥A,密钥B默认值由厂商提供,通常为FFFFFFFFFFFF

  厂商初始存取控制值

位号

字节号

7

6

5

4

3

2

1

0

字节6

1

1

1

1

1

1

1

1

字节7

0

0

0

0

0

1

1

1

字节8

1

0

0

0

0

0

0

0

控制位

CmX3

CmX2

CmX1

CmX0

CmX3

CmX2

CmX1

CmX0

 

对于存取控制值的设置一定要合理,不能为了确保智能卡的保密性需求一味地锁死权限,这样将会丧失智能卡的可用性。例如发卡商将X扇区块2设置为存放卡金额的数据区,此时的存取控制C1X2C2X2C3X2必须设置为000这样用户才能通过校验密钥 A或密钥 B后2的内容,否则,M1读卡机会因校验区密码出错而无法读取和传送数据刷卡时也就不能获取和变更卡的金额了以此类推,发卡商可以根据用户需要的不同合理分配存取控制值从而限制用户的操作权限对于不联网的RFID系统,M1卡数据如果出现异常无法校验通过,读卡器可以通过修改存取控制块的方式将该卡拉黑。同样的,当块3的存取控制位110或者111时,只有验证密钥A或密钥B正确可读取存储控制位的内容,其它如存取控制值的改写,密钥A密码B的读写权限均被锁死而无法访问此时发卡商同时将块0、块1、块2也分配好权限,设置复杂的密钥A和密钥B,即可最大程度的确保该扇区数据的安全性。

 M1卡的认证流程

在前文中简述了M1卡与读卡器的通信过程,下面将详细介绍M1卡如何与读卡器建立认证并实现基本功能。读卡器首先发送电磁波,呼叫感应范围内的标签,标签将自身的UID号按位传送给读卡器,如果感应范围内有多张标签就会产生冲突,此时读卡器可指定冲突位为0(或1,可自由设定)的标签优先激活,然后进行三轮认证,根据读卡器需求数据的扇区位置对指定扇区认证,不通过会读卡出错,通过认证后可依据控制属性对扇区数据操作并转存,若读卡器还需要使用其他的扇区则切换扇区循环操作,直到所需扇区操作完毕后发送指令使卡进入休眠状态,开始呼叫下一张标签。

                        一卡通(M1卡)破解过程记录——理论篇_第1张图片

 

M1卡的三轮认证是保障M1卡安全的重要手段,读卡器要对M1卡的读写操作就必须通过三轮验证,在该过程中M1卡和读卡器相互发送验证信息来验证密钥,要说明的是该过程也是同样被加密,并且使用了恩智浦公司私有的Crypto-1流密码算法,2008年内梅亨大学的研究人员发现了该算法伪随机数生成的漏洞,使得加解密所用到的伪随机数可被正确预测,从而逆向计算出了三轮认证中的扇区密钥。

M1卡与读卡器的三轮认证流程如图所示,读卡器首先向标签发送身份验证请求,标签响应后生成一个4字节随机数Nt并以明文的方式发送给读卡器,读卡器接收Nt后生成的随机数Nr,并将两个随机数一起加密为8个字节的数据回复给标签。标签解密后将得到Nt和Nr,如果读卡器使用了错误的算法,认证将被中断读卡出错,若解密得到的Nt与原来发送的一致,则将读卡器生成的随机数Nr的用自己的算法加密并回复给读卡器,以证明自己为合法标签,读卡器收到后解密如果得到Nr为原来发送的Nr,则三轮认证通过,读卡器开始发送命令给标签,标签响应后执行。

                   一卡通(M1卡)破解过程记录——理论篇_第2张图片

 

 

你可能感兴趣的:(信息安全)