SlideShare a Scribd company logo
マイナンバーの
チェックデジットが
かなり恥ずかしい件について
立命館大学情報理工学部
元・総務省職員
Disclaimer!!
本発表は個人の見解であり
発表者の元職場や現職場の
公式見解とは関係がないし
そもそも担当じゃないので
守秘義務にも抵触してません!
世の中、番号がいっぱい!
社員番号
学籍番号
ISBN JAN/UPC/GS1
銀行口座番号
クレジット
カード番号 IMEI
IMSI個人番号
法人番号
マイナンバー
手入力する場合がある
間違えると困る
電子的に入力ミスを防ぎたい
これをDB照合なしにやるには…
•桁数チェック
•検査用数字
(Check Digit)
JAN(GS1)コードの
チェックデジット
10 −
𝑛=1
𝑃𝑛 × 𝑄 𝑛 𝑚𝑜𝑑 10 𝑚𝑜𝑑 10
𝑃𝑛はチェックデジットを除いた
最下位を1とした時の数字
𝑄 𝑛は奇数ケタは3 偶数ケタが1
具体例
綾鷹500mlのJANコード
↓
82 mod 10 = 2
× ×
Code 4 9 0 2 1 0 2 1 0 7 6 4 8
重み 1 3 1 3 1 3 1 3 1 3 1 3
乗算 4 27 0 6 1 0 2 3 0 21 6 12
合計
82
× × × × × × × × × × × ×
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
ところで…
桁数があってる場合の
入力ミスといえば
•1桁入力誤り(8割くらい)
•2桁入替誤り(1割くらい)
他もあるがこれらがほとんど
Verhoeffによる調査(郵便番号)
誤り
桁数
誤りの種
類
誤り数 頻度
1 単純誤り 9,574 79.05%
2
入替 1,237 10.21%
双子
(aa→bb)
67 0.55%
似た音
(1a→a0)
59 0.49%
その他の
2桁
232 1.92%
飛び越し
入替
99 0.82%
飛び越し
双子
35 0.29%
他の飛び
越し誤り
43 0.36%
その他 98 0.81%
3 169 1.40%
4 118 0.97%
5 219 1.81%
6 162 1.34%
Total 12,112
誤りの種類 誤り数 頻度
1桁単純 9,574 79.05%
2桁入替 1,237 10.21%
Wikipedia:
Verhoeff
Algorithmより
先に結論
GS1のチェックデジットは
•1桁入力誤りは必ず検出
•2桁入替誤りは
入れ替えた数字の差が5
なら検出できない
具体例
綾鷹500mlのJANコードの先頭2桁を入替え
↓
72 mod 10 = 2
× ×
Code 9 4 0 2 1 0 2 1 0 7 6 4 8
重み 1 3 1 3 1 3 1 3 1 3 1 3
乗算 9 12 0 6 1 0 2 3 0 21 6 12
合計
72
× × × × × × × × × × × ×
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
クレジットカードの
チェックデジット(Luhnアルゴリズム)
10 −
𝑛=1
𝑃𝑛 × 𝑄 𝑛 𝑚𝑜𝑑 10 𝑚𝑜𝑑 10
𝑃𝑛はチェックデジットを除いた数字
𝑄 𝑛は奇数ケタは2 偶数ケタが1
但し乗算結果が2桁の時は
1桁数字2つ分として加算
先に結論
Luhnのアルゴリズムは
•1桁入力誤りは必ず検出
•2桁入替誤りは
入れ替えた数字が0と9
なら検出できない
ISBN-10の
チェックデジット(mod 11)
11 −
𝑛=1
𝑃𝑛 × 𝑄 𝑛 𝑚𝑜𝑑 11 𝑚𝑜𝑑 11
𝑃𝑛はチェックデジットを除いた数字
𝑄 𝑛はn (ISBN-10は10桁なので1~9)
答えが10の時はXとする
先に結論
ISBN-10のチェックデジットは
•1桁入力誤りは必ず検出
•2桁入替誤りも必ず検出
完璧!
だがチェックデジットは11種
マイナンバーの個人番号の
チェックデジット(mod 11改)
11 −
𝑛=1
𝑃𝑛 × 𝑄 𝑛 𝑚𝑜𝑑 11 𝑚𝑜𝑑 11
𝑃𝑛はチェックデジットを除いた数字
𝑄 𝑛はn+1(1≦ n≦6) n-5(7≦ n≦11)
答えが10の時は0とする
これで数字だけで表現可能に
先に結論
個人番号のチェックデジットは
•1桁入力誤りは必ず検出
•2桁入替誤りも必ず検出
但しチェックデジットが
0と1以外の場合に限る
チェックデジットが0の人は大当り!
チェックデジットが0なら
•1桁入力誤りは1割見逃す
•2桁入替誤りも1割見逃す
※チェックデジットが1の時は
2桁入替の一部を見逃す
実証します
誰か止めなかったのか!
•いや、止めましたよ私…
(パブコメで突っ込んだ)
•回答:
「住民票コードで実績あるので
問題ないと考えている」
いろいろ調べたら…
•どうやら起源は運転免許証番号
(右から2桁目がチェックデジット)
11 −
𝑛=1
𝑃𝑛 × 𝑄 𝑛 𝑚𝑜𝑑 11 𝑚𝑜𝑑 10
実に昭和41年のことらしい…
𝑄 𝑛はn+1(1≦ n≦6) n-5(7≦ n≦10)
恥ずかしくないですかこれ…
S務省…H務省…
算数できないんか…
実は法人番号も別の方向に酷い
詳しくは検索して下さい
もっとマシな方法はないの?
チェックデジットの計算方法で
•1桁入力誤りは必ず検出
•2桁入替誤りも必ず検出
かつチェックデジットが
0~9の数字で表現可能
2つ知られている
•Verhoeffのアルゴリズム
•インドのマイナンバーで使用
•Dammのアルゴリズム
•シンガポールの特許番号で使用
どちらも群論を使う
詳しくはWikipediaで
私のオススメ
チェックデジットの
数式を決める機会が
今後の人生にあれば
絶対Dammアルゴリズム!
DumbでもDamnでもない!

More Related Content

CSS2017キャンドルスターセッション