はじめに
WindowsでOpenSCを使う(3.MIFARE Classicブロックデータ読み出し編①)の続きです。
そもそもMIFARE Classicとは?前回使用したコマンドの意味は?KeyA、KeyBとは何?
一つずつ解説していきましょう。
MIFARE Classicとは
概要
NFC規格ISO/IEC 14443 Type A(Mifare)の一種。
シンプルなメモリーカードであるが、メモリー全体はセクターに分かれ、
各セクターはブロックに分かれています。
各セクターごとに48ビット長の暗号鍵が二組(AとB)用意され、
Aのみ、またはAとBの組を使用して各領域をプロテクトできるようになっています。
ICに対するコマンドとしては、各ブロックに対して読み込み、書き込み、値の増減などが用意されています。
種類
総メモリ空間のバイト数でMIFARE Classic 1k、MIFARE Classic 4k、MIFARE Classic miniに分類されます。
分類 | 総メモリー空間 | 実メモリー | 実メモリー中の ユーザー領域 |
全体のセクター数 | 各セクターのブロック数 | 1ブロック |
---|---|---|---|---|---|---|
1k | 1024 byte |
768 byte |
752 byte |
16 | 4 | 16 byte |
4k | 4096 byte |
3456 byte |
3440 byte |
40 | セクター0~31:4 セクター32~39:16 |
16byte |
mini | 320 byte |
240 byte |
224 byte |
5 | 4 | 16 byte |
KeyA、KeyBとは?
ブロックデータをプロテクトするための暗号キーです。
デフォルトではFF:FF:FF:FF:FF:FF
が設定されています。
指定されたキーがある場合、
Load Authentication Keysコマンドでキーを指定しないとデータを読み出すことができません。
また、Authenticationコマンドを使用する際にも、KeyA、KeyBのどちらを使用するか指定する必要があります。
MIFARE Classicのデータ構造説明
下の画像はMIFARE Classic 1Kのデータ構造です。
セクターの使われ方
分類 | Manufacturer block | データブロック | セクタートレーラー |
---|---|---|---|
1k/mini | セクター0のブロック0 32ビットのNUIDを含む、リードオンリーのカード情報が記録されている。 |
各セクターのブロック0から2まで (セクター0のみブロック1と2) |
各セクターのブロック3 Key A/Bとアクセス条件が記録されている。 |
4k | セクター0のブロック0 32ビットのNUIDを含む、リードオンリーのカード情報が記録されている。 |
各セクターのブロック0から2または14まで (セクター0のみブロック1と2) |
各セクターのブロック3または15 Key A/Bとアクセス条件が記録されている。 |
コマンド解説
上記のMIFARE Classicのデータ構造説明の画像を見ながら、各コマンドについて見ていきましょう。
Load Authentication Keysコマンド解説
FF:82:00:00:06:FF:FF:FF:FF:FF:FF
コマンドで、プロテクトを解除するためのキー情報をメモリにロードします。
ISO 7816におけるコマンドのフォーマットはこれ。
ヘッダー | ボディ | ||||
---|---|---|---|---|---|
CLA | INS | P1 | P2 | Le | データ |
byte No | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス。FF固定。 |
1 | INS | 82 | Load Authentication Keys |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | キーナンバー。キーを格納するメモリの番号。 |
4 | Le | 06 | キーの長さ。キーのバイト数。 |
5~11 | Data | FF:FF:FF:FF:FF:FF | キーデータ。キーのデータ。 |
byte No.3は指定されたKeyAまたはKeyBを格納する一時的なメモリ?です。00固定で良いようです。
byte No.4は指定されたKeyAまたはKeyBのバイト数です。
byte No.5~11のキーデータは指定されたKeyAまたはKeyB。この時点ではKeyAとKeyBのどちらを使用するなどは指定しなくても良いです。
Authenticationコマンド解説
FF:86:00:00:05:01:00:00:60:00
コマンドで、セクタに対して認証を実施し、プロテクトを解除します。
ISO 7816におけるコマンドのフォーマットはこれ。
ヘッダー | ボディ | ||||
---|---|---|---|---|---|
CLA | INS | P1 | P2 | Le | データ |
byte No | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス。FF固定。 |
1 | INS | 86 | Authentication |
2 | P1 | 00 | 00固定 |
3 | P2 | 00 | 00固定 |
4 | Le | 05 | データ部の長さ。5byte。 |
5 | 【データ部】 バージョン番号 |
01 | 01固定 |
6 | 【データ部】 - |
01 | 00固定 |
7 | 【データ部】 ブロック番号 |
00 | 認証したいセクタの先頭のブロック番号。 |
8 | 【データ部】 キーのタイプ |
60 | KeyAを使うかKeyBを使うかを指定します。 Aは60、Bは61です。 |
9 | 【データ部】 キーナンバー |
00 | Load Authentication Keysの byte No3で指定したキーのメモリの番号 |
byte No.7について、MIFARE Classicのデータ構造説明の画像を見てみましょう。
指定した値が00ということは、セクター0のブロック0を指定しています。
画像を見ると、1セクターに4つブロックが存在するので、セクター番号×4を指定することになります。
例えば、セクター3のデータを認証したい場合は3×4で12を指定します。
byte No.8について、今回は60を指定しているので、KeyAを使用していることがわかります。
Read Block Dataコマンド解説
FF:B0:00:01:10
コマンドで、プロテクトが解除されたセクタのブロックデータを読み出します。
ISO 7816におけるコマンドのフォーマットはこれ。
ヘッダー | ボディ | |||
---|---|---|---|---|
CLA | INS | P1 | P2 | Le |
byte No | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | B0 | Read Block Data |
2 | P1 | 00 | 00固定 |
3 | P2 | 01 | 読み出すブロック番号。 |
4 | Le | 10 | 読み取りバイト数。10(16byte)固定。 |
参考サイト
WindowsでOpenSCを使ってMIFARE Standard(Classic)カードデータを読み出す方法
Mifareの基礎知識
Android入門 MifareClassicの認証に関して
ISO/IEC 14443 Type A(Mifare)
MIFARE Classic
NFC FORUM
mifare classic 1k/4k user manual - SonMicro
関連ページ
WindowsでOpenSCを使う(1.準備編)
WindowsでOpenSCを使う(2.カードのIDm確認編)
WindowsでOpenSCを使う(3.MIFARE Classicブロックデータ読み出し編①)