教授)題:「マイナンバーのチェックデジットについて」ついにマイナンバー制度の運用が始まりました。個人的にも、年が明けて以来あちこちでの講演などで事務手続きに個人番号の提出を求められる機会が増え、いよいよ始まったということを実感しております。運用を担う自治体現場ではさまざまなシステムトラブルや手続き上のミスが発生してしたり、昨年の年金機構を狙ったサイバー攻撃に対応するため個人番号を扱うシステムを系統分離したりと大変な作業になっていますが、ここをなんとか乗り越えて、行政の効率化にうまく繋げられることを願っています。それこそがこの施策の目的ですから。このマイナンバーですが、この種の多くの番号の例に漏れず、人手での入力間違いが発生しても機械的にすぐわかるように、チェックデジットと俗に呼ばれる1桁が付け加えられており、マイナンバー法では「検査用数字」と呼ばれています。7≦n≦11のときn-5という値とされてます。11は0から10の値をとりますから、これだと検査用数字が1から11になってしまいますが、検査用数字が10と11は0で代用することになってます(省令での表現はちょっと違いますが、答えは同じです)。...って分かりにくいですね。x≧10ならx=0です。これなら、まだしもわかりやすいでしょうか。数学が分かる人なら、この計算式が変だ、ということがお分かりいただけるでしょう。個人番号はランダムに割り振られているとすると、単純に考えると検査用数字が0になる人が、ほかの人の倍いることになりますね。これはどのような影響があるでしょうか。そもそもチェックデジットは誤りを発見するためのものなので、入力間違いがあれば発見できなくてはいけません。入力間違いについては様々な調査が行われていますが、一般に最も多いのは1桁の打ち間違いであり、誤りの60%から90%を占めると言われます。チェックデジットは1桁の打ち間違いは確実に検出できるように設計されるべきです。実際、多くのチェックデジットはそういう設計になっています。マイナンバーのこの数式では、1桁の数字を誤ると、上記数式中のΣ式の値の差が該当するQnの値の倍数だけ増減します。この「ずれ」は必ず2から7のいずれかの数の倍数になりますが、11は素数ですのでこの「ずれ」を割ると余りは必ず0以外になり、結果として検査用数字が変わるので検出できるはずでした。ところが、この11の余りが0と1の時に検査用数字を0とするとしてしまったために、元の検査用数字が0で、かつ誤りの前後でΣ式が(11m±1)(mは整数)だけ変化する場合に、その誤りを検出できない場合が出来ています。最上位桁が元の値より2大きい値(例えば1を3)に誤るとΣ内が12増えますから、このような場合に該当します。そこでちょっとモンテカルロ法で調べてみたところ、個人番号の検査用数字は1桁誤りの約1.66%を見逃してしまうことが分かりました。この見逃しは検査用数字が0の時のみ発生しますので、この場合に限ると実に1桁誤りの約9.1%を検出することが出来ません。これではチェックデジットとしては失格と言っていいでしょう。してこんなことになってしまったのでしょうか。チェックデジットとして、「各桁に異なる重みをつけた値を乗じてから足し合わせて11で割った余りを使う」という手法はMod11法などと呼ばれ、比較的誤り検出能力が高いことは昔から知られていまして、例えば書籍につけられていたISBN10と呼ばれる10桁番号で使われていました。この場合はチェックデジットとして0~9に加えてXという文字も使われており、チェックデジットの11通りの組み合わせを正しく表現しています。逆に言えば、Mod11法の高い性能を生かすには、チェックデジットが11通りの表現ができるように工夫をするか、もしくはそもそも11で割った余りを計算するときに特定の値が出るような番号を割り当てに使わないことが必要です。使われるのは、11で割った値が0になったらチェックデジットを0、1になった時はそもそもその数字を割り当てずエラーとし、残りは11からその値を引いたものとするものです。個人番号の割り当てにおいても、検査用数字の計算式中のΣ式の値が11m+1になるときは避け、検査用数字の定義上もエラーとするべきだったはずですが、そうなっていないのは失敗といってもいいでしょう。この事態を回避するには、そもそも検査用数字が0になるような個人番号を使わない、という手があります。してしまうと個人番号の空間のうち2/11=18.2%が使えなくなってしまいますが、おそらくそれでも十分数は足りると思うので運用上問題はないはずです。私の家族の個人番号はみな検査用数字が0ではないのですが、皆さんの中で検査用数字が0になっている方はいらっしゃいますか?もし、総務省が土壇場で気が付いて検査用数字が0の場合を除外した運用をしてくれていたら随分助かるのですが、個人番号はすでに広く附番されている住民票コードから生成される関係で、それもなかなか技術的に面倒でもあります。個人番号は割り当てられてしまったので言っても仕方がないことではありますが、検査用数字の計算式は本来どうあるべきだったかを少し考えてみましょう。チェックデジットとして11で割った余りではなく、10で割った余りを使う手法はMod10法と呼ばれ、例えばISBN10の後継として2007年から使われているISBN13や、多くの商品にバーコードとしてついているJANコード、クレジットカード番号などにも使われています(各桁にかけ合わせる「重み」にいくつかの流儀がありますが)。Mod10法は(正しく設計されていれば)1桁の誤りは確実に検出できますが、その次に多い入力誤りである「隣り合う2桁の数字の順序を入れ替えて入力してしまう」誤りを検出できない場合があります(この種の誤りは誤り全体の10%から20%を占めるといわれます)。実はMod11法は、正しく実装されていれば入れ替え誤りも必ず検出できます。ところが個人番号の検査用数字の場合はまたしても0が災いして、全体では約1.84%、検査用数字が0の場合に限れば約9.6%、さらに検査用数字が1の場合の約1%の入れ替え誤りを検出できないようです(またしてもモンテカルロ法で調べました)。チェックデジットとして0~9の10通りを使う方法でこの入れ替え誤りを必ず検出できる手法は、Mod10法のように線形式を使う手法では実現が難しいということが分かっています。ところが、群論を用いると入れ替え誤りにも完全に対応した手法が実現できます。Verhoeffの名を取ってVerhoeff法と呼ばれます。アルゴリズム自体はWikipediaにも紹介されています(※1)ので省略しますが、Verhoeffは同時に数字の入力誤りについても子細に調べて発表しており、その他の起きやすい誤りのパターンや、オランダ語の数字の発音から起きやすい誤りにもアルゴリズムを対応させるなど、大変貴重な研究成果を残してくれています。このVerhoeff法はやや複雑で実装しにくいことから「知る人ぞ知る」アルゴリズムで、広く使われる番号に使われる例はあまり聞きませんでしたが、2010年からインドで始まった国民ID制度AADHARで使われているようです。Dammが、亜群の一つである準群(quasi-group)を用いて、Verhoeff法と同様に全ての入れ替え誤りを検出できる上に簡単に実装できる優れたアルゴリズムを発表しました。この手法、Damm法のアルゴリズムはやはりWikipediaに譲っておきますが(※2)、縦横10の表を1つ持つだけで容易にチェックデジットが計算できる大変優れた手法です。Singapore)が2014年から知財に割り振る番号のチェックデジットに使い始めたそうでして(※3)、それなら深刻な国際特許問題もないのだろうと思います。個人的には、個人番号の検査用数字はこれにするとよかったのでは...と思っています。今となっては遅すぎますが。https://blog.cantab-ip.com/2014/01/20/new-format-for-singapore-ip-application-numbers-at-ipos/ところで、マイナンバーにはもうひとつ、法人番号があります。こちらの検査用数字にはMod9法という少しマイナーな方法が使われていますが、数学的にはまだしも個人番号よりは筋がよいと思います。これについても誤り率を議論したいところですが、長くなるのでそれはまた稿を改めて書きたいと思います。technology.。