第422号コラム:上原 哲太郎 理事(立命館大学 情報理工学部 情報システム学科 教授)
題:「法人番号の検査用符号の設計ミスと、公共で使われるチェックデジット」

前回、第404号コラムでマイナンバーの個人番号のチェックデジットについて取り上げました。
第404号コラム「マイナンバーのチェックデジットについて
今回はその続編です。もう一つのマイナンバー、法人番号について、前回は書く余裕がなかったので今回追記しておきます。

マイナンバー法で定められる法人番号は、その名の通り法人などに付番される13桁の番号で、国の機関、地方公共団体、会社法に基づく法人などほとんどの法人と、法人格を持たなくても納税義務を有する主体(いわゆる権利なき社団や財団)に与えられています(一方、有限責任事業組合などは法人登記があっても法人税の納税義務が発生しないためか、法人番号は与えられません)。

この法人番号の付番は国税庁が行います。しかし、付番対象の大半を占める法務局への登記を要する法人には、もともと登記所において12桁の「会社法人等番号」が付与されているので、これに検査用数字を加えた13桁が法人番号として使われています。登記を要さない法人などは、会社法人等番号で使われない領域を使って付番されています。その総数は2016年6月末現在で440万件足らずです。1億以上の付番が必要な個人番号が12桁なのに、いくら法人の寿命が人より短いとは言え、500万もない法人に対して13桁も費やすのはなかなか贅沢ですが、登記簿と直接結びついた会社法人等番号が法人番号に内包されているのは、何かと便利なのかも知れません。いずれにせよ、個人番号と違って法人番号はその使用に制限がない上、国税庁がWeb経由で法人番号と法人名、登記上の住所という3情報を広く公開しているため、民間活用すれば非常に有用なものであると言えるでしょう。例えば各企業は取引先に債主コードなどのIDを割り当てて管理していると思いますが、法人番号を活用すれば、部門間の連携不備によって同一法人に複数のIDを割り当ててしまうような手違いを防ぐことが出来ます。

さて、その法人番号の検査用数字が今回の話題です。個人番号の検査用数字は、本来11通りあるところを無理矢理10通りに丸めたため、検査用数字が0になった場合にはチェックデジットとしての役割が果たしきれなくなる話は前回指摘しました。法人番号の検査用数字の場合は、個人番号とは全く別の計算式が使われていますが、こちらはどうでしょうか。

法人番号の検査用数字は財務省令第七十号で定められています。個人番号は最下位についていたのに対し、法人番号では最上位、つまり最も左側の桁についています。その計算式ですが、「最下位桁を1としたときに、偶数桁の数字の総和を2倍したものと、奇数桁の数字の総和を足して、それを9で割った余りを、9から引いたもの」になります。つまり、法人番号をxabcdefghijklとすると、x=9 – (2(a+c+e+g+i+k)+b+d+f+h+j+l) mod 9になります。ただしmod 9は9で割った余りを表します。こうするとxはかならず1から9の値になりますから、先頭桁が0にならずに済む、という利点があります。さらに、個人番号の場合と違って11通りのものを10通りに押し込めたりしていないので、数学的にも歪みはないはずです。

…ですが、チェックデジットとしては大きな問題があります。法人番号の検査用数字は9通りしかありません。このうち正しい数値が1通り、残り8通りは入力誤りに対応するはずです。一方、検査用数字を除いた全ての数字は各桁10通りの数字が入るわけですから、誤りは各桁9通りあります。よって、このうちの1桁だけに注目した場合、9通りの誤りのうち1つは見逃してしまうことになります。1桁だけの入力誤りは最も頻発する誤りですが、これが検出できない場合がありそうです。

具体的に調べてみましょう。一般に剰余算と加算は順序を入れ替えても結果が変わりません。例えば、(2a + b) mod 9は(2a mod 9 + b mod 9)と同じです(後者は9以上になればもう一度9で割る必要がありますが)。よって、検査用数字算出時には各桁で先にmod 9を計算してから総和を取っても構いません。ここで、ある桁の数字がXだったとすると、X mod 9も2X mod 9も、X=0とX=9の両方で答えは0になります。つまり各桁の0と9は、検査用数字を求める際の加算結果に全く影響しません。言い換えると「法人番号は0と9を同等に扱う」ということになります。

この結果、法人番号においては0と9を取り間違えても検査用数字では誤りを見つけられません。例えば、私が所属する学校法人立命館の場合、法人番号は9130005004289です。検査用数字は9ですが、これを検算してみましょう。前述の式に当てはめると、

9 – (2×(1+0+0+0+4+8)+3+0+5+0+2+9) mod 9
= 9 – (2 × 13 + 19) mod 9
= 9 – 45 mod 9
= 9 – 0
= 9

ということで、確かに検査用数字は9です。ところで、この法人番号には最上位の検査用数字以外に0が5つ、9が1つありますが、これらを全部0を9に、9を0に入れ替えてみましょう。すると9139995994280という番号が得られますが、これの検査用数字を計算してみると

9 – (2×(1+9+9+9+4+8)+3+9+5+9+2+0) mod 9
= 9 – (2×40 + 28) mod 9
= 9 – 108 mod 9
= 9 – 0
= 9

ということで、確かに検査用数字は9のままです。

このように、法人番号では0と9は検査用数字の算出の上では同等に扱われてしまっています。そのため、各法人番号のうち0と9を打ち間違えてしまい、かつその打ち間違えた法人番号に該当する法人があると面倒なことになります。例えば、学校法人立命館の法人番号の最下位桁の9を0と入れ替えると9130005004280になりますが、これは学校法人明徳学園の法人番号です。この打ち間違いは検査用数字では発見できませんので、法人番号を積極的に活用している組織で事務手続き上この打ち間違いをされると、かなり厄介なトラブルを招きそうです。

とはいえ13桁、検査用数字を考慮しても1兆通りもある法人番号は、そのうち440万ほどしか使われていないので、このような不幸な例はそれほど多くないようにも思えます。ところが実際に全法人番号を調べるとかなり不幸な例が見つかります。というのは、法人番号の基となった会社法人等番号は上位桁が登記所や法人種別を表している関係で、番号の分布に大きな偏りがあるからです。端的な例を1つご紹介すると、以下の28法人は法人番号が「0と9だらけ」であって、これらの打ち間違えによって高い確率で他の法人と取り違えられてしまいます。

4120001000090
4120001000099
4120001000909
4120001000990
4120001009000
4120001009009
4120001009090
4120001009099
4120001009909
4120001009990
4120001009999
4120001090000
4120001090090
4120001090099
4120001090900
4120001090990
4120001090999
4120001099009
4120001099990
4120001099999
4120901000090
4120901000990
4120901009000
4120901009009
4120901009090
4120901009900
4120901009909
4120901009990

これらはすべて、大阪府内に実在する法人の法人番号です(よければ調べてみて下さい)。このような法人番号が当たってしまった法人はお気の毒としか言いようがありません。ここまで極端でなくても、法人番号は0を多く含む傾向に偏っているので、割と高い確率で他の法人が該当してしまいます。

どうしてこんなことが起きたのでしょうか。個人番号の検査用数字でも感じたことですが、この検査用数字を決定する際に、事務上の打ち間違いを防ぐ「チェックデジット」としての性質を満たすことを慎重に検討するプロセスが全く欠けていたのではないかと思います。この検査用数字を決定する前にはパブリックコメントが行われたはずなのですが、それを見落としてしまったのは個人的には痛恨でした。もし気が付いていれば、頭の0を避けるべきではない、どうしても頭の0を避けるなら会社法人等コード(の先頭4桁の登記所コード)の再付番で対応するべきで、あくまでもチェックデジットは最下位にするべき、そしてそのアルゴリズムは、バーコード処理などを考えて(商品などに用いられている)JANコードと同じチェックデジットにするか、前回コラムでご紹介したDammアルゴリズムを使用するべき、と提言できたかもしれないのですが、付番が終わってしまった今となっては後の祭りです。

ところで、公共分野には他にも数字がいろいろ用いられていますが、これらにはチェックデジットは使われているでしょうか。個人番号に使われている「11で割って10通りに丸める」チェックデジットは、住民票コードにもほぼ同じ式が使われているようですし、さらに遡ると運転免許証の番号に使われているようです(運転免許証では最下位の番号は再発行回数で、下から2桁目がチェックデジットです)。パスポートの旅券番号にチェックデジットが含まれるかは情報がありませんが、旅券番号等を含む機械読み取り部分にはチェックデジットが用いられています(ICAO Document 9303 Part 3に定義されています)。変わったところでは、狂牛病対策で導入された「牛個体識別番号」はバーコード読み取りを前提としているためか、JANコードやISBNと同様の「Mod10 weight 3-1」が使われています。また、大学入試センター試験の受験番号や試験場コードでは、「11で割った」結果を11種のアルファベットで表す、その能力を十分に生かしたチェックデジットが使われています。

こうしてみると、結局のところOCR(パスポートの場合)、バーコード(牛個体番号)、マークシート(大学入試センター)といった光学的な機械読み取りが前提となっているコードにはチェックデジットが抵抗なく、かつ比較的「正しく」導入されてきたのに、事務処理上機械入力されることが前提になっておらず、人による手入力が前提になっている運転免許証などのコードにはチェックデジットが導入されないか、導入されるとしても深く考えられていないものが用いられている傾向が感じられます。何より、事務ミスが問題になって、それを減らすために導入されたはずの基礎年金番号には、チェックデジットが用いられていないようです。これは、結局また別種の事務ミスを誘発しかねず、せっかくの事務効率化のチャンスを無駄にしたように思います。要するに、人手での番号等の入力ミスに対する事務負荷に対する配慮が足りないまま仕様が決定され、展開されてきたのではないでしょうか。

このような状況は、かつて政府内の情報システムにおいて暗号技術が適切に使われていなかった時代があり、標準的な判断基準が求められた結果としてCRYPTRECが生まれたという経緯を想起させられます。つまり、事務処理で用いられるコードに対してどのようなチェックデジットを与えるのが適切かという判断基準がなく、それが(人手の作業も含む)事務処理上の効率化において鍵になるという発想が共有されていないのが問題だろうと思うのです。現在は暗号に対してはCRYPTREC暗号リストという基準ができ、さらに情報システムの調達に関してNISCが中心となったセキュリティ対策基準があり、情報システムの政府調達にあたってはこれらが参照されるようになっています。それと同様に、チェックデジットに限らずICT機器と人が連携して事務処理を行う際に、技術的な勘所に対して何らかの基準を満たすことを促すような仕組みが、国の機関のどこかに必要な気がするのです。マイナンバーのように公共機関内に閉じず国民全体に影響がある制度を設計する際には、そういう視点でのチェックがどこかで入ってほしかったなと、いまさらながら残念に感じています。

P.S.

法人番号の件についてはもう少しわかりやすく書いた資料がこちらにありますのでよろしければご覧ください。
http://www.slideshare.net/tetsutalow/ss-61937495

また、ある法人番号を入力する際にどこか1か所0と9を取り違えたらどのようになるか、というのを確かめられるようなWebサイトを作ってあります。ご自由にお試しください。
http://tetsutalow.github.io/checkcorporatenumber/

【著作権は、上原氏に属します】