WindowsのPythonでpyscard経由でAPDUコマンドからICカードのIDmを取得する方法について説明します。
環境
- OS: Windows10
- カードリーダー: PaSoRi RC-S380
- ICカード
- 言語: Python3
- ライブラリ: pyscard
カードリーダーと通信するためにPaSoRi RC-S380のドライバをインストールする必要があります。 ドライバはSonyのページから「NFCポートソフトウェア」をダウンロードして、NFCPortWithDriver.exeを実行します。
Sony Japan | FeliCa | 個人のお客様 | ダウンロード | NFCポートソフトウェア
ICカードは、Suica, Edy, nanako, マイナンバーカードなど非接触型のカードであれば何を使ってもよいです(ただし、マイナンバーカードは読み取るたびにIDmが変化します)。
WindowsにはPythonをインストールして、コマンドから py.exe が使えるようにします(WSLではUSBに接続できないので注意)。
APDUで通信するためのライブラリに pyscard を使うので、py -m pip install pyscard
でインストールしておきます。
プログラム
pyscardのサンプルコードを読みながら書きます。
pyscard user’s guide — pyscard 1.9.5 documentation
APDUコマンドは GET DATA コマンドを使います。
送信するバイナリは FF CA 00 00 00
です。
from smartcard.util import toHexString
from smartcard.System import readers as get_readers
readers = get_readers()
print(readers)
conn = readers[0].createConnection()
conn.connect()
send_data = [0xFF, 0xCA, 0x00, 0x00, 0x00]
recv_data, sw1, sw2 = conn.transmit(send_data)
print(toHexString(send_data))
GET DATAコマンドの構造は以下の通りです。
- CLA: 0xFF … 命令クラス FF固定
- INS: 0xCA … 命令コード GET DATAコマンド
- P1: 0x00 … 引数1 00固定
- P2: 0x00 … 引数2 00固定
- Le: 0x00 … Leフィールド 最大長
ISO7816 part 4 section 6 with Basic Interindustry Commands (APDU level)
Pythonプログラムを実行して、カードのIDmが16進数文字列で出力されれば成功です。
以上です。