1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スマートカードと通信するには

Posted at

はじめに

スマートカードには接触型と非接触型の2種類があります。
最近スマートカードに関する開発を担当し、NFCの規格や仕様を調べる機会がありました。
この記事では非接触型のスマートカードとどうやって通信するのかを紹介します。

NFC

非接触型のカードはNFC ( Near Field radio Communication )という近距離無線の通信規格が用いられます。
NFCフォーラムには国際標準規格ISO/IEC 14443 Type-A, Type-Bや、ISO/IEC 18092にもとづくType-Fなどの規格があり、クレジットカード、マイナンバーカード、免許証、交通系ICなどの様々なカードに用いられています。

ATR

ATRとはAnswer To Resetの略で、カードが端末によってリセットされた際に一連のデータを応答として送信します。ATRの情報からカードとの通信プロトコルを決定します。Type-Aのカードから得たATRを下記に示します。

ATR: 3B 80 80 01 01

1バイト目はTSと呼ばれるキャラクタで、後続キャラクタの符号を決定します。
3Bの場合はLSBから順にデータが送信され、3Fの場合はMSBからデータが送信されます。
ほとんどのカードは3Bが推奨されるそうです。

2バイト目はT0と呼ばれ、このキャラクタの値によってATRの残りのキャラクタが決定されます。上位4ビットによってTA1、TB1、TC1、またはTD1の有無が決まり、5ビット目からTA1、TB1、TC1、TD1の順に対応しています。
今回、上位4ビットは"1000"であるのでTD1のみ存在します。
また、下位4ビットによってヒストリカルバイトの数を決定します。ヒストリカルバイトとは、カードの総合的な情報で、カードの種類によって送信される情報が違います。Type-AのカードではATS(Answer To Select)、Type-BのカードではATQB(Answer To reQuest for PICC B)となります。今回は"0"であるので、ヒストリカルバイトが存在しません。

3バイト目はTD1となります(T0によって決定)。上位4ビットによってT0と同様に、TA2、TB2、TC2、TD2の有無を決定します。今回は"1000"であるのでTD2のみ存在します。
また、下位4ビットは通信プロトコルを決定し、"0"であればT=0、"1"であればT=1となります。T=0はキャラクタベース、T=1はブロックベースとなるそうです。今回はT=0となります。

4バイト目はTD2となります。TDx(xは0以上の整数)はすべて同様の仕様であるので、この場合、以降のキャラクタは存在せず、T=1となります。

5バイト目はTCKと呼ばれるチェックキャラクタで、最初のキャラクタ(TS)からTCKまでの排他的論理和が"0"となるような値をとります。

ATRについての詳細は下記のサイトにあります。
密着型ICカードの実装規約

APDU

スマートカードとデータ通信する際に、APDUコマンドというものがよく使われます。
APDUとはApplication Protocol Data Unitの略で、スマートカードと通信するための規格です。
カードリーダなどのデバイスからカードに送信するAPDUをCommand-APDU、カードからデバイスに返信されるAPDUをRespons-APDUといいます。下記のサイトで詳しく解説されています。
APDU (Application Protocol Data Unit) プロトコル

通信デバイス

NFCとやり取りするには通信デバイスが必要です。PC/SC Win32APIに対応したカードリーダを使うと、APIを使ってカードとやり取りすることができます。

APDUでデータのやり取り

実際にデータのやり取りをしてみます。再度Type-Aのカードを使いました。
R-APDUの末尾が"9000"でコマンド成功となります。

C-APDU: 80CA00E000
R-APDU: e012c00401018010c00402018010c004030180109000

C-APDUのパラメータをE0とすることで、選択中アプリのKey Informationを取得できます。
R-APDUの内容はGlobalPlatform Card Specification 2.2.0.7の11.3.3.1に書いています。

レスポンスはTLV構造となっていて、1バイト目はテンプレートE0を返し、タグはC0となっています。データ部の"01 01 80 10"はそれぞれ、ID: 01、Version: 01、KeyType: DES(80)、LEN:16となります。
全部で3つあるので、まとめると
ID: 01、Version: 01、KeyType: DES(80)、LEN:16
ID: 02、Version: 01、KeyType: DES(80)、LEN:16
ID: 03、Version: 01、KeyType: DES(80)、LEN:16
となります。なぜ3つ並んでいるのかはよく分かりません。3つでトリプルDESということでしょうか("81"がTripleDESなので違う気がする)。

まとめ

無事にスマートカードと通信することができました。スマートカードは暗号方式にトリプルDESを採用していることが多いようですが、FelicaはAESも採用しているらしいです。他にもカードによって、製造元の情報なども確認することができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?