#はじめに
OpenSCを使ってMIFARE Standardカードからデータを読み出します。
・読み出すためのAPDUコマンドを説明します。
・データの更新コマンドを追記しました。(2019/3/30)
#環境
- OS=Windows10
- ICカード= MIFARE Standard 1K
- カードリーダー=I-O DATA ぴタッチ
- PaSoRi RC-S380 の場合、NFC Port Softwareをアンインストールしないと読み出すことができません・・・(最後のメモに記載)
#OpenSCとは
#MIFARE Standardとは
MIFARE(マイフェア)は、非接触型ICカードの国際通信規格(ISO14443)として標準化され、FeliCaに比べ圧倒的に安価であるため、世界的で最も多く採用され普及している。
MIFARE Standard 1kは、約768バイトのユーザーデータメモリを持ち、それが16のセクタに分かれている。これらのセクタは、AとBと呼ばれる二つの鍵でプロテクトされている。それぞれのセクタに対して、読み込み、書き込み、値の増減などの操作ができる。
1セクタは4ブロックで構成され、1ブロック16バイトで構成される。
※セクタ内の3ブロックはユーザーデータメモリ(DataBlock)で1ブロックは管理用のブロック(
TrailerBlock)。カードの合計メモリサイズは、1block(16byte)×4×16=1,024byte
- 鍵はA、Bともに6Byte。
- デフォルトでは 全てのセクタが鍵A、キーデータ=FF:FF:FF:FF:FF:FF でプロテクトされています。
- したがって何も設定していないカードは鍵に FF:FF:FF:FF:FF:FF を指定することでデータを読み出すことができます。
- ちなみにデータもデフォルト値は全てFFが詰まっています。
#さっそくやってみる
- コマンドプロンプトを立ち上げる。
- opensc-tool.exe のフォルダに移動して以下コマンド実行する。
- opensc-tool.exe -s FF:82:00:00:06:FF:FF:FF:FF:FF:FF
- opensc-tool.exe -s FF:86:00:00:05:01:00:00:60:00
- opensc-tool.exe -s FF:B0:00:00:10
- Received の次の行に出た値(FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF)がブロックデータ(最初のセクタの最初のブロック=ブロック00)です。
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool.exe -s FF:82:00:00:06:FF:FF:FF:FF:FF:FF
Using reader with a card: TOPPAN FORMS TR33MUE014 0
Sending: FF 82 00 00 06 FF FF FF FF FF FF
Received (SW1=0x90, SW2=0x00)
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool.exe -s FF:86:00:00:05:01:00:00:60:00
Using reader with a card: TOPPAN FORMS TR33MUE014 0
Sending: FF 86 00 00 05 01 00 00 60 00
Received (SW1=0x90, SW2=0x00)
C:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool.exe -s FF:B0:00:00:10
Using reader with a card: TOPPAN FORMS TR33MUE014 0
Sending: FF B0 00 00 10
Received (SW1=0x90, SW2=0x00):
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
#概要
- プロテクトを解除するためのキー情報をメモリにロードする(Load Authentication Keys)
- セクタに対して認証を実施し、プロテクトを解除する(Authentication)
- プロテクトが解除されたセクタのブロックデータを読み出す(Read Block Data)
#Load Authentication Keys
- プロテクトを解除するためのキー情報をメモリにロードする
- opensc-tool.exe -s FF:82:00:00:06:FF:FF:FF:FF:FF:FF
##APDUコマンド - Load Authentication Keys
byte no | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | 82 | Load Authentication Keys |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | キーナンバー キーを格納するメモリの番号 ※ |
4 | Le | 06 | キーの長さ 6Byte |
5~11 | Data | FF:FF:FF:FF:FF:FF | キーデータ |
※キーナンバー
一時的なメモリのようです。おそらくリーダなどの仕様によって番号の範囲、クリアされるタイミングが異なるのではないかと思います。とりあえず00指定しておけばOK。
#Authentication
- セクタに対して認証を実施し、プロテクトを解除する
- セクタに対して認証するするのに、指定するのがブロック番号、というところが紛らわしいので注意
- opensc-tool.exe -s FF:86:00:00:05:01:00:00:60:00
##APDUコマンド - Authentication
byte no | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | 86 | Authentication |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | 00固定 |
4 | Le | 05 | データ部の長さ 5byte |
5~10 | Data | 01:00:00:60:00 | データ部(※下参照) |
###※データ部
- データ部には認証の詳細情報をセットします。
- 5バイト
byte no | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | バージョン番号 | 01 | 01固定 |
1 | 00 | 00固定 | |
2 | ブロック番号 | 00 | 認証したいブロックの番号(00~)※ |
3 | キーのタイプ | 60 | 60h = Aキーとして、認証用に使われる。61h = Bキーとして、認証用に使われます。 |
4 | キーナンバー | 00 | Load Authentication Keysで格納したキーのメモリの番号 |
※ブロック番号
セクタの先頭のブロック番号を指定します。
つまり、セクタ番号×4を指定します。
例えばセクタ3の場合は3×4=12(0x0c)と指定します。
#Read Block Data
- プロテクトが解除されたセクタのブロックデータを読み出す
- opensc-tool.exe -s FF:B0:00:00:10
##APDUコマンド - Read Block Data
byte no | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | B0 | Read Block Data |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | 読み出すブロック番号 |
4 | Le | 10 | 読み取りバイト数 10(16byte)固定 |
- ブロック番号は00~で指定します。
- 例えば第2ブロックのデータを読み出したい場合は FF:B0:00:01:10 と指定します。
- Read Block Dataコマンドにセクタ番号はありません。第2セクタのブロック1を指定する場合はブロック番号に04と指定します。(1セクタ=4ブロックで構成される)
#追記:データ書き込み時
- プロテクトを解除するためのキー情報をメモリにロードする(Load Authentication Keys)
- セクタに対して認証を実施し、プロテクトを解除する(Authentication)
- プロテクトが解除されたセクタのブロックデータを更新する(Update Binary Blocks)
##APDUコマンド - Update Binary Blocks
byte no | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | D6 | Update Binary |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | ブロック番号 |
4 | Le | 10 | 更新バイト数 10(16byte)固定 |
5 | DATA | データブロック(16byte) |
- ブロック番号は00~で指定します。
- 例えば第2ブロックのデータを更新したい場合は FF:D6:00:01:10:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD:EE:FF と指定します。
- Update Binary Blocksコマンドにセクタ番号はありません。第2セクタの第1ブロックを指定する場合はブロック番号に04と指定します。(1セクタ=4ブロックで構成される)
#参考
以下サイトを参考にしました。
- Wiki MIFARE
- Mifareとは?
- KeyAとKeyB
- Mifareの基礎知識
- ACM1252U-Z2 – リファレンスマニュアル 5.5. MIFARE® Classic (1K/4K)メモリカードのPICCコマンド 【P35】
#メモ
- PaSoRi RC-S380ではNFC Port Softwareをアンインストールしないとエラーになります。
- 具体的には、Load Authentication Keys⇒Authenticationコマンドは正常終了するが、Read Block Dataで戻り値が SW1=0x69, SW2=0x82 となる。このエラーステータスはここによると『セキュリティステータスが満足されない。』とのこと。どうやらAuthentication状態がNFC Port Softwareによって勝手にリセットされてしまうようだ。