SmartCard学习之PySmartCard

SmartCard学习之APDU APDU:   Application Protocol Data Unit 指令格式: Command Type Send Cmd CLA INS P1 P2 Lc Data Le Response Data SW1 SW2 发送指令结构: Send Cmd Header Send Cmd Body CLA INS P1 P2   Lc Data L... 阅读详情

sudo apt update  
sudo apt install -y python3 python3-pip python3-dev libccid pcscd libdbus-1-dev  
sudo -H python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip --upgrade  

sudo pip install pydes

sudo pip install PySmartCard  

下面这个代码用来操作复旦的FM1216-109型号的CPU卡成功了,这段代码主要是实现MF下二进制文件的读写,外部密钥的校验。
其实没啥,主要看一下流程:
连接 ==》 获取随机数 ==》 des加密 ==》 文件操作
这样一个流程其实主要开始靠send_apdu()这个函数。

这边没写的是发卡的一个流程,其实类似,区别就是send_apdu里面发送的apdu不同。具体可以参考前面写的一些手动操作示例。

里面还有个坑就是PyDes的操作,需要注意输入输出数据是byte array, padding mode也是个坑。

that’s all !


from PySmartCard.CpuCard import PcscReader

import time

def showlog(data, send):
    current = time.strftime('%Y_%m_%d %H:%M:%S', time.localtime())
    if send:
        send = '==>\t'
    else:
        send = '\t<=='
    print("{} {} {}".format(current, send, data))

def sendApdu(reader, apdu, recv_list, readerType):
    recv_list[:] = []
    apdu = apdu.replace('','')
    showlog(apdu, True)
    response = reader.send_apdu(apdu, readerType)
    showlog(response, False)
    recv_list.append(response[:-4])
    recv_list.append(response[-4:])
#    checkError(recv_list)
#def checkError(recv_list):
    if recv_list[-1][:2] == '61':
        apdu = '00C00000' + recv_list[-1][2:4]
        sendApdu(reader, apdu, recv_list, readerType)
    elif recv_list[1] == '9000':
        if len(recv_list[0]) > 0:
            showlog(recv_list[0], False)
            showlog(9000, False)
        print("\tSend Apdu Succeed!\n")
    else:
        print("\tSend Apdu Failed!\n")
        return -1

print("Test FM1216-109:")
pcsc = PcscReader()
result = pcsc.get_pcsc_readerlist()
#print("result: ",result)
readerNameList = result.split(";")
print("Current Card Reader:")
for i in range(len(readerNameList) - 1):
    print("\t{}[{}]: {}".format('reader', i, readerNameList[i]))

readerName = "Dell Dell Smart Card Reader Keyboard 00 00"
result = pcsc.connect_device(readerName);
if len(result) == 0:
    showlog = "{}: {} does not have samrt card".format("reader",
            readerName)
    print(showlog)
else:
    print("connect succeed: ", readerName)
    print("\tATR:", result)

#select the card's MD    
print("select the card's MD: ")    
readerType = 1  #reader type 1: connect-able reader
apdu = "00A4000000"
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

#CMD: get 8 bytes random number from card
apdu = "0084000008"
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

print("get Random Number: \n\t\t", recv_list[0])
randomNoStr = []    
randomNoStr=bytearray.fromhex(recv_list[0])
print("\t", randomNoStr)

#use DES cipher
from pyDes import CBC,des,PAD_PKCS5,PAD_NORMAL
import binascii
key = "1234567812345678"
key = bytearray.fromhex(key)
print("key: \t", key, " len: ", len(key))
iv = b"\0\0\0\0\0\0\0\0"
deser = des(key, CBC, iv, pad=None, padmode=PAD_NORMAL)
print("randomNoStr: \t", randomNoStr, " len: ", len(randomNoStr))
cipherText = deser.encrypt(randomNoStr)
print("cipherText: \t", cipherText, " len: ", len(cipherText))
#import array    
print("\tb2a_hex: \t", binascii.b2a_hex(cipherText), " len: ", len(cipherText))
clearText = deser.decrypt(cipherText)
print("clearText: \t", binascii.b2a_hex(clearText))

#send the DES encrypted random number to card
print("Send ciphertext to card: ")
apdu = "0082000008" +  str(binascii.b2a_hex(cipherText), encoding='utf-8')
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

#select file NO. 16
print("\nselect NO.16 file: ")
apdu = "00A40000020016"
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

#write 8 bytes 1122334455667788 into file NO. 16    
print("\nwrite the first 8 bytes with 0x1122334455667788: ")
apdu = "00D60000081122334455667788"
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

#read the first 8 bytes from NO. 16
print("\nread the first 8 bytes: ")
apdu = "00B0000008"
recv_list = []
sendApdu(pcsc, apdu, recv_list, readerType)

pcsc.disconnect_device( )



APDU指令读卡工具的实用指南与案例 APDU,即应用协议数据单元(Application Protocol Data Unit),是智能卡技术中用于和卡片通信的一种命令和响应协议。在这一章节中,我们将介绍APDU的基本概念、它的结构组成,以及它在智能卡技术中的重要性。APDU指令集是在智能卡通信协议中定义的一组标准化命令,它为卡片操作提供了明确的指令集。每个APDU指令通常包含命令头、参数、数据和状态字节等部分,确保了数据传输的一致性和可靠性。指令集设计得当,对于智能卡的安全性和易用性都有极大提升。 阅读详情

相关推荐

pyscard:python的pyscard智能卡库

pyscard:python的智能卡库 -Python智能卡库-是一个Python模块添加智能卡支持。 文献资料 样本 高级API样本:请参见低级别API样本:请参见 持续集成状态 特拉维斯CI: AppVeyor: 工作服:

pythoncard安装_PySmartCard--python智能卡操作库

1. 简介PySmartCard[PythonSmartCatd]是一个操作智能卡(CPU卡)的python库PySmartCard封装了PCSC/D8/D6/T6等读写器的CPU卡操作功能,包括:连接读写器,上电复位,发送apdu指令,断开读写器。同时封装了cpu卡卡片个人化的时候需用到的一些常用算法,包括:3DES_ECB,3DES_CBC,SM4_ECB,SM4_CBC,MAC,MAC_S...

weixin_39560245的博客 1750

Python库-Pyscard

基于Python实现对PC/SC读卡器以及智能卡的控制

Python 操作智能卡

搬运工: PySmartCard--python智能卡操作库 https://www.maybetodaystudio.com/blog/2018/11/25/python_smart_card/ 主要就是安装PySmartCard,然后参考里面的Example.py和卡片交互。 from PySmartCard.CpuCard import PcscReader import time...

zhang_fei_fresh的博客 3533

pypace:PACE协议在Python中的实现

皮皮斯 PACE协议在Python中的实现 需要库pycryptodome pip install pycryptodomex 和pytlv pip install pytlv 在main.py中,您应该设置reader_index(0:第一个阅读器,1:第二个...),密码参考(1:MRZ,2:CAN,3:PIN,4:PUK)和密码。 您可能需要更改心律和聊天。 这取决于您的卡支持什么。 有关更多信息,请参见。

Smart-Card-Tool-pyResMan:用于 java 卡和其他智能卡的免费开源 javacard 工具。-开源

pyResMan是用于JavaCard和其他智能卡的免费开源智能卡工具。 它可用于发送APDU,执行APDU脚本; 可配合R502 SPY阅读器调试ISO14443协议命令和Mifare命令; 也可以用来管理GP卡的资源。 它基于 pyScard 和 GlobalPlatform 开源项目。 欲了解更多详情,您可以访问:

【python】基于PCSC协议实现读卡器和卡片通信

简介 PCSC协议是windows平台下的一套通用API,所 有 函 数 的 原 型 都 winscard.h中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都 SCARD_S_SUCCESS。它为读卡器/卡片和电脑提供了一个标准接口,实现不同生产商的卡片和读卡器之间的互操作性。之前工作中使用的时候是在VC++环境下之间调用的winscard提供的api,学了py...

每天进步一点点 1万+

ADS与MATLAB数据互通全指南:从Snp文件导入到TXT导出完整流程

本文详细介绍了在射频与微波工程中,实现ADS与MATLAB高效数据互通的完整流程。核心内容包括利用SPOutput控件、数据显示窗口及测量方程等多种方法,将ADS仿真数据(如S参数)导出为Touchstone或TXT格式,并导入MATLAB进行深度分析与可视化;同时指导如何将MATLAB处理后的数据回灌至ADS,用于模型验证与协同仿真,旨在构建自动化、无损的数据交换工作流,提升工程师的工作效率。

pluto的博客 391

Python 3.8 上 pysmartcard 加载 DLL 库抛出异常 FileNotFoundError: Could not find module Readerlib.dll‘

Python 3.8 上 pysmartcard加载 DLL 库抛出异常 FileNotFoundError: Could not find module 'Readerlib.dll' CPUcard.py中 self.reader_lib = ctypes.cdll.LoadLibrary(path)有点问题。 导致该问题的原因是:Python 3.8 变更了 Windows 下动态链接库 (DLL) 的加载规则。 新的规则提高了安全性,默认情况下仅能从可信的位置(Trusted Location

qq_39951477的博客 3238

Cursor+Playwright MCP实战:如何用自然语言一键生成UI自动化测试脚本

本文探讨了如何利用Cursor与Playwright MCP实现自然语言驱动的UI自动化测试脚本生成。通过智能IDE与浏览器自动化协议的结合,开发者可以高效创建稳定的测试脚本,显著提升测试效率与维护性。重点介绍了MCP架构的优势、项目结构最佳实践及团队协作规范,为自动化测试带来革命性改进。

k8l9m0n的博客 441

AD9361 官方例程

文章目录一、官方资料1.1 介绍1.2 下载 和 使用1.3 相关资料二、步骤2.1 在Vivado中构建HDL2.2 在SDK中构建No- OS总结 一、官方资料 1.1 介绍 HDL参考设计介绍:AD9361 HDL Reference Designs 无操作系统介绍:AD9361 No-OS Software 1.2 下载 和 使用 HDL下载:Download HDL 在Vivado中构建HDL:Building HDL No-OS下载:Download No-OS 1.3 相关资料 AD

weixin_44630490的博客 3万+

SmartCard-1 Terminology(术语)

1.Abbreviations and Notations(符号和缩写) Abbreviatioin Description(英文) Description(中文) SE Secure Element 安全元素 API Application Programming Interface 应用程序接口 ATR Answer to Re...

weixin_30616969的博客 193

Halcon: 获取仿射矩形-rectangle2的四个顶点、四条边的中点

Halcon 工业应用实用教程中的一个例子: * CenterY : 仿射矩形中心y * CenterX: 仿射矩形中心x * Phi: 仿射矩形角度 * Len1: 仿射矩形宽的一半 * Len2: 仿射矩形高的一半 * CornerY: 仿射矩形端点y * CornerX: 仿射矩形端点x * LineCenterY: 仿射矩形边中点y * LineCenterx: 仿射矩形边中点x * 矩...

ruotianxia的博客 8572

pyscard 项目教程

pyscard 项目教程 1、项目介绍 pyscard 是一个为 Python 提供智能卡支持的模块。它包括一个封装了 WinSCard API(智能卡基础组件)的扩展模块,以及一个构建在原始 PC/SC API 之上的高级 Python 框架。pyscard 项目旨在简化智能卡在 Python 应用程序中的集成和使用。 2、项目快速启动 安装 首先,确保你已经安装了 Python 3。然后使用 ...

gitblog_00057的博客 1053

双层优化入门(1)—基本原理与求解方法(附matlab代码)

双层优化问题(Bilevel Programming Problems),也被称为双层规划,最早由Stackelberg与1934年在经济学相关研究中提出,因此也被称为Stackelberg问题。双层规划问题一般具有层次性、独立性、冲突性、优先性和自主性等特点。 本文介绍了双层优化的原理与求解方法,并提供了相应的matlab代码供参考学习。

配电网和matlab的博客 5万+

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构

本文记录的是基于的YOLOv11网络模型轻量化方法研究。GhostNet中的Ghost模块和Ghost瓶颈结构是其轻量化的关键。Ghost模块克服了传统卷积层计算资源需求大的问题,Ghost瓶颈则合理设计了通道数量的变化以及与捷径连接的方式,能更好地在减少计算成本的同时保持较高性能,从而提升模型在移动设备上的应用能力和效率。

Limiiiing的博客 1430

【亲测免费】 探索智能卡的无限可能:pyscard项目深度解读

探索智能卡的无限可能:pyscard项目深度解读 项目介绍 在数字化时代,智能卡作为一种安全、高效的认证和数据存储手段,在金融、电信、身份验证等领域扮演着至关重要的角色。为了使Python开发者能够轻松地利用这一强大工具,pyscard应运而生。这是一个专门用于Python的智能卡库,它为Python世界开启了一扇通向智能卡操作的大门。 图1:pyscard架构 项目技术分析 pyscard...

gitblog_01056的博客 1121

innovus:addRepeaterByRule用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?addRepeaterByRule不管transition/timing violation,只根据约束的length/cap/fanout等等去给net 插buffer。

m0_61544122的博客 1091

【亲测免费】 pyscard 开源项目安装与使用指南

pyscard 开源项目安装与使用指南 1. 项目目录结构及介绍 pyscard 是一个用于Python的智能卡库,它允许开发人员在Python程序中添加对智能卡的支持。下面是该项目从GitHub仓库下载后的典型目录结构及其简要说明: pyscard/ ├── ACKS # 致谢文件,记录贡献者名单。 ├── CHANGELOG # 变更日志,记录了项目各个版...

gitblog_00059的博客 475

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android hid发送apdu格式数据

在 Android 中,将 APDU(Application Protocol Data Unit)转换为字节数组(byte array)通常涉及到将APDU的各个部分按照特定的规则编码为字节数组。要将十六进制字符串 "bc00000000" 转换为 APDU 数据,首先需要将每两个字符解析为一个字节,并根据 APDU 格式构建合适的命令。在这个格式中,CLA、INS、P1、P2 是命令的各个字段,LC 是要发送的数据的长度,Data 是实际要发送的数据。:智能卡对命令的响应。这些都chatgpt所得。

qq_34900897的博客 1282

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

开源项目pyscard常见问题解决方案

开源项目pyscard常见问题解决方案 1. 项目基础介绍和主要编程语言 项目介绍: pyscard是一个Python模块,为Python程序提供了对智能卡的支持。它允许开发者通过Python代码与智能卡进行交互,包括发送APDU命令、接收响应等。pyscard模块旨在简化智能卡应用程序的开发过程。 主要编程语言: Python:用于实现模块的核心逻辑和API接口。 SWIG:用于将C语言编写的...

gitblog_00455的博客 797

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【12】配置环境变量

软件的环境变量配置

cdan134的博客 283

Smart Card 使用心得

Smart Card 使用心得

gd6321374的专栏 5365
上一篇: SmartCard学习之libpcsclite
下一篇: PyDes中pad mode简单研究
Benjamin_Xu
博客等级 码龄14年 46粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值