学生証を読む。TuT

この記事は TUT Advent Calendar 2016 21日目の記事です。

12/3の[TuT休講情報をより見やすく便利に!]に続き、Advent Calendar 2016に2度目の登場です。今日のAdventCalendarは埋まった気がするのですが…2日前になっても空いてたので入っちゃいました(・ω・)

 

はじめに

TuT(豊橋技術科学大学)では、学生証を利用して出欠の管理や図書館の入退出管理、学生証を電子マネーとして利用することができます。この電子マネー機能を用いて大学内の学食やコンビニなどで買い物ができます。(むっちゃ便利でいいシステムです。

自分は家計簿をつけているのですが、その際に学生証の利用履歴が見れたら便利だな〜と思って、学生証のnfc機能についてゴニョゴニョ調べてみました。(SuicaはスマホやPCのnfcリーダを通して利用履歴や残高が参照できることが知られています。

NFCリーダーで学生証を読む

 

環境構築

以前、pythonからnfcを利用したことがあったので、環境構築はこちら「Pythonで遊んでみる -part2- (NFCを使ってみる)」を参照してください。

以下が利用した環境になります。

  • Mac OS X (10.12.1) Sierra
  • Python 2.7.8 (Anaconda 2.1.0)
    • Python環境はpyenvで導入したanaconda-2.1.0の環境を利用しました。
      これは、nfcを利用するnfcpyがPython2.Xにしか対応していないためです。
  • nfcpy
    pythonからnfcを利用するためのものです。ついでにサンプルプログラムなどが入っています。

 

データ解説

誰得かわかりませんが…学生証から読み取れたデータをドンドン解説していきたいと思います。

インストールしたnfcpyのnfcpy/examples/tagtool.py を利用して取得したデータです。これを利用すると、カードの情報から中に書かれている情報を取得していい感じに取得してくれます。

nfcpyの使い方は公式ドキュメントを参照: Python module for near field communication — nfcpy latest documentation

python tagtool.py -v show
# ちょっとだけ時間がかかる。

※個人情報を含む部分は大文字の$に置換しました用いました。取得したデータに‘$’文字は1文字も含まれません。

Type3Tag 'FeliCa Standard (RC-S962)' ID=01100700$$$$$$$$ PMM=0120220$$$$$$$$$ SYS=8FA9
Memory Dump:
 System 8FA9 (unknown)
 Area 0000--FFFE
 Area 1000--10FF
 Random Service 64: write with key & read with key (0x1008 0x100A)
 Cyclic Service 64: write with key & read with key (0x100C 0x100E)
 Purse Service 64: direct with key & cashback with key & decrement with key & read with key (0x1010 0x1012 0x1014 0x1016)
 Area 1200--12FF
 Random Service 72: write with key & read with key (0x1208 0x120A)
 Cyclic Service 72: write with key & read w/o key (0x120C 0x120F)
 0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 000A: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 Purse Service 72: direct with key & cashback with key & decrement with key & read w/o key (0x1210 0x1212 0x1214 0x1217)
 0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 0002: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 Random Service 73: write with key & read with key (0x1248 0x124A)
 Random Service 74: write with key & read with key (0x1288 0x128A)
 Area 2000--20FF
 Random Service 128: write with key & read w/o key (0x2008 0x200B)
 0000: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
 0001: 31 31 36 33 $$ $$ $$ 30 30 30 30 30 30 30 30 30 |1163$$$000000000|
 0002: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
 * 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
 0008: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 |0000000000000000|
 Area 4000--40FF
 Random Service 256: write with key & read with key (0x4008 0x400A)
 Random Service 257: write with key (0x4048)
 System FE00 (Common Area)
 Area 0000--FFFE
 Area 1A80--1AFF
 Area 1A81--1AFF
 Random Service 106: write with key & read w/o key (0x1A88 0x1A8B)
 0000: 30 31 31 31 36 33 $$ $$ $$ 30 30 00 00 00 30 30 |011163$$$00...00|
 0001: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 0002: 32 $$ 30 $$ 30 $$ 38 $$ 00 00 00 00 00 00 00 00 |2$0$0$8$........|
 0003: 00 00 00 00 00 00 00 00 $$ 30 $$ 46 $$ 36 $$ 38 |........$0$F$6$8|
 Area 1B00--1B3F
 Area 1B01--1B3F
 Random Service 108: write with key & read with key (0x1B08 0x1B0A)
 Area 1B40--1B7F
 Area 1B41--1B7F
 Random Service 109: write with key & read with key (0x1B48 0x1B4A)
 Area 42C0--42FF
 Area 42C1--42FF
 Random Service 267: write with key & read with key (0x42C8 0x42CA)
 Area 4300--433F
 Area 4301--433F
 Random Service 268: write with key & read with key (0x4308 0x430A)
 Area 4340--437F
 Area 4341--437F
 Random Service 269: write with key & read w/o key (0x4348 0x434B)
 0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
 0003: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

…なんだかよくわからんデータがいっぱい。。。

この取得したデータについて、FeliCaカード ユーザーズマニュアルを見ながら読んでいきました。
このユーザーズマニュアルは利用規約に「文章の全部又は一部を..ウェブサイトにアップロードなどしないで」的なことが書かれているので、読んで自分が理解した内容をまとめる形で書いていきたいと思います。

このユーザーズマニュアルが読み取ったデータと照らし合わせながら読むと面白かったので、時間がある方は試してみるといいと思います。

 

以後、[リーダ/ライタ ]を[リーダ]と表現します。

 

データ解説

取得したデータについて、意味の有りそうな?重要そうな?以下の画像の部分について解説していきたいと思います。

以下の画像のオレンジ枠が解説した行数で、赤枠がその中でも特に重要であると考えた箇所です。

 

1行目

NFCリーダ最初にPollingコマンドを実行し、そのレスポンスが帰ってきます。その情報が1行目に記載されています。

Type3Tag ‘FeliCa Standard (RC-S962)’ ID=01100700$$$$$$$$ PMM=0120220$$$$$$$$$ SYS=8FA9

  • Type3Tag
    [近距離無線通信 – Wikipedia / 2016.12.7]の記載によると、
    NFCフォーラムが定めた仕様のうち、リーダー/ライターモードのType3(Felica)を指すものです。
  • Felica Standart (RC-S962)
    リーダの情報…だとおもったのですが、利用しているリーダは「RC-S370」です。ちょっと違う。何かあるのかな…?
    amazonさんで2016/12/8現在, 7980円です。http://amzn.to/2gkOY89
    たぶん?上位互換のRC-S380が2,538円で売られています。http://amzn.to/2h6Ppns
  • ID (IDm)
    IDmは製造IDでリーダが通信相手のカードを特定するために用いるコードです。
  • PMM (PMm)
    8バイトで構成された製造パラメータ。
    上位2バイトはICコード(製品を特定するためのもの)
    下位6バイトは最大応答時間パラメータを指します。
    これは、命令がタイムアウトするまでの時間を定めたものです。
  • SYS (System Codeを表す?)
    ちょっとわからないですが。3行目にあるコードと同じなので、カードの先頭にあるSystem Codeの値なのかな?
3行目 (30行目)

System 8FA9 (unknown),  System FE00 (Common Area)

FeliCaのファイルシステムは外側から

[システム > エリア > サービス > ブロック]

の順になっています。このうち、Systemを指定しています。このSystemを複数用意することで、1枚のカードに複数の情報(機能?)を持たせることができます。(EdyとSuicaを同じカードに!的な事なのかな? 携帯なんかであるタイプ?

8FA9やFE00はデータの始まりのポインタ的なものをを指していると思われます。

 

4,5行目 (など)
Area 0000--FFFE
  Area 1000--10FF

ファイルシステムのうち、システムの次の階層、エリアを指しています。エリアはメモリ領域の使用可能なブロック数やサービスのブロック数を示します。このエリアについては、入れ子にすることができます。

Area の後に続くのはそのエリア内で利用できるサービスの番号と思われます。外側のArea 0000–FFFEは使える範囲すべてを指定しています。

 

6,7,8行目(など)
 Random Service 64: write with key & read with key (0x1008 0x100A)
 Cyclic Service 64: write with key & read with key (0x100C 0x100E)
 Purse Service 64: direct with key & cashback with key & decrement with key & read with key (0x1010 0x1012 0x1014 0x1016)

これらはサービスを示します実際に記述されている2バイトのコードが最後の( )に入っている部分でサービスコードと呼ばれます。上位10ビットがサービス番号、下位6ビットがサービス属性を指します。

上記3つのサービスについては、だいたい以下のような感じです。

サービス名 サービス属性 用途
Random Service ランダムサービス ユーザが自由にブロックを指定してアクセス可能なサービス
Cyclic Service サイクリックサービス ログの記録を主としたサービス。
一番古いデータに対して書き込みが行われ、古いデータから更新される
Purse Service パースサービス ブロックデータの一部を正の数値として、その値を減算する機能を持つ。

料金徴収に主として使う。

ブロックとは、FeliCaカードでのデータ単位で16バイト1ブロックとなっています。

また、それぞれのサービス属性についてアクセス権があります。

例: 0x100A

サービス番号 <- | -> サービス属性

0001000000 | 001010 (進数表記

右側001010のサービス属性は「リードオンリーアクセス」について、「認証が必要である」ことを示します。

pythonさんがそこら辺をいい感じに見やすくして左側に[read with key]とか表示してくれています。

 

12~14行目

0000: 00 00 ….

データです。1行に1ブロック、16バイト分のデータが表示されています。また、| の右側 …. は対応する1バイト分のデータをASCIIコードで解釈したさいの文字列を示します。

アクセス権について、[read w/o key]の指定があると読み出せるようで、値を表示してくれます。

 

23行目

0001: 31 31 36 33 $$ $$ $$ 30 30 30 30 30 30 30 30 30 |1163$$$000000000|

こちらも、データ行ですが…学籍番号のデータです!最初に謎の1が入っていますが、163…は自分の学籍番号(16年3年次編入を指す)です。$$$の部分には、自分の学籍番号が記述されています。

ちなみに、大学のチャージ機に学生証を入れると、1163…..と謎の1が挿入された状態でデータが出てきます。なんで、とりあえず大学のチャージ機はこちらの値を利用しているのだなぁと。

チャージ機にカードを入れた際に表示される情報

 

35行目

0000: 30 31 31 31 36 33 $$ $$ $$ 30 30 00 00 00 30 30 |011163$$$00…00|

再びでてきました!学籍番号。今度は謎の011163と011が付加されています。この011は不明ですが(学部のBかな?)…こちらもしっかり学籍番号です。

 

37,38行目

0002: 32 $$ 30 $$ 30 $$ 38 $$ 00 00 00 00 00 00 00 00 |2$0$0$8$……..|
0003: 00 00 00 00 00 00 00 00 $$ 30 $$ 46 $$ 36 $$ 38 |……..$0$F$6$8|

上記と同じデータ領域に書かれたデータですが…謎です謎なデータでどこに個人情報が含まれているのかわからないので、適当に$で伏せておきました。

このデータについて、10進数への変換や2進数、ASCIIコードへの変換など…いろいろやってみましたが、意味はわかりませんでした。とりあえず、クラスメイトのカードで試した際にも同じ文字列が出てきたので、誕生日などのデータではないことは確かです。

カード発行日とか保証金?とかかな。

 

39行目以降

なんだかすごい階層が深くなって、さらに全部読めないデータです。

最後のデータだけ読めますが、全て0なのでデータは無いのかと。。。

 

考察

各データの内容について考察してみました。すべて妄想です。正確にはパスワードを調べて中身を見てみたりしないとわかりませんが、完全にアウトなのでそんなことはしません。

  • システム領域について
    • System 8FA9領域が学生の授業以外のデータ?(お金とかの残高・利用履歴)
    • System FE00 (Common Area)が授業に関する情報ではないかと妄想しています。
  • 授業に関する情報?System FE00の方には、Cyclic Serciceのサービス属性が無いので、カード自体は出欠席のリーダーにかざしたログなどを持っていないのでは無いかと思われます。
  • 最初の方の、プライベートなデータ(Area 1000–10FF)
    00-FFで256ブロックを指している?と思われます。1ブロック16バイトなので、4096バイトのデータ領域かな?

    • Cyclic Sercice にカードの利用履歴
      1ブロックあたり、取引1つ分のデータ([4バイト]日付、[2バイト]支払い(金額)、[2バイト]チャージ(金額)、[2バイト]残高、[6バイト(以内)]取引端末)とかが入ってるんじゃないでしょうか?
      学生証に入る金額の上限が1万円だったと思うので、14ビットあれば足りますが、キリの良い2バイトで。端末情報が0001-02みたいな形式を取っているので、上下でそれぞれ数値型で与えれば十分に足りそうです。

      情報取得時のカードの情報(一部加工)

    • Purse Service に残高情報?
      データ形式がよくわからんですが、2バイトあれば十分かと。これが内部で減算されるようになってるわけですね〜

とまぁ、こんな感じですかね〜。ぜんぶ妄想ですが。

 

ちょっと話はそれますが…。NFCの情報が鍵ファイル?によって保護されていることがわかりました。もし、これを無理やり開けようとしたら、情報端末にPCのNFCリーダーを学生証のように偽装して、その際の通信を解析して…

って流れになると考えられます(絶対にやりません)。出欠管理端末はかざすタイプなのでそれが可能かもしれませんが、カードへのチャージや残高の照会などは基本的に学生証を機械の中に入れなければできません。これは、そのようなハッキング対策なのかな〜と自分で関心してました。(駅のSuicaもチャージなどは基本的に機械に挿入するタイプ

全然詳しくないですが、↑のことをすると犯罪になると思われます。そーゆーことは絶対にしません。(怖いので…。
あくまで、通常の手法でアクセスできる範囲に限ってゴニョゴニョしてます。

Suicaの利用履歴がスマホアプリからなどで簡単に取得できるのは、鍵を利用しなくてもユーザが読める領域に利用履歴が保存されているからです。これはアプリなどから読めるようにと配慮されているのだと思います。(さすが!!!
さらに、残高などの情報はもちろん書き換えられない場所に書かれたり、サーバで管理されているものと思われます。

 

まとめ

大学学生証のデータを読んでみました。学籍番号が取れるのはちょっとおもしろい発見だったな〜と思いつつも、学生証の残額やチャージ履歴などが見れないのはちょっと残念です。

それでも、いろいろ調べながら作業をして自分のスキルアップに繋がたのではないかと思います。

明日は je6bmq さんが 「何か書く(がんばる)」について?書いてくれるそうです。Advent Calendarも残すところあと4日。どの記事も楽しみです^^

 

雑談

3日目のAdventCalendarでは大学の休講ページが新しくなって個人的には使いにくくなったから頑張って…って記事を書きました。ですが、現在では再び以前のような登録されている情報を一括で表示してくれるページがPC用ページとして復活していますね(;´∀`)

それでも制作したアプリでは絞り込み機能とかあるんで、ちょっとは便利だと思いますが…。あの使いにくいサイトで無理やり頑張った努力は…なんだったのでしょうw

 

現在大学は卒研発表シーズン真っ盛り。来年の自分は何を発表するんですかね〜

それでは、また来年(・ω・)ノシ

2 thoughts on “学生証を読む。TuT

  1. 813

    > ちなみに、大学のチャージ機に学生証を入れると、1163…..と謎の1が挿入された状態でデータが出てきます。

    謎の1はもしかするとカードの発行回数かもしれませんね

    1. takunoko Post author

      ありそうですね。
      学生証を再発行した人の番号を見ればすぐに分かりそうです!

      ただ、もし発行回数が10回を超えると…無いですかねw

takunoko へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください