mob64ca14089531 2024-06-13 18:27:50
文章标签m1 门禁卡数据分析linux物联网iot单片机文章分类数据分析人工智能
目前市面上最常见的IC卡,如校园卡,水卡,门禁卡,会员卡等,绝大部分的卡片类型均属于Mifare1 S50卡,以下统称为M1卡。
M1卡内部基本数据结构
- 卡片内部分为16个扇区(编号0~15),每个扇区分为4个数据块(编号0~3),每个数据块的数据长度是16个字节
- 每个扇区中数据块0~数据块2,用户可进行数据的读取和写入,加值、减值、值转移、值恢复等操作
- 注意:其中扇区0中的数据块0用于存放卡片的卡号数据和厂商代码;只可读取,不能写入
- 每个扇区中数据块3,存放访问扇区的密钥数据和控制访问权限的字节(统称控制字节)
扇区0 |
数据块0 |
存放卡片的卡号数据和厂商代码 只可读取,不能写入 |
数据块1 |
用户可自行读取或写入数据到数据块 |
|
数据块2 |
||
数据块3 |
存放访问扇区的密钥数据和控制访问权限的字节 |
|
. . . . . . |
||
扇区15 |
数据块0 |
用户可自行读取或写入数据到数据块 |
数据块1 |
||
数据块2 |
||
数据块3 |
存放访问扇区的密钥数据和控制访问权限的字节 |
本文着重介绍每个扇区中的数据块3;既存放密钥数据和控制权限字节的部分,数据块3结构如下:
A密钥 |
控制字节 |
B密钥 |
6个字节 |
4个字节 |
6个字节 |
Mifare1S50卡 出厂默认每个扇区的数据块3中的数据都是:
FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
其中:
FF FF FF FF FF FF 为A密钥
FF 07 80 69 为控制字节
FF FF FF FF FF FF为B密钥
控制字节FF 07 80 69所表示的控制权限含义:可用广州慧斯佳智能科技有限公司开发的M1S50卡控制字节工具进行解析得到
控制字节工具的使用和下载说明
- 下载链接:
控制字节工具主要分为2个功能:
1.填入已知的控制字节,进行解析;得到所表示的控制权限
2.选择所需要的控制权限,生成对应的控制字节
解析控制字节
- 在红框中输入FF 07 80 69;点击解析控制字节按键;得到对应控制权限解析说明
生成控制字节
- 选择所需要设置的权限,点击生成控制字节按键;红框中输出选择的权限的控制字节
常见控制字节组合
控制字节的组合方式虽然多,但实际用得比较多的主要是以下4种:
FF 07 80 69
这种字节组合方式是最常见的;只要A密钥或者B密钥验证通过,便可以读写数据块数据,修改A、B密钥,修改控制字节
优点在于:控制字节直接出厂默认,无需重新设置。读写数据,修改密钥都比较方便。缺点在于:安全性能差,数据和密钥容易泄露和被修改
7F 07 88 69
这种字节组合方式是:只要A密钥或者B密钥验证通过,便可以读写数据块数据,修改A、B密钥,控制字节都需要B密钥验证通过才可以
优点在于:密钥B权限最高,只要知道密钥B,就可以对A密钥和控制字节进行改写。应用上一般是由最高管理员掌握密钥B,配置多个密钥A给到对应的管理员。缺点在于:密钥B很重要,一旦忘记,卡就不能再改写密钥
08 77 8F 69
这种字节组合:由密钥A读密钥B来写,可以说是上面一种组合的变体,对于密钥B有更强的保护
FF 00 F0 69
这种字节组合:数据块不具有写入权限;只能读取。最常见用于门禁机发卡;在发卡阶段写入合法的身份识别数据之后;卡片的数据便再也不能修改
已知控制字节·解析权限过程详述
以最常见的 FF 07 80 69 字节组合为例
字节6 |
字节7 |
字节8 |
字节9 |
0xFF |
0x07 |
0x80 |
0x69 |
其中字节9目前是作为保留字节,一般固定为0x69;主要是看字节6,7,8这3个字节
步骤1:将字节6,7,8转换成对应的二进制格式,如下表
16进制格式 |
转换 |
2进制格式 |
|
字节6 |
0xFF |
——》 |
1111 1111 |
字节7 |
0x07 |
——》 |
0000 0111 |
字节8 |
0x80 |
——》 |
1000 0000 |
步骤2:对字节6,7,8进行相应的处理
字节6处理操作:8位2进制数进行按位取反
字节6 |
16进制格式 |
转换 |
2进制格式 |
8位2进制数进行 按位取反 |
处理结果 |
0xFF |
——》 |
1111 1111 |
——》 |
0000 0000 |
字节7处理操作:高4位2进制数保留;低4位2进制数取反
字节7 |
16进制格式 |
转换 |
2进制格式 |
高4位2进制数保留 低4位2进制数按位取反 |
处理结果 |
0x07 |
——》 |
0000 0111 |
——》 |
0000 1000 |
字节8处理操作:8位2进制数不做任何处理,直接保留
字节8 |
16进制格式 |
转换 |
2进制格式 |
8位2进制数不做任何处理 |
处理结果 |
0x80 |
——》 |
1000 0000 |
——》 |
1000 0000 |
步骤3:将处理后的字节6,7,8的8位2进制数组成1张表格;如下表
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
|
权限增值表中的 符号 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
字节6 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
权限增值表中的 符号 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
字节7 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
权限增值表中的 符号 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
字节8 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
其中:
C10C20C30组合:表示扇区中数据块0的权限;具体权限需要对应下图的数据块权限真值表
C11C21C31组合:表示扇区中数据块1的权限;具体权限需要对应下图的数据块权限真值表
C12C22C32组合:表示扇区中数据块2的权限;具体权限需要对应下图的数据块权限真值表
C13C23C33组合:表示扇区中密钥数据块(即数据块3)的权限;具体权限需要对应下图的密钥块权限真值表
组合C10C20C30,C11C21C31,C12C22C32的值均为 0 0 0,对应到数据块控制权限真值表中权限为:读:A|B 写:A|B 增值:A|B 减值、转移值、恢复值:A|B
组合C13C23C33的值为 0 0 1,对应到密钥块控制权限真值表中权限为:
AKey:读:Never 写:A|B
控制字节:读:A|B 写:A|B
BKey:读:A|B 写:A|B
综上:FF 07 80 69
数据块权限为:读:A|B 写:A|B 增值:A|B 减值、转移值、恢复值:A|B
密钥块权限为:AKey:读:Never 写:A|B
控制字节:读:A|B 写:A|B
BKey:读:A|B 写:A|B
所以控制字节FF 07 80 69的控制权限是:
只要A密钥或者B密钥验证通过,便可以读写数据块0,1,2;还可以对数据块0,1,2进行增值,减值, 转移值,恢复值等操作
只要A密钥或者B密钥验证通过,便可以写入A密钥;读写控制字节,读写B密钥;但无论任何条件下,都无法读取A密钥
根据所需要权限·生成对应控制字节
假设~~~现在对扇区中数据块0,1,2,密钥块的控制权限分别是以下需求:
1.数据块0:只有B密钥验证通过;才可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作
2.数据块1:只要A密钥或者B密钥验证通过,就可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作
3.数据块2:只有B密钥验证通过;才可以读取数据;但无论任何条件下,都不可以写入数据;不可以进行增值,减值, 转移值,恢复值等操作
4.密钥块:只要A密钥或者B密钥验证通过,就可以读取控制字节,但无论任何条件下,控制字节都不能被修改;只有B密钥验证通过;才可以修改A密钥和B密钥;但无论任何条件下,都不能读取A密钥和B密钥
结合上述需求分析:
数据块0权限值C10C20C30 和 数据块2权限值C12C22C32 均为下表红框中的值,既是C10C20C30 = 1 0 1;C12C22C32 = 1 0 1
数据块1权限值C11C21C301为下表黄框中的值,既是C11C21C31 = 0 1 0
密钥块权限值C13C23C33为下表中绿框中的值,既是C13C23C33 = 1 0 0
步骤1:将分析需求得到的C10C20C30 = 1 0 1;C11C21C31 = 0 1 0;C12C22C32 = 1 0 1;C13C23C33 = 1 0 0;填入下表
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
|
权限增值表中的 符号 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
权限增值表中的 符号 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
1 |
1 |
0 |
1 |
|||||
权限增值表中的 符号 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
步骤2:根据已经填入的值,对表格进行补全处理
补全处理:_b表示取反;例如C30_b表示是C30的取反值
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
|
权限增值表中的 符号 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
|
权限增值表中的 符号 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
|
权限增值表中的 符号 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
步骤3:分别对3组8位2进制数进行格式转换
将8位2进制数C23_bC22_bC21_bC20_bC13_bC12_bC11_bC10_b转换成16进制格式:得到字节6
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
C23_b |
C22_b |
C21_b |
C20_b |
C13_b |
C12_b |
C11_b |
C10_b |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
将8位2进制数 转换 成16进制格式;得到字节6 |
|||||||
0xD2 |
将8位2进制数C13C12C11C10C33_bC32_bC31_bC30_b转换成16进制格式:得到字节7
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
C13 |
C12 |
C11 |
C10 |
C33_b |
C32_b |
C31_b |
C30_b |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
将8位2进制数 转换 成16进制格式;得到字节7 |
|||||||
0xDA |
将8位2进制数C33C32C31C30C23C22C21C20转换成16进制格式:得到字节8
bit-7 |
bit-6 |
bit-5 |
bit-4 |
bit-3 |
bit-2 |
bit-1 |
bit-0 |
C33 |
C32 |
C31 |
C30 |
C23 |
C22 |
C21 |
C20 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
将8位2进制数 转换 成16进制格式;得到字节8 |
|||||||
0x52 |
结合上述3个表格得到:字节6:0xD2;字节7:0xDA;字节8:0x52;字节9一般固定为0x69
所以根据需求最终生成的控制字节是:D2 DA 52 69
(一),以常用设置"08 77 8F 69"控制条件为例,先搞清楚它――具有的访问权限。
1、对"08 77 8F 69"值进行计算,该值定位于各区块3的6,7,8,9四个字节内,字节6=08,字节7=77, 字节8=8F, 字节9=69(默认值,不予计算)。
2、例如:字节6=08,对应其二进制值=00001000, 则对6,7,8这三个字节进行二进制转换结果见下表:
字节6 = 0 0 0 0 1 0 0 0
字节7 = 0 1 1 1 0 1 1 1
字节8 = 1 0 0 0 1 1 1 1
3、参照表2及表4算法,字节6的全部二进制值取反,字节7的低四位二进制值取反,字节8不变,得到:
字节号
对应二进制值
位置
高4位
位置
低4位
字节6
字节7
字节8
0 0 0 0 1 0 0 0
0 1 1 1 0 1 1 1
1 0 0 0 1 1 1 1
C2Y
C1Y
C3Y
1 1 1 1
0 1 1 1
1 0 0 0
C1Y
C3Y
C2Y
0 1 1 1
1 0 0 0
1 1 1 1
所 属 块 位
块3 块2 块1 块0
块3 块2 块1 块0
4、对以上6,7,8字节的存取/控制二进制已取反值,依照表2,表4块位转换为各块控制值,如下表:
块3位
字节7,字节6,字节8 = C13,C23,C33 = C1Y,C2Y,C3Y = 0 1 1
块2位
块1位
块0位
字节7,字节6,字节8 = C12,C22,C32 = C1Y,C2Y,C3Y = 1 1 0
字节7,字节6,字节8 = C11,C21,C31 = C1Y,C2Y,C3Y = 1 1 0
字节7,字节6,字节8 = C10,C20,C30 = C1Y,C2Y,C3Y = 1 1 0
注意: 高4位的各块值=低4位的各块值时,其值可用。高4位值≠低4位值时,其值不可用!
5、查对访问权限(数据存取控制依照表3,块3存取控制依照表5),该例"08 77 8F 69"的访问权限为:
◆ 块3 = 011:权限为:KeyA,KeyB均不可读,验证KeyB正确后可改写KeyA和KeyB,验证KeyA或KeyB正确后可读"控制位"。在此可见密钥KeyB的重要性,KeyB不正确是无法看到块3控制值,更无法修改密钥。
◆ 块2 = 块1 = 块0 = 110:权限为:验证KeyA或KeyB后可读该块数据,减值以及初始化值,只有验证KeyB 正确后才可改写该块数据,在此可以看到密钥KeyB对改写数据块也起着关键性作用。
(二)、"08 77 8F 69" 控制条件设置步骤:
由(一)可知:KeyB设置后为不可读,并且改写数据和改写控制位都需要正确验证它,故KeyB设置后程序
操作员必须妥善保管KeyB值,否则以后改写数据和控制位时,不正确的KeyB值将无法实现卡的任何操作!!!
1、修改块3控制位的值:最初的各区块3内的KeyA,KeyB都是厂商12个"F"默认值(KeyA在任何条件下均为不可读,大部分读写机程序表现KeyA为未知的12个"0" ),在修改控制值时,先不要修改默认密码KeyA和KeyB,在控制位修改成功后,再去更改新密码值。即先对块3的控制位进行修改(默认值FF 07 80 69改为新值08 77 8F 69)并执行写操作。控制位写成功后,KeyB亦为12个"0"不可读了,但仍是隐藏的12个"f"默认值。
2、修改块3的KeyA和KeyB值:控制位08 77 8F 69值写成功后,验证KeyB正确后方可改写KeyA和KeyB新密码。在密码操作模式键入要改写区块之先前密码B(先前密码为默认值时,则不需改动和加载),加载后反回数据操作模式,再进行读值,KeyA和KeyB值的改写。
3、修改块0~块2中数据:由新的控制条件08778F69可知,要修改数据,必须先验证KeyB,故先设置密码操作为KeyB认证方式,加载后再返回数据操作模式,对要修改的数据块进行值的改写操作。
4、上例中分析了"08 77 8F 69"的访问条件及其改写步骤,对用户的其它控制条件亦可参照应用。
-----------------------------------
M1卡修改各区块控制位值和数据
https://blog.51cto.com/u_15077536/4037468
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/103655.html