11/17/2015

(番外)マイナンバーとチェックディジット

マイナンバーについての是非はともかく、マイナンバーが12桁の素数だったとか、完全数だったとかをネタにしたtweetが多い。




こう言う誤解もある。

でもここに上がっている12桁の数字は、全てマイナンバーとしては不正な番号。なぜならマイナンバーは11桁の番号部分と末尾1桁のチェックデジットで構成されているから、チェックディジットを計算するとあり得ない組み合わせになってしまうのだ。
チェックディジット(check digit、検査数字)とは、符号の入力誤りなどを検出するために、元の符号に付加される数字のこと
Wikipediaより


これも12個の数字を矢であてて任意に選んでしまうと、最後の数字がチェックディジットとして正しい数字が選ばれることもあれば、選ばれないこともあり得るので当選金が出ない場合がある。


では、マイナンバーのチェックディジットはどのようなロジックで計算されるのだろうか。それは法律で決まり、総務省が次の様な省令を出している。

行政手続における特定の個人を識別するための番号の利用等に関する法律の規定による通知カード及び個人番号カード並びに情報提供ネットワークシステムによる特定個人情報の提供等に関する省令(平成二十六年十一月二十日総務省令第八十五号)

この省令の第5条に計算方法が示されている。

(検査用数字を算出する算式)
第五条  令第八条の総務省令で定める算式は、次に掲げる算式とする。
算式
 11―((n=1(シグマ)11(Pn×Qn))を11で除した余り)
 ただし、(n=1(シグマ)11(Pn×Qn))を11で除した余り≦1の場合は、0とする。
算式の符号
 Pn 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を1桁目としたときのn桁目の数字
 Qn 1≦n≦6のとき n+1 7≦n≦11のとき n―5


分かりにくいので式で表すと:
  • 検査用数字:

    
  但し、
    
  の場合は、0(ゼロ)とする。


  • PnQnの定義
   Pn:個人番号を構成する検査用数字以外の11桁の番号の最下位の桁
     を桁目としたときの n 桁目の数字
   Qn1 ≦ n ≦ 6のとき n+17 ≦ n ≦ 11 のとき n-5

これをRubyのスクリプトを(ファイル名:myNumber.rb)作ってみた。恥ずかしながら公開(あ〜汚いコードだ!)
#! /bin/sh
exec ruby -S -x "$0" "$@"
#! ruby

def imputError
  STDERR.puts "12桁の数字を入力!"
  exit 0
end

str = ARGV[0]
imputError if !(str =~ /[0-9]{12}/)
sum=0

for i in 0..10
  if i>=0 && i<=5
    then j=i+1
  else
    j=i-5
  end
  sum = sum + str[10-i].to_i * (j+1)
end

if (sum % 11) <= 1
  then checkDigit = 0
else
  checkDigit = 11 - (sum % 11)
end

if str[11].to_i == checkDigit
  then print "OK", "\n"
  else print "NG ", "チェックディジットは", checkDigit, "\n"
end
コマンドラインから実行すると次の通り。
>$ myNumber.rb 200560490131
>$ NG チェックディジットは4
>$
>$ myNumber.rb 200560490134
>$ OK
ちなみに政府広報に表示されているサンプルも不正なのだ!

>$ myNumber.rb 123456789012
>$ NG チェックディジットは8

0 件のコメント:

コメントを投稿