对于M1卡密钥控制字设置的总结

前段时间学习M1卡操作,对于密钥控制字专门研究了一番,这里做下总结,免得以后忘记。
M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,前3个块是数据区,第4块是密钥区。每个块都能存储16个字节的数据,密钥区的16个字节数据是有特殊含义的:
6个字节的密码A + 4个字节密钥控制位 + 6个字节的密码B
其中密钥控制位决定这个扇区的读写规则,对于M1卡密钥控制位及控制规则的说明,这篇文章里面讲述得很清楚了:
https://wenku.baidu.com/view/76afde36312b3169a451a4e6.html
这里只是给没有耐心看文章朋友提炼一下,控制字的组合方式虽然多,但实际用得比较多的方案自认为无外乎四种:

  1. 默认方式 控制位为“FF 07 80 69”
    这种方式下密钥A或密钥B都可以读写数据区,密钥A可写密钥区,优点是密钥控制字无需重新计算,读写方便,缺点是安全性能差,密钥A容易泄露。

  2. 密钥B写方式 控制位为“7F 07 88 69”
    这种方式下密钥A或密钥B都可以读写数据区,而对于密钥区只能由密钥B来写。优点是密钥B权限最高,只要知道密钥B,无论密钥A写成什么都可以改写,由最高管理员掌握密钥B,可下发多种密钥A的一般管理员,一般不会废卡的。缺点是密钥B很重要,一旦忘记,卡就不能再改写密钥了。

  3. A读B写方式 控制位为“08 77 8F 69”
    这种方式下由密钥A读密钥B来写,可以说是上面一种方式的变体,对于密钥B有更强的保护。

  4. 只读不写方式 控制位为“FF 00 F0 69”
    这种方式下密钥A或密钥B都可以读数据区,但都不能写数据区(数值可减少,不能增加),密钥A可以改写密钥区。这种方式对于数据是极大的保护,尤其是定额卡,里面的钱只能减少而不能增加。

以上是常用的几种控制方式,更多的组合方式可以利用“S50_Access.exe”工具来生成,我已经上传CSDN了:
https://download.csdn.net/download/xinxin_2011/10847468

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
S50卡的密钥A和密钥B可以通过修改卡片的访问控制位(AC)来实现。以下是一个示例代码,可以通过修改卡片的AC来修改密钥A和密钥B。 ```python from smartcard.System import readers from smartcard.util import toHexString, toBytes # S50卡的默认密钥A和密钥B DEFAULT_KEY_A = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] DEFAULT_KEY_B = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] # 修改密钥A和密钥B的AC值 new_key_A = [0x11, 0x22, 0x33, 0x44, 0x55, 0x66] new_key_B = [0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC] new_AC = [0x78, 0x77, 0x88, 0x11, 0x00] # 获取读卡器 r = readers()[0] # 连接卡片 connection = r.createConnection() connection.connect() # 选择MF目录 resp = connection.transmit(toBytes("00A40004023F00")) # 选择S50卡的目录 resp = connection.transmit(toBytes("00A40004021001")) # 选择要修改的块 block_number = 4 resp = connection.transmit(toBytes("00B00000" + "{:02X}".format(block_number) + "10")) # 读取块的原始数据 old_data = resp.getData() # 修改块的访问控制位(AC)和密钥A和密钥B new_data = old_data[:6] + new_AC + new_key_A + old_data[14:20] + new_key_B + old_data[26:] # 写入修改后的块数据 resp = connection.transmit(toBytes("00D600" + "{:02X}".format(block_number) + "10" + toHexString(new_data))) # 断开连接 connection.disconnect() ``` 需要注意的是,以上代码仅适用于S50卡,并且需要使用正确的块号来选择要修改的块。在实际使用中,需要根据实际情况进行修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值