You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pyscard结合戴尔ControlVault 3非接触式读卡器读取Mifare Classic卡

如何使用pyscard结合戴尔ControlVault 3非接触式读卡器读取Mifare Classic卡

嘿,我刚好在用戴尔Latitude 5430的ControlVault 3非接触式读卡器,也折腾过用pyscard读Mifare Classic卡,给你分享下具体的操作步骤和注意事项!

先说说我的设备情况

  • 笔记本:戴尔Latitude 5430
  • 读卡器:戴尔ControlVault 3非接触式智能卡读卡器(Broadcom芯片)
  • 在Windows设备管理器里,它显示为Broadcom Corp Contactless SmartCard 0

我之前已经用pyscard成功处理过Desfire卡,现在把经验扩展到Mifare Classic卡上。

具体操作步骤

首先,确保你已经安装了pyscard库,没装的话先在命令行跑pip install pyscard。

1. 识别并连接目标读卡器

第一步还是先找到我们的Broadcom读卡器,建立连接:

from smartcard.scard import *
from smartcard.util import toHexString

def select_reader():
    # 遍历所有可用读卡器,定位到我们的目标设备
    for reader in readers():
        print(f"检测到读卡器:{reader.name}")
        if reader.name == 'Broadcom Corp Contactless SmartCard 0':
            return reader

# 选中目标读卡器
target_reader = select_reader()
if not target_reader:
    print("没找到目标读卡器,请检查设备是否正常连接!")
    exit()

# 建立与读卡器的连接
card_connection = target_reader.createConnection()
try:
    card_connection.connect()
    print("成功连接到读卡器啦!")
except Exception as e:
    print(f"连接失败:{str(e)}")
    exit()

2. 发送Mifare Classic专属指令

Mifare Classic卡和Desfire卡的指令逻辑不一样,必须先验证对应扇区的密钥,才能读取或写入数据。这里以读取扇区0的块0为例(Mifare Classic 1K卡有16个扇区,每个扇区含4个块,最后一个块是密钥存储块)。

第一步:验证扇区密钥

先发送密钥验证指令,这里用默认的A密钥FFFFFFFFFFFF做演示:

# 构造验证A密钥的指令(针对扇区0)
auth_cmd = [0xFF, 0x86, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x60, 0x00]
# 追加默认A密钥
auth_cmd += [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

try:
    # 发送验证指令
    response, sw1, sw2 = card_connection.transmit(auth_cmd)
    if sw1 == 0x90 and sw2 == 0x00:
        print("扇区0的A密钥验证成功!")
    else:
        print(f"密钥验证失败,返回码:{hex(sw1)}{hex(sw2)}")
except Exception as e:
    print(f"发送指令出错:{str(e)}")
    exit()

第二步:读取卡内数据

密钥验证通过后,就可以发送读取指令获取块内的数据了:

# 构造读取块0的指令(块地址0x0000,读取16字节)
read_cmd = [0xFF, 0xB0, 0x00, 0x00, 0x10]

try:
    data, sw1, sw2 = card_connection.transmit(read_cmd)
    if sw1 == 0x90 and sw2 == 0x00:
        print(f"读取块0成功,十六进制数据:{toHexString(data)}")
        # 转成ASCII方便阅读(不可打印字符用.代替)
        ascii_data = ''.join([chr(b) if 32<=b<=126 else '.' for b in data])
        print(f"ASCII格式数据:{ascii_data}")
    else:
        print(f"读取失败,返回码:{hex(sw1)}{hex(sw2)}")
except Exception as e:
    print(f"读取数据出错:{str(e)}")

一些要注意的点

  • 每个扇区都需要单独验证密钥,不同扇区可能用不同的密钥,要是你的卡不是默认密钥,记得替换成你实际的A/B密钥
  • Mifare Classic 1K有16个扇区,4K版本有40个扇区,操作的时候要对应好扇区和块的地址
  • 戴尔ControlVault 3读卡器原生支持Mifare Classic协议,所以不用额外配置,直接用就行

备注:内容来源于stack exchange,提问作者Mert Mertce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:43:11