RaspberyPi + libnfc + PN532 NFC RFID module + mfd ファイルを使って Mifare カードを読む


(Felica/Mifare/NFC チャレンジシリーズ) その他の記事はこちら 「Felica/Mifare/NFC でいろいろ実験」
https://qiita.com/nanbuwks/items/1f416d6e45a87250ee0a


Raspberry Pi で libnfc + PN532 NFC RFID module
https://qiita.com/nanbuwks/items/0c73add503b354774035

では Mifare カードを認識するところまで行いました。

今回は、 libnfc を使って Mifare カードの中身を読み込んでみます。

util プログラム

libnfc をインストールすると、libnfc-bin として以下のプログラムが使用できるようになります。

  • nfc-barcode
  • nfc-jewel
  • nfc-mfclassic
  • nfc-read-forum-tag3
  • nfc-scan-device
  • nfc-emulate-forum-tag4
  • nfc-list
  • nfc-mfultralight
  • nfc-relay-picc

これらの特徴として、読み書きするデータはカードまるごと、更にデータはファイルでやり取りをするようです。

mifare を読み込むのは nfc-mfclassic が使えそうです。

$ nfc-mfclassic
Usage: nfc-mfclassic f|r|R|w|W a|b u|U<01ab23cd> <dump.mfd> [<keys.mfd> [f]]
  f|r|R|w|W     - Perform format (f) or read from (r) or unlocked read from (R) or write to (w) or unlocked write to (W) card
                  *** format will reset all keys to FFFFFFFFFFFF and all data to 00 and all ACLs to default
                  *** unlocked read does not require authentication and will reveal A and B keys
                  *** note that unlocked write will attempt to overwrite block 0 including UID
                  *** unlocking only works with special Mifare 1K cards (Chinese clones)
  a|A|b|B       - Use A or B keys for action; Halt on errors (a|b) or tolerate errors (A|B)
  u|U           - Use any (u) uid or supply a uid specifically as U01ab23cd.
  <dump.mfd>    - MiFare Dump (MFD) used to write (card to MFD) or (MFD to card)
  <keys.mfd>    - MiFare Dump (MFD) that contain the keys (optional)
  f             - Force using the keyfile even if UID does not match (optional)
Examples: 

  Read card to file, using key A:

    nfc-mfclassic r a u mycard.mfd

  Write file to blank card, using key A:

    nfc-mfclassic w a u mycard.mfd

  Write new data and/or keys to previously written card, using key A:

    nfc-mfclassic w a u newdata.mfd mycard.mfd

  Format/wipe card (note two passes required to ensure writes for all ACL cases):

    nfc-mfclassic f A u dummy.mfd keyfile.mfd f
    nfc-mfclassic f B u dummy.mfd keyfile.mfd f

  Read card to file, using key A and uid 0x01 0xab 0x23 0xcd:

    nfc-mfclassic r a U01ab23cd mycard.mfd

これに基づいて、読み込みを行ってみます。
読み出しや鍵指定に使うファイルは、mfd 形式のようです。


$ xxd -r -p > key.mfd

以下のように標準入力から入力し、Ctrl+Dを押して鍵を作ります。


000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF00000000000000000000

中身は以下のように確認できます。

$ xxd key.mfd
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: ffff ffff ffff 0000 0000 0000 0000 0000  ................

これは keyA に FFFFFFFFFFFF を指定しています。

これを使って読んでみます。


$ nfc-mfclassic r key.mfd u mycard.mfd
NFC reader: Itead_PN532 opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): c5  b2  0f  ad  
      SAK (SEL_RES): 08  
RATS support: no
Guessing size: seems to be a 1024-byte card
Reading out 64 blocks |................................................................|
Done, 64 of 64 blocks read.
Writing data to file: mycard.mfd ...Done.

読めた中身を確認します。


$  xxd mycard.mfd
00000000: c5b2 0fad d508 0400 6263 6465 6667 6869  ........bcdefghi
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 ff07 8069 ffff ffff ffff  .........i......
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 ff07 8069 ffff ffff ffff  .........i......
.
.
.

なお、key.mfd ファイルを作りましたが


$ nfc-mfclassic r dummy.mfd u mycard.mfd

として、存在しない鍵ファイルを使っても読めました。
デフォルト鍵を使う場合はこれでもいい??