こんばんは、KMC 6回生のpossumです。 投稿が遅くなった事をお詫び申し上げます。
この記事は"今年もやります!KMCアドベントカレンダー!!" (KMC活動ブログ)の24日目の記事です。 昨日23日目の記事はlastcatさんの"盆栽日記……のはずが。"でした。
さて、本日2014年12月24日は京都市バスが交通系ICカードの利用を開始した記念すべき日ですね!
"【広報資料】平成26年12月24日から市バスでもICカードが使えます!!" (京都市交通局)
交通系ICカードにはソニーが開発したFeliCa (ふぇりか)という技術方式が用いられています。 そこで本日は同じくFeliCaが用いられている京都大学の学生証についてお話しします。
京都大学の学生証について
京都大学の学生証は
- 図書館やパーソナルコンピュータ端末の利用証
- 学内施設への入退館認証
- 証明書自動発行機の利用
- 京大生協組合員証 (生協での電子マネー利用)
などの役割を兼ねているため、1枚のカードに複数のサービスの情報が載っている事になります。
それぞれのサービスがばらばらに読み書きしていては効率が悪いので、FeliCaを利用した個人認証用フォーマットとしてFCFというものがあり、京大の学生証もこのフォーマットを利用しています。 お持ちの方は学生証の裏面にFCFのロゴマークが確認できるでしょう。
参考: FCF推進フォーラム
フォーマットがFCFであることは判明しましたが、残念ながらFCFに関する技術的仕様を見つける事ができませんでした。 ただしFeliCaのカードであることには違いないので、FeliCaを扱うためのライブラリとして有名なfelicalibを利用して中身を見てみましょう。
準備
以下の環境を用意しました。
- Windows 8.1
- PaSoRi RC-S380
- USB接続のFeliCa用のリーダ
- お値段2,500円くらい
手順
- FeliCaの公式サイトからNFCネットインストーラをダウンロードしてドライバをインストールする
- felicalibをダウンロードして展開する
- Version 0.4.2を使用
- リーダにカードを載せ、felicalibに同梱されているFelicaDump.exeを実行する
- 非暗号化領域の情報を文字列で書き出してくれます。
- 載せた時に1でインストールしたランチャが立ち上がりますがどいてもらいました。
FelicaDump.exe > file
というようにリダイレクトしてファイルに書き出すと後で見やすいです。
学生証の中身
FelicaDump.exeを実行すると以下のように整形された結果が出力されます。
# IDm: XX XX XX XX XX XX XX XX # PMm: XX XX XX XX XX XX XX XX # System code: 8688 # Number of area = 1 # Area: 0000 - FFFE # Number of service code = 0 # System code: FE00 # Number of area = 15 # Area: 0000 - FFFE # Area: 1A80 - 1AFF # Area: 1A81 - 1AFF # Area: 1B00 - 1B3F # Area: 1B01 - 1B3F # Area: 1B40 - 1B7F # Area: 1B41 - 1B7F # Area: 42C0 - 42FF # Area: 42C1 - 42FF # Area: 4300 - 433F # Area: 4301 - 433F # Area: 4340 - 437F # Area: 4341 - 437F # Area: 50C0 - 50FF # Area: 50C1 - 50FF # Number of service code = 19 # Serivce code = 1A88 : Random Access R/W (Protected) 1A88:0000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 1A88:0001 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 1A88:0002 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 1A88:0003 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX (以下略)
順に見て行きましょう。
IDm, PMm
IDmは製造IDのことで、カードごとに付与される8バイトのIDです。読み書きするシステムがカードを識別するために使います。 先頭2バイトが製造者コード、続く6バイトがカードの識別番号です。 IDmを利用して個人認証を行うシステムもあるようですが、FCF推進フォーラムによればセキュリティ上の観点から推奨されないそうです。
PMmは製造パラメータが格納されており、先頭2バイトが製品を特定するためのICコード、後の6バイトがカードと通信する時のタイムアウト時間を決定するパラメータです。
FeliCaのファイルシステム
FeliCaのファイルシステムはシステム・エリア・サービス・ブロックデータという4種類のノードから成ります。
- 物理カードの中に複数の論理カードを格納する事ができ、論理カードのことをシステムと呼びます。
- システムの中には複数のエリアがあり、エリアはその中にエリア、サービス、ブロックデータを保持します。
- エリアを利用して階層化できるということですね。
- データが書き込まれるのはブロックデータですが、これへのアクセス方法・権限をサービスが握っています。
従ってFelicaDump.exeを使った結果では
- システムコードが
0x8688
と0xFE00
の2つのシステムが存在する - システム
0x8688
- エリア: 1個
- サービス: 0個
- システム
0xFE00
- エリア: 15個
- サービス: 19個
ということがわかります。
システムコードの下にエリアの数とエリアの一覧、サービスの数が続きます。 次いでサービスの列挙が始まり、サービスコード以下がブロックデータに記載されているデータです。
参考: FeliCa 技術情報
学生情報
全サービスの情報を解析したかったところですが、締め切りが迫っているため名前や学籍番号の記載されているサービスを見てみましょう。
0xFE00
のシステムにあるサービスコード 0x1A8B
の領域は以下のようになっています。
1A8B:0000 30 31 30 30 30 30 30 30 30 30 38 32 00 00 30 32 1A8B:0001 B8 C1 B8 B6 DD 20 D5 B3 C0 DE C1 00 00 00 00 00 1A8B:0002 32 36 30 31 30 30 34 38 31 39 33 34 31 30 31 36 1A8B:0003 31 39 34 32 31 32 31 35 58 58 58 58 58 58 58 58
中身の文字コードはShift-JISでフォーマットは次の通りです。
- 0バイト目から2バイト: カードの利用者区分
0x3031
は文字列で"01"のことで、この場合学部生ですね。- 02や03だと修士・博士になります。
- 2バイト目から12バイト: 学籍番号
- 14バイト目から1バイト: 再発行回数
- 15バイト目から1バイト: 性別
- 男性・女性がそれぞれどの値なのかはわかりませんでした。
- 16バイト目から16バイト: 半角カナの氏名
- 32バイト目から8バイト: 学校ID(?)
- 40バイト目から8バイト: カード発行年月日
- 48バイト目から8バイト: カード失効年月日
- 56バイト目から8バイト: カードを作った業者用の管理コード(?)
参考: FCFカードダンプサンプルソフト (下記参照)
なお、京都大学の学生・教職員の方に限りますが、上記のような泥臭い事をしなくてもこのサービスのブロックデータを簡単に読み出せるツールが公開されています。
【学内限定】ICカード読み取りソフト(FCFdumpソフト)
まとめ
今回はfelicalibを利用して学生証の中身を軽く眺めてみました。 普段何気なく利用している魔法のカードもこういう泥臭いことが書いてあるのだと実感できますね。
他のサービスには食堂の利用情報(利用した食堂とプリペイドカードでのチャージ/支払い)が記載されているように見えましたがまだよくわかっていません。今後の課題です。
いよいよKMCアドベントカレンダーも(予定の上では)明日で最終日です。 KMCアドベントカレンダー 2014年12月25日の記事は、 prime (id:PrimeNumber) さんの"Brainf*ck + リフレクション = BFmeta"です。
それでは皆さん良い夜を!メリー・クリスマス!