关于IC卡密钥理解(中级篇)

5 篇文章 0 订阅
3 篇文章 0 订阅

关于普通IC卡密钥,简易篇已经讲述了简单的使用密钥的方式.这种加密方式简单, 也不需要过多的逻辑,使用方便.对于普通使用场合够用了.此篇我们来说说密钥密钥的高级设置,如何配置密钥控制字.

IC卡读写器还是不可少, 我们推荐使用NFC读写器YW-607HC或者IC卡读卡器YW-605HA,不仅支持windows应用程序,也支持chrome等浏览器web的BS架构程序,同时支持安卓和linux的开发,可以说是一款非常全面的读卡器.

每个扇区的最后一个数据块为密钥块,密钥块的结构为:

A密钥(6字节)+密钥控制字(4字节)+B密钥(6字节),例如 FFFFFFFFFFFF  FF078069 FFFFFFFFFFFF

中间的4个字节为密钥控制字,所谓密钥控制字一定用来控制密钥的权限的,那么有哪些权限可以控制呢?

1.对于非密钥块的权限

1.1 数据可读

1.2 数据可写

1.3 数据不可读也不可写

1.4 钱包可增加值

1.5 钱包可以减少值或者初始化

1.6 钱包不能操作(既不能增加值也不能减少值)

2.对于密钥块的权限

2.1 A密钥可以读出

2.2 A密钥可以写

2.3 A密钥不能读也不能写

2.4 控制字可以读出

2.5 控制字可以写

2.6 控制字不能读也不能写

2.7 B密钥可以读出

2.8 B密钥可以写

2.9 B密钥不能读也不能写

对于非密钥数据块IC卡给出了8种组合,用于控制其权限的选择。

序号数据读数据写钱包增值钱包减值或者初始化
0A密钥或者B密钥A密钥或者B密钥A密钥或者B密钥A密钥或者B密钥
1A密钥或者B密钥不能不能A密钥或者B密钥
2A密钥或者B密钥不能不能 不能
3B密钥B密钥不能不能
4A密钥或者B密钥B密钥不能不能
5B密钥不能不能不能
6A密钥或者B密钥B密钥B密钥A密钥或者B密钥
7不能不能不能不能

对于密钥块的8种组合

序号密钥A读密钥A写控制字读控制字写密钥B读密钥B写
0不能A密钥A密钥不能A密钥A密钥
1不能A密钥A密钥A密钥A密钥A密钥
2不能不能A密钥不能A密钥不能
3不能B密钥A密钥或B密钥B密钥不能B密钥
4不能B密钥A密钥或B密钥不能不能B密钥
5不能不能A密钥或B密钥B密钥不能不能
6不能不能A密钥或B密钥不能不能不能
7不能不能A密钥或B密钥不能不能不能

通过以上的组合,按照选择的序号按照位组合起来,就形成了4字节的密钥控制字,如果你觉得这样太麻烦,你也可以使用友我科技免费密钥工具软件。密钥工具下载:http://www.youwokeji.com.cn/DownloadShow.asp?ID=33

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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卡,并且需要使用正确的块号来选择要修改的块。在实际使用中,需要根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值