为有牺牲多壮志,敢教日月换新天。

M1卡区块控制位理论详解

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

理论篇参考了国内外的一些文献,写的比较杂乱,如有错误请指正,有条件的推荐去谷歌一些外文文献了解其原理,如《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时,只需验证密钥A和密钥B其中之一即可进行读取、写入、加值、减值及初始化操作。该初始值主要供制造商和发卡商卡片功能及修复卡片使用,确认所有读写和加密功能均正常(存取控制默认初始值为"FF078069")后,再依据使用需求设置新的存取控制权限值,进行用户数据操作和修改新的用户密码。

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

C1Xn C2Xn C3Xn

读取权限

写入权限

加值

减值及初始化

0 0 0

KeyA和B可用

KeyA和B可用

KeyA和B可用

KeyA和B可用

0 1 0

KeyA和B可用

不可用

不可用

不可用

1 0 0

KeyA和B可用

KeyB可用

不可用

不可用

1 1 0

KeyA和B可用

KeyB可用

KeyB可用

KeyA和B可用

0 0 1

KeyA和B可用

不可用

不可用

KeyA和B可用

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,C3X0,C1X1,C2X1,C3X1,C1X2,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设置为存放卡金额的数据区,此时的存取控制块C1X2、C2X2、C3X2必须设置为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卡的三轮认证是保障M1卡安全的重要手段,读卡器要对M1卡的读写操作就必须通过三轮验证,在该过程中M1卡和读卡器相互发送验证信息来验证密钥,要说明的是该过程也是同样被加密,并且使用了恩智浦公司私有的Crypto-1流密码算法,2008年内梅亨大学的研究人员发现了该算法伪随机数生成的漏洞,使得加解密所用到的伪随机数可被正确预测,从而逆向计算出了三轮认证中的扇区密钥。

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


M1卡控制位计算

以下为控制位的结构,前6位为密钥A,中间4位存取控制,后6位密钥B。

例如 :

A1A2A3A4A5 FF078069 B1B2B3B4B5

密码A.           控制位      密码B

字节0-5 字节6-9 字节10-15

4位控制位中前3位是真实的控制位,第4位是备用控制位,一般用不上,因此我们可以只分析前3位。

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限。1个字节等于8个比特,而一个扇区有4个块,每个块有3个控制位,以下是控制位以比特形式的结构图,_b表示取反存储,这边用红色字体已标出。 

以FF078069默认控制位为例,我们将FF078069的16进制转化为2进制如下:

FF=11 1 1 1 1 1 1;07= 0 0 0 0 0 1 1 1;80=1 0 0 0 0 0 0 0 ;69=忽略

将以上的2进制数填入表格:

将取反的数再次取反以获得原来的控制位:

存取控制中每个块都的三个控制位定义如下,同时填入上表数据:

块0,块1,块2控制位均是000,存取控制权限可对应以下表:

 

块3控制位001,存取控制对应如下表: 

可见块0,块1,块2通过密钥A或者密钥B认证后可读,可写,可进行加值和减值操作。块3密钥A不可读,但可通过认证密钥A或B修改。验证密钥A或者密钥B后,可读可改写存取控制。验证密钥A或者密钥B后,可读可改写B密码。

综上,存取控制FF078069极不安全,我们可以自定义存取控制进行修改,只要利用上述步骤将想要的控制位列出逆向推回去即可。

posted @ 2022-05-10 10:49  为敢技术  阅读(2179)  评论(2编辑  收藏  举报