PC/SCでIC免許証からデータを取得するコマンド

PC/SCで免許からデータを取得するコマンド

かねてから、ICカード免許証からデータを読み出したいと思っていました。PC/SCで、データをひととおり読み出せるコマンド群が得られたので、以下に示します。
本籍や写真は、PIN1とPIN2が揃って初めて読み出すことができるデータですので、この順序でお使いになることをオススメします。

PC/SCにあまりなじみのない方は、こちらにUIDが取得できるコードサンプルがあります。SCardTransmitのところをコピー&ペーストして何度か実行させるようにして、その16進コマンドを書き換えればデータが読み出せるようになると思います。言語はVisual Basic 2019です。
記載事項(880バイト)や写真(2005バイト)は、容量が大きいので、返信データ用バッファを読み出しバイト数より2バイト(ステータスバイト)以上大きく確保してからアクセスしないとエラーになります。

なお、僕は、読み出した後のデータをExcelで処理したかったので、VBAを用いてアクセスしました。つまり、Visual Basic 2019でコマンドの動作確認をしたわけではありませんので、万一動作しなくても責任は負えません。特に、PINの照合許容回数は3回であり、それを超えると閉塞されます。解除するには免許センター又は警察署の窓口に出向くことになりますので、くれぐれもご注意ください。

テスト環境:
・ICカードリーダ:SONY RC-S380
・Excel 2019 64ビット

・PUPI (Pseudo-Unique PICC Identifier)を取得
FF CA 00 00 00
・MFを選択
00 A4 00 00
・EF01(EF識別子は2F01)を選択
00 A4 02 0C 02 2F 01
・MF/EF01(共通データ要素、17バイト)の内容を読み出す
00 B0 00 00 11
・PIN1の照合(xxがPIN。1234なら31 32 33 34)
00 20 00 81 04 xx xx xx xx
(ステータスバイトが90 00なら照合OKだが、63 Cxなら残りの許容回数がx回)
・DF1を選択(DF1のRIDはA0 00 00 02 31、PIXは01 00 00 00 00 00 00 00 00 00 00)
00 A4 04 0C 10 A0 00 00 02 31 01 00 00 00 00 00 00 00 00 00 00
・DF1/EF01(記載事項(本籍除く)、880バイト)の読み出し
00 B0 81 00 00 03 70
・DF1/EF03(外字、264バイト)の読み出し
00 B0 83 00 00 01 08
・DF1/EF04(記載事項変更等(本籍除く)、640バイト)の読み出し
00 B0 84 00 00 02 80
・DF1/EF05(記載事項変更(外字)、663バイト)の読み出し
00 B0 85 00 00 02 97
・DF1/EF07(電子署名、578バイト)の読み出し
00 B0 87 00 00 02 42
・MFを選択
00 A4 00 00
・PIN2の照合(PIN2は82。PIN1は81だった)
00 20 00 82 04 xx xx xx xx
・DF1を選択
00 A4 04 0C 10 A0 00 00 02 31 01 00 00 00 00 00 00 00 00 00 00
・DF1/EF02(記載事項(本籍)、82バイト)の読み出し
00 B0 82 00 52
・DF1/EF06(記載事項変更(本籍)、256バイト)の読み出し
00 B0 86 00 00 01 00
・DF2を選択(DF1のRIDはA0 00 00 02 31、PIXは02 00 00 00 00 00 00 00 00 00 00)
00 A4 04 0C 10 A0 00 00 02 31 02 00 00 00 00 00 00 00 00 00 00
・DF2/EF01(写真、2005バイト)の読み出し
00 B0 81 00 00 07 D5

分かったこと

カード発行者データである交付年月日有効期間の末日には、西暦が用いられており、その他は全て元号でした。西暦には4バイト、元号には7バイトが使われます。元号は都合21回使われているので、これを西暦に直せば、63バイトが節約できます。でも、あえてそれをしないところに、元号を使うという強い意志が感じられました。

JIS X 0208の制定年番号は、78でした。つまり、参照されているJISは1978年に制定された初代のJIS C 6226が使われていました。(免許作成機が古いから写真もうまく撮れていないのかなぁ)
1997年に改訂されたJISなら登録のある漢字でも、外字登録されて使われている可能性があります。幸いなことに、僕の名前には珍しい文字が使われていないので、確認はできませんでした。

何に使うのか分かりませんが、統一氏名という欄があるんですね。本名から濁点が除かれたカナ文字が登録されていました。

ところで、上述したように、僕はExcelからアクセスしました。
ワークシート関数のCHARはJISなので、読み出した16進数と相性がいいです。つまり、”38 29″という16進文字列が現れた時、「=CHAR(HEX2DEC(“3829”))」とすれば、直ちに「県」という文字を得ることができます。しかし、VBAのChr関数はなぜかShift_JISです。つまり、”38 29″を”8C A7″に変換してから、「Chr(“&H8CA7”)」としないと、「県」という字になりません。そこで、JISをShift_JISに変換するために、以下の関数を使いました。

'-----------------------------------------------------------------------
' Summary     : JISコードをShift_JISコードに変換する
' Input/Output: Byt1: 第1バイト
'             : Byt2: 第2バイト
'-----------------------------------------------------------------------
Private Sub JIS2SJIS(ByRef byt1 As Byte, ByRef byt2 As Byte)
    If byt1 And &H1 Then
        byt1 = byt1 \ 2
        If byt1 < &H2F Then byt1 = byt1 + &H71 Else: byt1 = byt1 - &H4F If byt2 > &H5F Then byt2 = byt2 + &H20 Else: byt2 = byt2 + &H1F
    Else
        byt1 = byt1 \ 2
        If byt1 < &H2F Then byt1 = byt1 + &H70 Else: byt1 = byt1 - &H50
        byt2 = byt2 + &H7E
    End If
End Sub

この関数の作成にはこちらのサイトを参考にさせていただきました。

Japanese Kanji Code

本籍は、免許の表面に記載されていませんが、内部にはしっかりと書かれていました。

写真は、JPEG2000というあまり聞いたことのない形式です。”5F 40”というタグは読み出せたものの、後は皆目分かりませんでした。ただ、SOC(コードストリーム)が”FF 4F”、EOI(イメージの終了)が”FF D9″ということが分かりました。そこで、これらのコードを含んだ領域をバイナリで英数字のみから構成されるPathへ出力し、j2kという拡張子を付けたところ画像ソフト(GIMP)で開くことができました。境目のぼやけた白黒写真でした。

まとめ

IC免許証からデータを一通り得ることができました。

データが得られれば、こちらのモノ。僕はExcelでコードを文字に変換して、読み解きました。読み解いているうちに、TLVについても理解することができました。本記事には詳細を記しませんでしたが、パズルみたいで面白かったです。

ただし、電子署名については、皆目わからないので、そのうち勉強しようと思います。


参考文献:運転免許証及び運転免許証作成システム等の仕様の改正について https://www.npa.go.jp/laws/notification/koutuu/menkyo/menkyo20210630_150.pdf

コメント

タイトルとURLをコピーしました