はじめに
最近、パスポートをスキャンしパスポートの下部にある文字列(ORC)のチェックデジットを行うプログラムを作った時の話をしようと思います。
そもそも国外に出たことのない私はパスポートなんて持っていし、チェックデジットってなに?って感じでスタートしました。(無知な故、すみません…)
今回の記事にしたタイトルのものは今年11月から開始されるリファンド方式と呼ばれる外国人観光客へ消費税を一律にかける制度の影響で学んだことのアウトプットとして記載しています。
国税庁:輸出物品販売場制度のリファンド方式への見直し
もともとパスポートをスキャンして、読み込む処理はあったのでチェックデジットのみの実装で、細かいことは行政機関の記事が解説してくれているため、一部割愛していきます。
チェックデジットとは

みんながよく見るバーコードなどにもある小さな数字にもチェックデジットが存在します。
入力誤りなどを検出するために元の符号に付加される数字のことで、特定の計算で求められた余りの数が表示されていたりします。
ちなみにQRコードにもチェックデジットはあります。
JANコード(13桁)の例として、最初の12桁を 490123456789 とします。
- 左から奇数番目の数字を足します。
4+0+2+4+6+8=24 - 左から偶数番目の数字を足し、3倍します。
9+1+3+5+7+9=34
34×3=102 - 2つの結果を足します。
24+102=126 - 合計を次の10の倍数にする数字を求めます。
126に4を足すと130になるため、チェックデジットは 4 です。
したがって、完成したJANコードは 4901234567894 になります。
パスポートのチェックデジット

先ほどはJANコードでしたが、パスポートにも似たようなことができます。
TR1234567200010183001019<<<<<<<<<<<<<<0
パスポートの下部にMRZ下段44文字全体を使う例題。
※これは架空の文字列です。
項目ごとに区切ると、次のようになります。

基本の計算方法
計算は、どの項目も次の4段階です。
- 文字を数字に変換する
- 左から順に「7・3・1」を繰り返して掛ける
- 掛け算の結果をすべて足す
- 合計を10で割った余りをチェックデジットにする
数字はそのまま、アルファベットは A=10、B=11……Z=35、記号 < は0として扱います。ICAOのMRZでは、重み「7・3・1」を繰り返し、合計を10で割った余りをチェックデジットとします。
① 旅券番号のチェックデジット
旅券番号は次の9文字です。
TR1234567
文字を数字に変換して計算します。
| 文字 | 数値 | 重み | 計算 |
|---|---|---|---|
| T | 29 | 7 | 29×7=203 |
| R | 27 | 3 | 27×3=81 |
| 1 | 1 | 1 | 1×1=1 |
| 2 | 2 | 7 | 2×7=14 |
| 3 | 3 | 3 | 3×3=9 |
| 4 | 4 | 1 | 4×1=4 |
| 5 | 5 | 7 | 5×7=35 |
| 6 | 6 | 3 | 6×3=18 |
| 7 | 7 | 1 | 7×1=7 |
合計します。
203+81+1+14+9+4+35+18+7
=372
372を10で割ると、余りは 2 です。
372 ÷ 10 = 37 余り2
したがって、旅券番号部分は次のようになります。
TR1234567 2
↑
チェックデジット
② 生年月日のチェックデジット
生年月日は2000年1月1日なので、MRZでは次のように表します。
000101
計算します。
0×7+0×3+0×1+1×7+0×3+1×1
=0+0+0+7+0+1
=8
8を10で割った余りは 8 です。
000101 8
↑
チェックデジット
③ 有効期限のチェックデジット
有効期限は2030年1月1日なので、次のように表します。
300101
計算します。
3×7+0×3+0×1+1×7+0×3+1×1
=21+0+0+7+0+1
=29
29を10で割った余りは 9 です。
300101 9
↑
チェックデジット
④ 任意データのチェックデジット
今回は任意データを使用しないため、14文字すべてを < で埋めます。
<<<<<<<<<<<<<<
< はすべて0として計算されるため、合計も0です。
0 ÷ 10 = 余り0
この例では、チェックデジットを 0 とします。
<<<<<<<<<<<<<< 0
↑
チェックデジット
任意データが未使用の場合、そのチェック位置には、発行国の運用により 0 または < を使用できます。
⑤ 最後の「全体チェックデジット」
最後の数字は、各項目をまとめてもう一度確認するためのチェックデジットです。
計算対象は次の部分です。
旅券番号+そのCD
生年月日+そのCD
有効期限+そのCD
任意データ+そのCD
国籍の JPN と性別の M は、全体チェックの計算には含めません。TD3形式では、下段の1~10文字目、14~20文字目、22~43文字目が全体チェックの対象です。
計算対象をつなげます。
TR12345672 0001018 3001019 <<<<<<<<<<<<<<0
実際の計算では、項目が変わっても重みをリセットせず、最初から最後まで「7・3・1」を続けます。
読みやすく項目別に合計すると、次のようになります。
旅券番号+CD =386
生年月日+CD =34
有効期限+CD =16
任意データ+CD =0
すべて足します。
386+34+16+0=436
436を10で割った余りは 6 です。
436 ÷ 10 = 43 余り6
したがって、最後の全体チェックデジットは 6 になります。
T=29なのは
A=10
B=11
C=12
…
T=29
…
Z=35
A=10から始まってTは29番目だから
最後に
備忘録的な感じでざっと書いたため、わかりにくい部分があるかと思いますが以上がパスポートの計算式でした。
パスポートのスキャンする機器に付属するDLL自体にチェックデジットを返却するものも存在するため、計算式丸々作成する機会はないかと思いますが知っていて損はないので頭の片隅にでも置いておきましょう。

コメント