Edited at
OSSTechDay 22

IC運転免許証に格納されたデータを紹介してみる


はじめに

本記事は、2018/12/21現在における仕様書の内容をベースとして、IC運転免許証にどんなデータが格納されているのかふわっと紹介するものです。

運転免許証から各種論理ファイルの内容を読み出すまでに関しては一切触れないので、あらかじめご了承ください。

より詳細な情報に関しましては、仕様書をご参照ください。


仕様書はどこにあるの?

普通にネット上に公開されています。「運転免許証 仕様」とでもググればすぐに見つかるかと思います。

2018/12/21現在では、「運転免許証及び運転免許証作成システム等の仕様の改正について」というPDFファイルが見つかり、その中に「運転免許証及び運転免許証作成システム等仕様書」が含まれています。

ちなみに仕様書のバージョンは007となっていました。

※追記

2019/04/03にバージョン008の仕様書が公開されたようです。


ファイルの構成は?

IC運転免許証の中には、以下のような構成の論理ファイルが入っています。

「:」以降にはファイルの内容を記載しています。

MF

├── DF1

│   ├── EF01: 記載事項(本籍除く)

│   ├── EF02: 記載事項(本籍)

│   ├── EF03: 外字

│   ├── EF04: 記載事項変更等(本籍除く)

│   ├── EF05: 記載事項変更(外字)

│   ├── EF06: 記載事項変更(本籍)

│   └── EF07: 電子署名

├── DF2

│   └── EF01: 写真

├── DF3

│   └── EF01: RFU (reserved for future use)

├── EF01: 共通データ要素

├── EF02: PIN設定

├── IEF01: 暗証番号1(PIN 1)

└── IEF02: 暗証番号2(PIN 2)

MFDFは、Windowsのファイルシステムで例えると、それぞれ「ルートフォルダ」と「フォルダ」、EFおよびIEFは「ファイル」のようなものだと思ってください(Linux界隈の人は「フォルダ」を「ディレクトリ」に読み替えてください)。

そのため、上記のようにMFやDFの下にEFやIEFがあるような構成を取ることができます。

なお、RFUであるMF/DF3/EF01に関しては本記事では触れませんのでご了承ください。


ファイルにはどんな形でデータが入っているの?

EF01やEF02といった各ファイルの中には、タグフィールド(T)長さフィールド(L)値フィールド(V)の3つで構成される基本符号化TLV(BER-TLV)フォーマットのデータ(以降「TLVデータ」)が1つ以上並んでいます。

TLVデータ1
TLVデータ2
TLVデータ3
・・・

T
L
V
T
L
V
T
L
V
・・・

各フィールドに関しては後述しますが、値フィールドの長さに応じて各フィールドの長さは以下のように変化します。

(A) 値フィールドが0~127バイトである場合

タグフィールド
長さフィールド
値フィールド

1バイト
1バイト
0~127バイト

(B) 値フィールドが128~65535バイトである場合

タグフィールド
長さフィールド
値フィールド

1または2バイト
3バイト
128~65535バイト


タグフィールドって?

タグフィールドには、そのタグフィールドを含むTLVデータの、データ内容を知るための値が入っています。

基本的には16進数で"01"~"FE"となる1バイトの値が入っていますが、MF/DF2/EF01(写真)の場合のみ"5F40"という2バイトの値が入っています。

例えば、「記載事項(本籍除く)」のデータが入っているMF/DF1/EF01で、あるTLVデータのタグフィールドの値が"12"であれば、対応する値フィールドには氏名が入っていると判断できます。

タグの値と対応するデータ内容に関しては仕様書をご参照ください。


長さフィールドって?

長さフィールドは、後述の値フィールドの長さを示します。

仕様書では、上述の(A)のように値フィールドが0~127バイトの場合、b8(最上位ビット)を0とし、続くb7~b1で0~127の整数を符号化(上位先順)するよう定められています。

b8
b7
b6
b5
b4
b3
b2
b1

0
0 or 1
0 or 1
0 or 1
0 or 1
0 or 1
0 or 1
0 or 1

例えば、値フィールドの長さが100のとき、長さフィールドは16進数で"64"となる1バイトの値になります。

また(B)のように値フィールドが128~65535バイトの場合、長さフィールドは3バイトとなり、この内の第1バイトを16進数で"82"とし、残りの2バイトで65535までの値を表現します。

第1バイト
 第2バイト
 第3バイト

"82"(固定値)
16ビットで65535までの値を表現

例えば、値フィールドの長さが256のとき、16進数で"820100"となる3バイトの値になります。

長さフィールドの最上位ビットを見ることで、(A)と(B)のどちらのパターンか判別することができます。


値フィールドって?

値フィールドは、名前の通り値が入ったフィールドです。

長さフィールドの値が"00"、すなわち値フィールドの長さが0の時、値フィールドは存在せず、長さフィールドのすぐ後に、次のTLVデータのタグフィールドが来ることになります。

値がどのように符号化されているかはデータによって異なります。そのため、符号化方式に関しては仕様書をご参照ください。


各ファイルの内容について

各ファイルにどのような情報がどのように格納されているのか紹介します。

「記載事項(本籍除く)」や「JIS X 0208 制定年番号」のようなファイルやデータの内容を示す単語は、仕様書そのままの表現としていますのでご理解ください。

TLVデータの具体例は基本的に実際のデータを参考に作成した架空のデータです。

分かりやすくするため、タグフィールドを赤色、長さフィールドを緑色、値フィールドを青色とした、16進数で表現することとします。


記載事項(本籍除く)

MF/DF1/EF01には記載事項(本籍除く)が格納されています。

具体的には、氏名や生年月日、住所と言った一般的な個人情報や、「免許証の色区分(優良・新規・その他)」や「免許の条件1」、「免許の年月日(普通)」と言った運転免許証ならではの情報が格納されています。


具体例

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


JIS X 0208 制定年番号

11:01:78

"11"はJIS X 0208 制定年番号であることを、"01"は値フィールドの長さが1であることを示しています。

値フィールドは符号化時に参照したJIS X 0208の制定年下2桁を示しています。例えば1983年の場合、"83"となります。

なお、仕様書には以下のようにあります。


  • ただし、JIS C 6226は、“78”とする。

以上のことから、例のように"78"とある場合は、MF/DF1/EF01の他のデータでJIS X 0208で符号化されたと仕様書にあるものは、厳密には1978年に制定されたJIS C 6226を参照して符号化されたもの判断することができます。

ただし、以降ではJIS C 6226を参照して符号化されたと判断できる場合でも単に「JIS X 0208」と記載しますのでご了承ください。


氏名

12:0A:3B:33:FF:F1:21:21:42:40:4F:3A

"12"は氏名であることを、"0A"は値フィールドの長さが10であることを示しています。

値フィールドをJIS X 0208に基づいて変換していくと、以下のようになります。

"3B33"
"FFF1"
"2121"
"4240"
"4F3A"


JIS X 0208には存在しない
全角スペース

表にもあるように、"FFF1"はJIS X 0208に存在しません。

これは"FFF1"がJIS X 0208の文字コードではなく、外字が使用されていることを示す値であるためです。(外字に関しては後述をご参照ください。)

"FFF1"を正しく変換して表示するためには、MF/DF1/EF03に格納されている外字1のデータを画像にデコードして表示する必要がありますが、ここでは「(外字1)」とすることにします。

結果、このTLVデータからは「山(外字1) 太郎」という氏名を得ることができます。


生年月日

16:07:33:35:30:30:36:30:31

"16"は生年月日であることを、"07"は値フィールドの長さが7であることを示しています。

値フィールドをJIS X 0201に基づいて変換していくと、以下のようになります。

"33"
"35"
"30"
"30"
"36"
"30"
"31"

3
5
0
0
6
0
1

これらの数値は順に元号1桁、年2桁、月2桁、日2桁を表しています。

元号の数値は明治=1、大正=3、昭和=3、平成=4と定められています。

結果、「昭和50年06月01日」という生年月日を得ることができます。


免許の条件1

1C:06:34:63:36:40:45:79

"1C"は免許の条件1であることを、"06"は値フィールドの長さが6であることを示しています。

(「免許の条件」は運転免許証表面の「免許の条件等」の右に書いてあるアレです。IC運転免許証には、「免許の条件1」~「免許の条件4」の4つまで記入できるようになっているようです。)

値フィールドをJIS X 0208に基づいて変換していくと、以下のようになります。

"3463"
"3640"
"4579"



結果、「眼鏡等」という免許の条件1を読み取ることができます。


記載事項(本籍)

MF/DF1/EF02には記載事項(本籍)が格納されています。

具体的には、本籍のみが書かれています。


外字

MF/DF1/EF03には外字が格納されています。

具体的には、JIS X 0208で規定されていない文字のBitMapデータをエンコードしたものが格納されています。外字1と外字2の、最大2つのデータを格納できるようです。

外字に関しては後述をご参照ください。

エンコード方法等の詳細に関しては、仕様書をご参照ください。


具体例

ちょうど私の運転免許証でも外字が使用されていたため、そのTLVデータを具体例として記載しておきます。

(このデータに関しては架空のデータではなく、実際のデータとなっています。)


外字1

48:5E:50:91:33:D7:93:9F:AA:3C:B5:A7:F4:FE:17:93:82:89:83:CD:9F:FC:75:D1:E4:48:7F:ED:3D:75:6B:FE:E1:7F:6D:05:FD:BA:38:BF:F8:4F:FB:D2:7F:CB:86:57:FF:F9:11:7F:FF:FF:CC:67:AF:FD:A7:FF:88:7F:FA:FF:CD:8B:FF:D7:FF:FF:FF:FF:FF:FF:F8:8F:FF:1F:FF:32:33:67:88:D3:F1:1F:FF:E4:50:5B:C3:C1:E3:00:10:01

"48"は外字1であることを、"5E"は値フィールドの長さが94であることを示しています。

これを頑張ってデコードすれば「﨑(たつさき)」の画像データが取得できるはずです。(私は自力でデコードしたことありませんが。)


記載事項変更等(本籍除く)

MF/DF1/EF04には記載事項変更等(本籍除く)が格納されています。

具体的には、「新住所」や「新氏名」といった運転免許証裏面の備考欄に書かれている情報が記載されています。


具体例

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


追記の有無

50:01:11

これは追記の有無を表すデータです。

値フィールドの値が"11"である場合、MF/DF1/EF04には「新氏名」や「新住所」といった情報が追記されてると判断できます。


新住所

70:37:78:23:34:23:33:23:30:23:30:23:31:23:30:23:31:45:6C:35:7E:45:54:40:69:42:65:45:44:36:68:32:62:24:2C:34:58:23:32:21:5D:23:31:21:5D:23:33:45:6C:35:7E:45:54:38:78:30:42

"70"は新住所であることを、"37"は値フィールドの長さが55であることを示しています。

値フィールドですが、最初の1バイトは記載事項(本籍除く)のJIS X 0208 制定年番号と同様に、符号化する際に参照したJIS X 0208制定年下2桁を示しているため、具体的な新住所の情報は2バイト目から記載されています。

値フィールドの第2バイト以降の内容をJIS X 0208に基づいて変換すると以下のようになります。

4300101東京都千代田区霞が関2-1-3東京都公安

内容としては、順に変更年月日(7字)、新住所、公安委員会名(5字)となっています。

変更年月日は記載事項(本籍除く)の生年月日同様のルールとなっており、この例の場合は平成30年01月01日となります。

公安委員会名はデータの追記を行った公安委員会の名前を5字で表したもので、例えば東京都公安委員会であれば「東京都公安」となる模様です。(「神奈川県」のように4字の都道府県の場合にどうなるかは把握しておりません。)

知人の運転免許証裏面の備考欄を拝見したところ「東京都公安」と印字される代わりに、「東京公委」とスタンプを押されていました。


記載事項変更(外字)

MF/DF1/EF05には記載事項変更(外字)が格納されています。

具体的には、MF/DF1/EF03(外字)と同様に外字データが格納されています。

MF/DF1/EF03には最大2つの外字データを格納できるようになっていますが、それでは足りない場合にこのファイルに外字データを格納するようです(外字3~外字7の最大5つ)。


記載事項変更(本籍)

MF/DF1/EF06には記載事項変更等(本籍)が格納されています。

具体的には、新本籍が記載されています。


電子署名

MF/DF1/EF07には電子署名が格納されています。

具体的には、電子署名、シリアル番号、発行者名、主体者名、主体者鍵識別子が記載されています。


写真

MF/DF2/EF01には写真が格納されています。

具体的には運転免許証表面に印刷されている顔写真が、JPEG2000のフォーマットで格納されています。

ただし、運転免許証の顔写真がカラー写真であるのに対し、格納されている画像は色が着いていないモノクロの画像となっているようです。

このファイルのみ、TLVデータのタグフィールドが"5F40"という2バイトの値になります。


共通データ要素

MF/EF01には共通データ要素が格納されています。

具体的には、カード発行者データと発効前データが格納されています。


具体例

実際にどう言った値が格納されているのか、TLVデータの具体例を交えて紹介します。


カード発行者データ

45:0B:30:30:36:20:16:06:01:20:21:07:01

"45"はカード発行者データであることを、"0B"は値フィールドの長さが11であることを示しています。

値フィールドの内容は、順に仕様書バージョン番号(3バイト)、交付年月日(4バイト)、有効期限の末日(4バイト)となっています。

仕様書バージョン番号はJIS X 0201で符号化されています。

交付年月日および有効期限の末日は4バイトで西暦を表したもので、例えば"20181220"の場合、2018年12月20日となります。

以上のことから、例の場合は仕様書バージョンが006、交付年月日が2016年06月01日、有効期限の末日が2021年07月01日とわかります。


暗証番号(PIN)設定

MF/EF02には暗証番号(PIN)設定が格納されています。

詳細に関しましては仕様書をご参照ください。


暗証番号1(PIN 1)

MF/IEF01には暗証番号1(PIN 1)が格納されています。

PIN 1は4桁の数字です。

運転免許証の交付を受けた後に変更することはできません。

(暗証番号を忘れた場合、警察署へ行けば暗証番号を教えて貰えますが、暗証番号をリセットすることはできないようです。)

詳細に関しましては仕様書をご参照ください。


暗証番号2(PIN 2)

MF/IEF02には暗証番号2(PIN 2)が格納されています。

詳細は暗証番号1(PIN 1)と同じです。


外字って?

仕様書において、外字は以下のように定義されています。


  • JIS X 0208に規定されていない文字であり、かつ、DF1/EF03 又は DF1/EF05 において定義された文字

例えば、名前や住所等に「髙(はしごだか)」や「﨑(たつさき)」のようなJIS X 0208で規定されていない文字が含まれていて、その文字の画像データがMF/DF1/EF03またはMF/DF1/EF05に格納されていれば、その文字は外字です。

氏名や住所等はJIS X 0208で符号化された形で格納されていますが、外字が含まれる場合は代わりにどの外字データに対応しているかを示す値("FFF1"~"FFF7")が使用されています。(例えばMF/DF1/EF01の氏名の例のように。)

この外字の部分を正しく表示する場合、"FFF1"のような値の箇所で対応する外字データをデコードした画像を表示する必要があります。

なお、格納できるのはMF/DF1/EF03MF/DF1/EF05で合わせて最大7字のため、氏名や住所等に多くのJIS X 0208規定外の文字が使われている場合は、JIS X 0208規定外の文字であっても運転免許証に画像データが格納されていない可能性があります。

この場合、欠字として"FFFA"が使用されるものと思われます。欠字に関しては、仕様書をご参照ください。


所感

個人情報に﨑(たつさき)が含まれていることが役に立つ日が来ようとは、思ってもみませんでした。


参考文献

https://www.npa.go.jp/pdc/notification/koutuu/menkyo/menkyo20160715.pdf

http://eternalwindows.jp/security/scard/scard08.html

https://ja.wikipedia.org/wiki/JIS_X_0208

https://ja.wikipedia.org/wiki/JIS%E6%BC%A2%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89

http://www.asahi-net.or.jp/~EK5Y-NSMR/ref-ascii.htm

http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0208.html#level1