M1卡区块控制位理论详解

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
iPhone用户欢迎AppStore下载本人开发的NFC应用:iNFC。 https://apps.apple.com/cn/app/infc/id1562054959 iNFC适合小白使用iPhone的NFC功能或专业人士使用iPhone进行NFC调试。

理论篇参考了国内外的一些文献,写的比较杂乱,如有错误请指正,有条件的推荐去谷歌一些外文文献了解其原理,如《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 0 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卡的读写操作就必须通过三轮验证,在该过程中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表示取反存储,这边用红色字体已标出。

M1卡区块控制位理论详解

以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进制数填入表格:

M1卡区块控制位理论详解

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

M1卡区块控制位理论详解

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

M1卡区块控制位理论详解

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

M1卡区块控制位理论详解

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

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

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

Original: https://www.cnblogs.com/strengthen/p/16252551.html
Author: 山青咏芝
Title: M1卡区块控制位理论详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553577/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • TraceId 和 SpanId 生成规则

    TraceId 生成规则 SOFATracer 通过 TraceId 来将一个请求在各个服务器上的调用日志串联起来,TraceId 一般由接收请求经过的第一个服务器产生,产生规则是…

    技术杂谈 2023年5月31日
    092
  • 质量问题不是不爆,时候未到

    没有质量,哪来效率,谈什么成本; 最近大半年,团队以极其曲折的方式,将一个支离破碎的应用从重构的边缘给拉了回来,最终项目回到了正常迭代的节奏中; 年初的时候,运营系统相关人员离职,…

    技术杂谈 2023年7月23日
    066
  • synchronized

    线程锁 1.1synchronized的认识 1.1.1synchronized的介绍 在多线程并发编程中,synchronized关键字是重量级锁的代名词。但是,随着JDK的发展…

    技术杂谈 2023年6月21日
    097
  • 分层架构之DDD分层

    DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的…

    技术杂谈 2023年5月31日
    0114
  • 浅析http状态码301、302、303、307、308区别(转载)

    http的重定向我们经常是张口就来,整个流程也非常简单,服务端HTTP返回码是30x,头里面的Location字段代表新的URL。如下图所示: 但重定向也还是有需要深入探讨地方,返…

    技术杂谈 2023年5月31日
    0129
  • 什么是精准卫星授时?什么是NTP网络时间服务器?

    什么是精准卫星授时?什么是NTP网络时间服务器? 什么是精准卫星授时?什么是NTP网络时间服务器? 京准电子科技官微——ahjzsz 时间同步技术在所有网络应用中都是至关重要的,从…

    技术杂谈 2023年6月21日
    0120
  • spring-boot-导出excel-xlsx 文件损坏

    maven的pom文件处理 ①将resource标签配置如下 src/main/resources true bootstrap.yml **/*.xml **/excelTemp…

    技术杂谈 2023年7月25日
    079
  • centos 快速安装 fish

    cd /etc/yum.repos.d/ wget https://download.opensuse.org/repositories/shells:fish:release:2…

    技术杂谈 2023年5月30日
    086
  • DHCP:IP 并非与生俱来

    初识 DHCP 众所周知,因特网上的每台设备都规定了其全世界唯一的地址,也就是说 “IP 地址”,正是由于有了 IP 地址,才保证了用户在连网的计算机上操作…

    技术杂谈 2023年7月24日
    064
  • @Service注解是标注在实现类上的的接口中添加注解还是在实现类impl

    @Service注解是标注在实现类上的因为@Service是把spring容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以…

    技术杂谈 2023年5月30日
    091
  • 什么是Servlet?

    Servlet 是sun 公司提供的一门用于开发动态web 资源的技术,是Java 语言中编写Web 服务器扩展功能的重要技术,同时它也是JSP 技术的底层运行基础。 Servle…

    技术杂谈 2023年5月31日
    089
  • MySQL数据库-数据表(四)

    where 子句,通常用于在找寻数据的时候做一个条件筛选,得到满足条件的记录行数; 注意:新增( insert)不能做筛选; where 子句中常见的 运算符有如下几种: 比较运算…

    技术杂谈 2023年6月21日
    096
  • 各种锁

    只作一个浅显的解释作为区分,具体深入还请搜索相关博客。 可重入锁(又叫递归锁) synchronized(隐式&a…

    技术杂谈 2023年7月25日
    093
  • 什么是拦截器?拦截器如何配置?

    今天这篇文章来介绍一下拦截器在SpringBoot中的如何自定义及如何配置的,拦截器的具体作用和应用场景。 SpringBoot版本 本文基于的Spring Boot的版本是2.6…

    技术杂谈 2023年6月21日
    087
  • 没有苦劳,只有功劳!

    很多人常常发出这样的感慨:”我在公司这么多年了,没有功劳也有苦劳啊!怎么这么久还没有被提拔,薪水没有得到提升呢?” 古罗马皇帝拿破仑曾经碰到过这样一个事情。…

    技术杂谈 2023年5月31日
    091
  • 数据大屏,仅仅是数据展示吗?

    数据大屏,仅仅是数据展示吗? 大数据时代,各行各业对数据价值的重视程度与日俱增。要想真正把数据的价值发挥出来,就需要对数据进行采集、加工、分析,最终以数据可视化的方式来展现数据分布…

    技术杂谈 2023年5月31日
    0114
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球