WindowsでOpenSCを使う（3.MIFARE Classicブロックデータ読み出し編②）

# はじめに
[WindowsでOpenSCを使う（3.MIFARE Classicブロックデータ読み出し編①）](https://qiita.com/erik_t/items/9eb14d689870004596bb)の続きです。
そもそも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に分類されます。

<table border="1">
    <tr>
        <th>分類</th><th>総メモリー空間</th><th>実メモリー</th><th>実メモリー中の<br>ユーザー領域</th><th>全体のセクター数</th><th>各セクターのブロック数</th><th>1ブロック</th>
    </tr>
    <tr>
        <td>1k</td><td>1024<br>byte</td><td>768<br>byte</td><td>752<br>byte</td><td>16</td><td>4</td><td>16<br>byte</td>
    </tr>
    <tr>
        <td>4k</td><td>4096<br>byte</td><td>3456<br>byte</td><td>3440<br>byte</td><td>40</td><td>セクター0～31:4<br>セクター32～39:16</td><td>16byte</td>
    </tr>
    <tr>
        <td>mini</td><td>320<br>byte</td><td>240<br>byte</td><td>224<br>byte</td><td>5</td><td>4</td><td>16<br>byte</td>
    </tr>
</table>

# KeyA、KeyBとは？
ブロックデータをプロテクトするための暗号キーです。
デフォルトでは`FF:FF:FF:FF:FF:FF`が設定されています。
指定されたキーがある場合、
Load Authentication Keysコマンドでキーを指定しないとデータを読み出すことができません。
また、Authenticationコマンドを使用する際にも、KeyA、KeyBのどちらを使用するか指定する必要があります。

# MIFARE Classicのデータ構造説明

下の画像はMIFARE Classic 1Kのデータ構造です。
![mifare1kmemoryorganization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409907/82cd9bc3-f445-d67e-3038-47a89e0879b6.png)

## セクターの使われ方

<table border="1">
    <tr>
        <th>分類</th><th>Manufacturer block</th><th>データブロック</th><th>セクタートレーラー</th>
    </tr>
    <tr>
        <td>1k/mini</td><td>セクター0のブロック0<br>32ビットのNUIDを含む、リードオンリーのカード情報が記録されている。</td><td>各セクターのブロック0から2まで<br>(セクター0のみブロック1と2)</td><td>各セクターのブロック3<br>Key A/Bとアクセス条件が記録されている。</td>
    </tr>
    <tr>
        <td>4k</td><td>セクター0のブロック0<br>32ビットのNUIDを含む、リードオンリーのカード情報が記録されている。</td><td>各セクターのブロック0から2または14まで<br>(セクター0のみブロック1と2)</td><td>各セクターのブロック3または15<br>Key A/Bとアクセス条件が記録されている。</td>
    </tr>
</table>

# コマンド解説
上記のMIFARE Classicのデータ構造説明の画像を見ながら、各コマンドについて見ていきましょう。

## Load Authentication Keysコマンド解説
`FF:82:00:00:06:FF:FF:FF:FF:FF:FF`コマンドで、プロテクトを解除するためのキー情報をメモリにロードします。

ISO 7816におけるコマンドのフォーマットはこれ。

<table border="1">
    <tr>
        <th colspan="4" style="text-align:center">ヘッダー</th><th colspan="2" style="text-align:center">ボディ</th>
    </tr>
    <tr>
        <td>CLA</td><td>INS</td><td>P1</td><td>P2</td><td>Le</td><td>データ</td>
    </tr>
</table>

<table border="1">
    <tr>
        <th>byte No</th><th>項目名</th><th>指定値</th><th>説明</th>
    </tr>
    <tr>
        <td>0</td><td>CLA</td><td>FF</td><td>命令クラス。FF固定。</td>
    </tr>
    <tr>
        <td>1</td><td>INS</td><td>82</td><td>Load Authentication Keys</td>
    </tr>
    <tr>
        <td>2</td><td>P1</td><td>00</td><td>00固定</td>
    </tr>
    <tr>
        <td>3</td><td>P2</td><td>00</td><td>キーナンバー。キーを格納するメモリの番号。</td>
    </tr>
    <tr>
        <td>4</td><td>Le</td><td>06</td><td>キーの長さ。キーのバイト数。</td>
    </tr>
    <tr>
        <td>5～11</td><td>Data</td><td>FF:FF:FF:FF:FF:FF</td><td>キーデータ。キーのデータ。</td>
    </tr>
</table>

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におけるコマンドのフォーマットはこれ。

<table border="1">
    <tr>
        <th colspan="4" style="text-align:center">ヘッダー</th><th colspan="2" style="text-align:center">ボディ</th>
    </tr>
    <tr>
        <td>CLA</td><td>INS</td><td>P1</td><td>P2</td><td>Le</td><td>データ</td>
    </tr>
</table>

<table border="1">
    <tr>
        <th>byte No</th><th>項目名</th><th>指定値</th><th>説明</th>
    </tr>
    <tr>
        <td>0</td><td>CLA</td><td>FF</td><td>命令クラス。FF固定。</td>
    </tr>
    <tr>
        <td>1</td><td>INS</td><td>86</td><td>Authentication</td>
    </tr>
    <tr>
        <td>2</td><td>P1</td><td>00</td><td>00固定</td>
    </tr>
    <tr>
        <td>3</td><td>P2</td><td>00</td><td>00固定</td>
    </tr>
    <tr>
        <td>4</td><td>Le</td><td>05</td><td>データ部の長さ。5byte。</td>
    </tr>
    <tr>
        <td>5</td><td>【データ部】<br>バージョン番号</td><td>01</td><td>01固定</td>
    </tr>
    <tr>
        <td>6</td><td>【データ部】<br>-</td><td>01</td><td>00固定</td>
    </tr>
    <tr>
        <td>7</td><td>【データ部】<br>ブロック番号</td><td>00</td><td>認証したいセクタの先頭のブロック番号。</td>
    </tr>
    <tr>
        <td>8</td><td>【データ部】<br>キーのタイプ</td><td>60</td><td>KeyAを使うかKeyBを使うかを指定します。<br>Aは60、Bは61です。</td>
    </tr>
    <tr>
        <td>9</td><td>【データ部】<br>キーナンバー</td><td>00</td><td>Load Authentication Keysの<br>byte No3で指定したキーのメモリの番号</td>
    </tr>
</table>

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におけるコマンドのフォーマットはこれ。

<table border="1">
    <tr>
        <th colspan="4" style="text-align:center">ヘッダー</th><th>ボディ</th>
    </tr>
    <tr>
        <td>CLA</td><td>INS</td><td>P1</td><td>P2</td><td>Le</td>
    </tr>
</table>

<table border="1">
    <tr>
        <th>byte No</th><th>項目名</th><th>指定値</th><th>説明</th>
    </tr>
    <tr>
        <td>0</td><td>CLA</td><td>FF</td><td>命令クラス FF固定</td>
    </tr>
    <tr>
        <td>1</td><td>INS</td><td>B0</td><td>Read Block Data</td>
    </tr>
    <tr>
        <td>2</td><td>P1</td><td>00</td><td>00固定</td>
    </tr>
    <tr>
        <td>3</td><td>P2</td><td>01</td><td>読み出すブロック番号。<b</td>
    </tr>
    <tr>
        <td>4</td><td>Le</td><td>10</td><td>読み取りバイト数。10(16byte)固定。</td>
    </tr>
</table>
byte No.3の読み出すブロック番号は00から指定可能です。
今回は01を指定しているので、セクター1のブロック2のデータを読み出したいということを意味しています。
ここでは、Authenticationコマンドのデータ部のブロック番号指定のようにセクター番号は指定せず、
ブロック番号でどのセクタのどのブロックを指定するかを示します。
例えば、セクター2のブロック1を指定するなら、04、セクター3のブロック3を指定するなら10を指定します。
MIFARE Classicのデータ構造説明の画像を見ながら指定すると分かりやすいと思います。

# 参考サイト
[WindowsでOpenSCを使ってMIFARE Standard(Classic)カードデータを読み出す方法](https://qiita.com/gebo/items/19f4fe7c24e12bb099eb)
[Mifareの基礎知識](http://m-health.u-aizu.ac.jp/~m5101102/SM130/basic_know.html)
[Android入門 MifareClassicの認証に関して](https://yuki-sato.com/android/nfc4.html)
[ISO/IEC 14443 Type A(Mifare)](https://sites.google.com/site/nfclabo/nfc-standard/iso-iec-14443-type-a)
[MIFARE Classic](https://www.wdic.org/w/TECH/MIFARE%20Classic)
[NFC FORUM](https://nfc-forum.org/)
[mifare classic 1k/4k user manual - SonMicro](https://shop.sonmicro.com/Downloads/MIFARECLASSIC-UM.pdf)

# 関連ページ
[WindowsでOpenSCを使う（1.準備編）](https://qiita.com/erik_tnk/items/7d40b02be3bb13f2c3af)
[WindowsでOpenSCを使う（2.カードのIDm確認編）](https://qiita.com/erik_tnk/items/a8e36323a44bab92640d)
[WindowsでOpenSCを使う（3.MIFARE Classicブロックデータ読み出し編①）](https://qiita.com/erik_t/items/9eb14d689870004596bb)