修改 MIFARE 卡的控制位

-

控制字为4个字节,共32位,扇区中的每个块的存取条件是由密码和控制字共同决定的,在控制字中每个块都有相应的三个控制位.这三个控制位的值各为0或1.我们以控制字7F078869为例子.
注意: 本文所指的控制字, 其实就是各控制位在访问控制列表(Access Control List, ACL)最后组合成的值.
下面是各控制位的位序表:
控制位位序表0
其中字节0-5和字节10-15分别是密码A和密码B.所以中间的字节6-9就是控制字.我们把控制字写在表里方便对照.
7F转二进制为01111111
控制位位序表1
由上面的图我们可以知道:
C10=0
C20=0
C30=0
所以该扇区0块的控制权限是:
控制位权限表0
(控制位里面那个X为你所要计算的块的具体数字,如块0对应X=0;块1对应X=1;块2对应X=2;块3则另有一张表)
所以该控制字的数据块说明是:用密码A或密码B都可以对该块的0扇区进行读,写,加,减等操作.
我们还可以知道该控制字的:
C13=0
C23=1
C33=1
所以该扇区3块的控制权限是:
控制位权限表1
所以该控制字的控制块说明是:
密码A:由密码B来写,不可读;
密码B:由密码B来写,不可读;
控制字:用密码A或B都可读,由密码B写.

以上是读控制字的方法,下面我们来讨论如何按照自己的需求来计算出控制字.

假如我们需要写一张能够让机器读余额又不让它改动余额的卡,这就意味着卡内的数据块不可以修改.
为此我想出了两个方案
方案一是不给 数据块0,1,2 增值/减值的权限.
方案二是不给 数据块0,1,2 写卡的权限.
我们先执行方案一,方案一的权限我们取KeyA或KeyB都可读,KeyB写,其他操作都为不可实现(即Never).
我们来看完整的数据块权限表:
M1卡控制位数据块权限表
所以方案一的控制位取100,意思就是取:
C1X=1
C2X=0
C3X=0
X为0,1,2.
于是我们写上表里,红色字是写上去的,绿色是相应的C1X/C2X/C3X的取反,下面也有注释,_b为取反,取反的我用绿色标出来.注意是对应的C1X/C2X/C3X的取反,如果写错了那么值就不可用.
方案一数据块0
这里我们还没有写控制块的权限,因为我没有改控制块权限的需要,这里就和之前例子的控制块值一样取011好了.我们再把011和对应的取反结果写进表里,再把二进制转为十六进制得下面的表:
方案一数据块1
所以得到控制字为787788,但这里缺了一位,因为控制字的最后一位是预留给以后有需要的时候用的,
所以这里直接沿用例子的69就可以了.所以最终我们得到的控制字是78778869.
我们可以将这个控制字写入某品牌的一张M1类型的水卡里面,再去刷控水器,(视频已删除)在视频中我们看到控水器显示余额再断开连接再寻卡再断开……读和修改M1卡控制字的具体教程就结束了.
最后附上M1卡控制位控制块权限表:
M1卡控制位控制块权限表

参考资料:
百度文库 M1卡修改密码控制位及控制规则
了解更多:
博主Bobylive关于RFID的文章