うちの大学の学生証の仕様を考える
やぁ
この記事ではFelicaの学生証の秘密を見ていこうと思う
筆者は最近FelicaやNFCに関する勉強を始めたため、至らぬ点があることどうかご理解いただきたい
WARNING!!
わざわざ赤字で警告してやっているんだ、駄文多めである。
腹ごなしに書いていないと長文かけないのでめんどい人は流行りのChat GPTにでも文章入れて要約して読んでくれ。
また駄文には様々な無駄な話やコンプラ的にアレな内容があるかもしれないので心してみるように
正直、嘘を嘘と見抜ける人に読んでほしい
ありとあらゆるNFC
NFCとはNear Field Communicationのことである。
めちゃくちゃ弱い電波を使ってめっちゃ近い距離だけで通信を行う技術である。
ガラケーでいうなら赤外線通信みたいなもん
3DSでいうならすれ違い通信?
企業戦士の方々が毎日使うSuica、Pasmo
でもNFCは0~10cm程度の距離でしか通信できない。
そこらへんが普通の通信とは違うところ。
主にクレジットカード、交通系ICカードやらに使われ、ゲームだと任天堂のAmiiboに使われている
ちなみに似たような技術でRFIDというものがあるが厳密にいえば一緒だしちょっと違う。
RFIDの通信範囲は0~20m程度と若干広めである。そして使われる電波の周波数も違う。
そして読み取りに使われる機械がお高い。主にクリーニング屋のリネンタグとかユニクロの会計の時のかごをドカーンと入れると会計してくれるやつとか商品を会計せずに持ってい行くとビービー鳴るあのスーパーにあるあのゲートに使われている。
みんな大好きFelicaとは
Felicaは別名TYPE-Fと呼ばれる。
またPaSoRiとも呼ばれる。(これはリーダーの名前らしい)
だいぶややこしい。
でもここではFelicaという名前を使う。そんな感じ
まずFelicaはSonyが独自開発したNFCである。
Felicaは超短距離の通信しかできないので、NFCの部類になる。
ちなみにNFCはFelica以外にTYPE-AとTYPE-Bというものがある。オメーUSBみてーだな
という突っ込みはさておき、FelicaはTYPE-AやBより優れている点がある。
1.暗号化が標準搭載、セキュアである
2.通信速度が速い
3.電気が流れてから起動するまでが早い
だがメリットがあればデメリットもある。
デメリットは
1.通信速度が速いことが災いしてSonyの純正アクセサリでしかすべてのメモリを読み込めない
2.カード一枚が高い
3.リーダーが高い
もちろんSonyの独占市場なのですべてにおいてむちゃ高いです。
まあそれがマイナンバーカードやら運転免許証やらに入っていますから、電子レンジでチンする陰謀論者が出てくるのも無理はないと思います。(いや、チンすんなよ)
ちなみに意図して運転免許証を遺失・盗難・汚損・破損した場合は、住所地を管轄する運転免許試験場でその旨を申し出れば、即日再交付または後日再交付が可能らしい。もちろん手数料はかかります。(wiki引用)
また、ICチップが入った運転免許証は2010年から始まってたらしい。(これもwiki引用)
使用しよう
まず、Felicaの使い方についてだがSonyの公式からは限られたソフトウェアとドライバしか配布されていない。
なので詳細な中身を確認できないのである。
中身を見るためのツールをある程度自作しなければならない。
さようならプログラミングできない人
ようこそプログラミングできる人
いうて簡単なので適当にググってやってみてほしい
pythonでnfcpyというライブラリを使うだけで簡単にいける。
あとはSony純正のカードリーダーが必要である。
メルカリで1000円程度で手に入る。
以下にサンプルコードを書いておく。
import nfc import time def connected(tag): print("dump felica.") print(' ' + '\n '.join(tag.dump())) while True: with nfc.ContactlessFrontend('usb') as m: tag = m.connect(rdwr={'on-connect': connected}) print(tag) time.sleep(5) print("\n")
もちろんこれを動かすためにはwindowsでは特別なドライバを充てる必要があるし、pipコマンド使ってnfcpyを入れる必要がある。やり方はググったら出てくるので割愛。
さて読み込まれたときに注目してほしいことはFelicaにも何種類かカードがあることである。
1.FeliCa Standard SD1(RC-S100) ... 一番ベーシックなやつである
2.FeliCa Standard SD2(RC-S120) ...
一番ベーシックなやつである、エラーチェックが強化されている
3.Felica Lite-S (RC-S966) ... 軽量+安価版、メモリが少ない代わりに安い
あとコイン型もあるけど中身は一緒なので割愛。
この中で21年入学、22年入学、23年入学で比べてみる。
まず型から。
21年、22年はFelica Standardである。
ちなみにSD1だと思われる。本当かはよくわからん。取り合えず、RC-SA00/1って書いてあるので、SD1だと思い込むようにする。
23年だけFelica Lite-Sである。ちゃんとRC-S966と書いてある。
//21、22年の人たちのやつ Type3Tag 'FeliCa Standard (RC-SA00/1)' ID=0000000000000000 PMM=0000000000000000 SYS=0000 //23年の人たちのやつ Type3Tag 'FeliCa Lite-S (RC-S966)' ID=0000000000000000 PMM=0000000000000000 SYS=0000
一応、個人の特定につながりそうなのでIDとPMMとSYSは伏せておく
SYSはカードのカテゴライズをするための番号だが、まあ自分の見ればわかるしいいっか、と勝手に思って載せないことにする
バイナリーを勉強する
さて筆者はバイナリーがよくわからぬ
正直、バイナリエディタを見たときに横に出てくる謎の文字もさらに意味が分からぬ
長年arduinoをいじっているはずなのになぜだかバイナリーコードと相性が悪い
なので寄り道がてら勉強しようと思う。
知ってる人は読み飛ばせ
まず英語の「Binary」は二進数のことで、二進数とは0と1を使った数字である。
略して「bin」ビンビンビン
ちなみに10進数は「Decimal」略して「dec」
16進数は「Hexadecimal」略して「hex」である。
さて実際のバイナリーコードを見てみよう。
「34 30 33 31 35 32 32 30 32 30 33 35 32 3f 37 31」
上の数字は学生証内から一部を抜粋したものだ。
まず最初に2文字ずつ分裂している。これはASCIIコードってやつだ。
アスキーコードって読みます。意味わからんて?思った?
じつはめちゃんこ簡単なので読み進めてほしい。
ASCIIコードはASCIIコード表を参照するだけでわかる。
上位ビットは2桁あるバイナリコードの最初の文字である。
逆に下位ビットは後ろのほうの文字である。
例にすると、「32」というバイナリがあったときに上位が「3」で下位が「2」である。
これを踏まえて以下を翻訳すると、
「34 30 33 31 35 32 32 30 32 30 33 35 32 3f 37 31」は
「4 0 3 1 5 2 2 0 2 0 3 5 ? 8 7 1」になる
これで君もバイナリコードマスターだ。
これ以外に1~2byteの文字を扱うマルチバイト文字コードというものがある。
ちなみにここには半角のカタカナが入っており、なんかカタカナも出せるらしい。
詳しくは言わない。使わないから。
結論
結論としては数字の法則性が説くことができなかったため、半分あきらめモードである。
「いかがでしたか?」とか書くとクソブログと酷評されかねないので一応法則性?ヒント?的なものを書くとする。
もし、カードの内部情報から学生番号を引き出すのならサービスコード952か953の0002がなんだかパターン的な連番になってるぽいのでそこら辺から割り出せそうとか思ったりした。
ちなみに筆者はこれを書いた後に入退室管理システムを作ろうと思うが、予測方法がわからない。仕方がないので、とりあえずPMMとIDとSYSからカードを判断して、登録されていないものだけを学籍番号を要求して入力させる方式にしようと思う。
この方法は面倒だし、他ブログでは「まだIDmで消耗してるの?」と煽られる始末(ブチギレ)なので何も考えずに焦げ付こうと思う。
(めっちゃいいブログだったのでぜひ読んでください)
一応、それ以外のリスクとしてはID、PMM、SYSはFelicaのエミュレートモードから突破ができるため、仕組みばれた時点で(実装した時点でも)ゼロデイ状態になってしまうためやることはお勧めしない。
以上!
宣伝
ぜひこのブログを見てこんな頭のおかしい奴がいるのかと思った人がいたらぜひMake
it!サークルに来てみてほしい。
コメント
コメントを投稿