Python 操作智能卡

搬运工:

PySmartCard--python智能卡操作库

https://www.maybetodaystudio.com/blog/2018/11/25/python_smart_card/

主要就是安装PySmartCard,然后参考里面的Example.py和卡片交互。

from PySmartCard.CpuCard import PcscReader
import time

def send_apdu(reader, apdu, recv_list, readertype=None):
    # Clear list
    recv_list[:] = []
    apdu = apdu.replace(" ", "")
    time1 = time.strftime("%Y_%m_%d %H:%M:%S", time.localtime(time.time()))
    showlog = "{} {} {}".format(time1, " Send: ", apdu)
    # print(time1, " Send: ", apdu)
    print(showlog)
    result = reader.send_apdu(apdu, readertype)
    time2 = time.strftime("%Y_%m_%d %H:%M:%S", time.localtime(time.time()))
    showlog = "{} {} {}".format(time2, " Recv: ", result)
    print(showlog)
    # print(time2, " Recv: ", result)
    # recv values
    recv_list.append(result[:-4])
    # SW
    recv_list.append(result[-4:])


def send_apducommand(reader, apdu, recv_list, readertype=None):
    send_apdu(reader, apdu, recv_list, readertype)
    if recv_list[1][0:2] == "61":
        apdu = "00C00000" + recv_list[1][2:4]
        send_apdu(reader, apdu, recv_list, readertype)
    elif recv_list[1][0:2] == "6C":
        apdu = apdu[0:8] + recv_list[1][2:4]
        send_apdu(reader, apdu, recv_list, readertype)


def test_pcsc():
    print("Test PcscReader...")
    pcsc = PcscReader()
    result = pcsc.get_pcsc_readerlist()
    readerNameList = result.split(";")
    for iname in range(len(readerNameList) - 1):
        showlog = "{} {} : {}".format("reader", iname, readerNameList[iname])
        print(showlog)

    # Identive CLOUD 4700 F Contact Reader 0
    # Identive CLOUD 4700 F Contactless Reader 1

    # linux readername
    # Contact Reader: Identive Identive CLOUD 4500 F Dual Interface Reader
    #                 [CLOUD 4700 F Contact Reader] (53201441201079) 00 00
    # Ctless Reader:Identive Identive CLOUD 4500 F Dual Interface Reader
    #               [CLOUD4700 F Contactless Reader] (53201441201079) 01 00
    # Test PcscReader...
    # reader 0 : NetOp Virtual Smart Card Reader 0
    # reader 1 : OMNIKEY CardMan 5x21 0
    # reader 2 : OMNIKEY CardMan 5x21-CL 0

    readername = "Identive CLOUD 4700 F Contact Reader 0"
    # readername = "Identive CLOUD 4700 F Contactless Reader 1 "
    for iname in range(len(readerNameList) - 1):
        readername = readerNameList[iname]
        result = pcsc.connect_device(readername)
        if len(result) == 0:
            showlog = "{} {} : {}  does not has a smart card here ".format("reader", iname, readerNameList[iname])
            print(showlog)
        else:
            print("{} ConnectDevice Success...".format(readerNameList[iname]))
            print("ATR: ", result)
  


    # 1-contact reader 2-contactless reader
    readertype = 1

    result = pcsc.power_on(readertype)
    if result != 0:
        pcsc.disconnect_device()
        print("Device PowerOn Failed!")
        return -1
    else:
        print("Device PowerOn Success...")

    apdu = "0084000008"
    apdu = "00A4040008 A000000632010105"
    apdu = "00A4040008 A000000333010102"
    revc_info = []
    send_apducommand(pcsc, apdu, revc_info, readertype)
    if revc_info[1] != "9000":
        pcsc.disconnect_device()
        print("Send Apdu Failed!")
        return -1

    apdu = "00B2010C00"
    icount = 1
    while(1):
        send_apducommand(pcsc, apdu, revc_info, readertype)
        if revc_info[1] != "9000":
            print("Send Apdu Failed!")
            return -1
        icount = icount + 1
        if icount > 50:
            break

    pcsc.disconnect_device()
    return 0


if __name__ == '__main__':
    if test_pcsc() == 0:
        print("Test OK...")
    else:
        print("Test Failed!")

2019_02_14 14:38:59 Recv: 6F4B8408A000000333010102A53F500B50424F43204352454449548701019F381B9F6604DF60019F02069F03069F1A0295055F2A029A039C019F3704BF0C0EDF6101029F4D020B0ADF4D020C0A9000

2019_02_14 14:39:01 Recv: 7010570E6222520647777776D2401206240F9000

2019_02_14 14:39:01 Send: 00B2010C00

2019_02_14 14:39:01 Recv: 7010570E6222520647777776D2401206240F9000

2019_02_14 14:39:01 Send: 00B2010C00

……

2019_02_14 14:39:01 Recv: 7010570E6222520647777776D2401206240F9000

Test OK...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值