学生証をdumpしてみた

まえがき

今年の四月から私の大学の学生証が新しくなりました。

コロナの影響で、学校が閉鎖される前に行ったときにカードリーダーをみるとFelicaのリーダーになっていたのでFelicaらしいです。

今更ながら、家にあったのFelicaのリーダーが学生証の中のデータを見てました。

環境

Virtual Box Ubuntu18.04

パソリ RC-S320

準備

S320はnfcpyというPythonのライブラリに対応していないので、libpafeを使用する。

  1. Githubからlibpafeをcloneする
$ git clone https://github.com/rfujita/libpafe.git 
  1. configureコマンドを実行して足りないものを入れる
$ cd libpafe
$ ./configure

私の環境では、以下のものが必要でした。

$ sudo apt install make gcc libuseb-dev pkg-config
  1. インストール
$ make
$ sudo make install
  1. 動作確認
$ sudo ./tests/pasori_test
PaSoRi (RC-S320)
 firmware version 1.40
Echo test... success
EPROM test... success
RAM test... success
CPU test... success
Polling test... success

こんな感じなのがでればOK

dump結果

$ sudo ./tests/felica_dump > dump.txt
$ cat dump.txt -n
     1  # lpdump : Wed Jun 10 03:41:57 2020
     2  # --- IDm info (FeliCa) ---
     3  # Manufacture Date = 2063/10/8
     4  #               SN = 6981
     5  # Manufacture Code = 2E01
     6  #      Equip. Code = C748
     7    system num 1
     8  # FELICA SYSTEM_CODE = 93B1
     9  # card IDm = 012E48C7CD98451B
    10  # card PMm = 033242828247AAFF
    11  # area num = 4
    12  # service num = 6
    13  # AREA #0 = 0000 (00000)
    14  # AREA #1 = 0040 (00000)
    15  # AREA #2 = 0080 (00000)
    16  # AREA #3 = 00C0 (00000)
    17  # 0040:0008 Ramdom Access R/W          (PROTECTED) 
    18  # 0040:000b Random Access Read only   
    19    0040:0000:3031xxxx30xxxx39xx312020202020
    20  # 0080:0008 Ramdom Access R/W          (PROTECTED) 
    21  # 0080:000b Random Access Read only   
    22    0080:0000:3031xxxx30xxxx39xx312020202020
    23  # 00C0:0008 Ramdom Access R/W          (PROTECTED) 
    24  # 00C0:000b Random Access Read only   
    25    00C0:0000:3031xxxx30xxxx39xx312020202020

xになっているところは隠している場所です。

中身をみてみる

ドキュメントを見ながら、dumpした中身を読んでいきます。

日本語のドキュメントなんで比較的理解しやすかったです。

大事そうなところだけ書いていきます。


* 7行目 system num 1

このカードにシステムがいくつかあるか示しています。

システムとは、論理的なカードの単位を表します。

1枚のカードにSuica楽天Edyの機能を持たせることができるということだと思います。

スマートフォンを読み込んでみるとこの値が3つになっていました。


* 8行目 FELICA SYSTEM_CODE = 93B1

リーダ/ライタがカードを特定するために使われます。 ちなみに、Suica0003です。


* 9行目 card IDm = 012E48C7CD98451B

カードを識別するためのIDです。

基本的にはユニークな番号が付与されます。

簡易的な入室管理システムなどでは、この値を利用して作られいます。


* 10行目 card PMm = 033242828247AAFF

カードの種別および性能を識別するためのパラメータです。

上位2バイトを ICコード、続く6バイトを 最大応答時間パラメータ と呼びます。

ICコードは、ROM種別とIC種別の1バイトずつに分けられています。

このカードのIC種別は32です。

このサイト で確認するとRC-SA00/1で、DESとAES暗号に対応したチップが搭載されていてセキュリティが高いカードらしいです。


19行目 0040:0000:3031xxxx30xxxx39xx312020202020

ここの学籍番号の情報があり、ASCIIでデータが格納されています。

20になっている部分を除き、変換してみるとこんな感じになりました。

017xxxxx01

下位の01は学籍番号に関係ないので、どういう意味の数字かは不明です。

ほかの人の学生証と比べればなにか分かるかもしれません。

あと、学籍番号がこのブロックを含めて、合計3ブロックにあるのも謎です。

最後に

今度はs380をでPython3に対応したらしいnfcpyを使ってみたいと思います。 余裕があれば、学生証を利用した入室管理システムも作るかもしれないです。

参考文献

raspberrypiでFeliCaのIDmを除く(pasori RC-S320版)

[PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin]

FeliCaカード ユーザーズマニュアル 抜粋版

FeliCa技術方式の各種コードについて