Raspberry Pi 3にPaSoRi(RC-S380)を接続して、nfcpyを使用し、Python言語でSuicaカードをダンプします。nfcpy のバージョンは 0.11.0 (2016-04-21) です。
nfcpy のインストールについては、「raspberry piでSuicaの履歴の表示」を参照してください。
nfcpyの公式のドキュメントがあります。左側のメニューから、「Module Reference → nfc.tag → Type 3 Tag」を選択すると、FeliCaカードで使用できるメソッドの仕様が表示されます。

Suicaカードのダンプアプリの作成

  1. スクリプトの1行目に、「#!/usr/bin/env python」と記述し, 実行可能権を付けると、「python」が必要なくなり、「./suica.py」だけでプログラムが実行できます。
  2. スクリプトの2行目の「# -*- coding: utf-8 -*-」 は、このソースがUTF-8で記述されていることpythonに示します。コードのコメントに日本語を使いたい時には必要です。
  3. スクリプトの5行目の「sys.path.insert(1, os.path.split(sys.path[0])[0])」は、親ディレクトリと自分と同じ深さのディレクトリをimportしたいときに検索パスを追加しています。この構文がないと、実行時に「ImportError: No module named nfc」と表示されます。
  4. スクリプトの16行目で、タイプ3のタグ(FeliCa)かを判断し、タイプ3のタグの場合、dumpメソッドでSuicaカードをダンプします。

suica.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
sys.path.insert(1, os.path.split(sys.path[0])[0])

import binascii
import nfc
  
service_code = 0x090f
  
def connected(tag):
  # タグのIDなどを出力する
  print tag
  
  if isinstance(tag, nfc.tag.tt3.Type3Tag):
    try:
      # 内容を16進数で出力する
      print('  ' + '\n  '.join(tag.dump()))
    except Exception as e:
      print "error: %s" % e
  else:
    print "error: tag isn't Type3Tag"
  
# タッチ時のハンドラを設定して待機する
clf = nfc.ContactlessFrontend('usb')
clf.connect(rdwr={'on-connect': connected})

Suicaカードのダンプアプリの実行

次のようにsuica.pyを起動し、RC-S380にSuicaカードをかざすと、次のようにSuicaカードがダンプされます。

$ ./suica.py
Type3Tag 'FeliCa Standard (RC-S???)' ID=010103128E143F07 PMM=100B4B428485D0FF SYS=0003
  System 0003 (Suica)
  Area 0000--FFFE
    Area 0040--07FF
      Random Service 1: write with key & read with key (0x0048 0x004A)
      Random Service 2: write with key & read w/o key (0x0088 0x008B)
       0000: 00 00 00 00 00 00 00 00 20 00 00 2f 08 00 03 13 |........ ../....|
      Area 0800--0FBF
      Purse Service 32: direct with key & cashback with key & read with key (0x0810 0x0812 0x0816)
      Purse Service 33: direct with key & cashback with key & read with key (0x0850 0x0852 0x0856)
      Purse Service 34: direct with key & cashback with key & read with key (0x0890 0x0892 0x0896)
      Random Service 35: write with key & read with key (0x08C8 0x08CA)
      Random Service 36: read with key (0x090A)
      Cyclic Service 36: write with key & read w/o key (0x090C 0x090F)
       0000: 16 01 00 02 21 88 97 10 97 04 2f 08 00 03 13 00 |....!...../.....|
       0001: 16 01 00 02 21 88 97 04 97 10 1c 09 00 03 11 00 |....!...........|
       0002: 05 0d 00 0f 21 6e 0c 6a 00 00 09 0a 00 03 0f 00 |....!n.j........|
       0003: 16 01 00 02 21 6e d4 0b d4 05 e1 0a 00 03 0e 00 |....!n..........|
       0004: 16 01 00 02 21 63 97 10 97 04 95 0b 00 03 0c 00 |....!c..........|
       0005: 16 01 00 02 21 63 1d 0c 1d 09 82 0c 00 03 0a 00 |....!c..........|
       0006: 16 01 00 02 21 5c 02 03 1d 0d 1c 0d 00 03 08 00 |....!\..........|
       0007: 16 01 00 02 21 5c 05 18 02 03 42 0f 00 03 06 00 |....!\....B.....|
       0008: 1d 01 00 02 21 5c 88 03 88 01 0a 12 00 03 04 00 |....!\..........|
       0009: 16 01 00 02 21 5c 88 01 88 03 a0 12 00 03 02 00 |....!\..........|
       000A: 16 01 00 02 21 5c 1d 0d 05 18 36 13 00 03 00 00 |....!\....6.....|
       000B: 16 01 00 02 21 58 1d 08 1d 0c 10 18 00 02 fe 00 |....!X..........|
       000C: 16 01 00 02 21 58 d8 02 d5 25 b5 18 00 02 fc 00 |....!X...%......|
       000D: 16 01 00 02 21 58 d5 25 d8 02 78 19 00 02 fa 00 |....!X.%..x.....|
       000E: 16 01 00 02 21 58 1d 0c 1d 08 3b 1a 00 02 f8 00 |....!X....;.....|
       000F: 12 02 00 00 21 58 1d 0c 00 00 e0 1a 00 02 f6 00 |....!X..........|
       0010: c7 46 00 00 21 45 52 0c 5e 0b 58 07 00 02 f5 00 |.F..!ER.^.X.....|
       0011: 16 01 00 02 21 41 03 0d 1d 0d ee 08 00 02 f4 00 |....!A..........|
       0012: c7 46 00 00 21 41 76 84 ad 4e 6b 0b 00 02 f2 00 |.F..!Av..Nk.....|
       0013: 16 01 00 02 21 41 1d 0d 03 0d cf 0b 00 02 f1 00 |....!A..........|
      Area 0FC0--7FFF
      Area 1000--17BF
        Random Service 64: write with key & read with key (0x1008 0x100A)
        Random Service 65: write with key & read with key (0x1048 0x104A)
        Cyclic Service 66: write with key & read w/o key (0x108C 0x108F)
         0000: 20 00 97 04 20 02 21 88 19 20 ed 00 00 00 00 00 | ... .!.. ......|
         0001: a0 00 97 10 10 04 21 88 19 05 00 00 00 00 00 00 |......!.........|
                ・・・
                ・・・
  1. サービスコード「0x090f」ブロック番号「0-19」(「Cyclic Service 36: write with key & read w/o key (0x090C 0x090F)」以降)に利用履歴が表示されています。
  2. サービスについては、FeliCaカード ユーザーズマニュアル 抜粋版の「3.4サービス」を参照してください。

    サービス属性一覧
    表示 説明
    Random Service ユーザが自由にブロックを指定してアクセス可能なサービス
    Cyclic Service ログの記録をユースケースとしてブロックへのアクセスに特殊な機能を付与したサービス
    Purse Service ブロックデータの一部を正の数値とみなして、その値を減算する機能持つサービス
    direct with key Purse Serviceにおいて、指定されたブロックデータをそのまま上書きするアクセス
    cashback with key Purse Serviceにおいて、キャッシュバックデータの値の範囲で指定された値をパースデータに加算するアクセス

  3. パスワードなしで読み書きできるのは “w/o key” (without key = キーなし)となっているサービスだけです。

アプリを起動しても、「: そのようなファイルやディレクトリはありません」と表示されて実行できない場合、ファイルの改行コードが、Windows[CRLF]でなくUnix[LF]になっていることを確認してください。