チェックディジット:Luhn、バーコード、ISBNと見逃される間違い

カード番号、IMEI、バーコード、あるいはISBNを入力し、検証に使用する方式を選んでください。各桁がどのように寄与するか、そしてその番号が正しいかどうかを表示します。さらに、一つのミスで生じうるすべての入力間違いを試し、チェックディジットが検出できないものを一覧表示します。

インタラクティブシミュレーションを読み込んでいます...

レッスン

理論 — チェックディジット:Luhn、バーコード、ISBNと見逃される間違い

チェックディジットとは、番号全体がある規則を満たすように追加される一桁の数字のことです。ここでは、各桁の数字に位置に応じた係数を掛けたり変換したりして足し合わせた合計が、10や11といったモジュラス(法)の倍数になるという規則です。規則から外れる間違いは検出されます。規則を満たしてしまう間違いは検出されないため、チェックディジットは番号が間違っていることを証明できても、正しいことを証明することは決してできません。

各記号の意味

dᵢ
右からi番目の桁の数字。チェックディジットはd0
wᵢ
位置iの重み。バーコードの場合は交互に1と3、ISBN-10の場合はi + 1
D(d)
Luhn方式の2倍操作:2d。ただし9を超える場合は9を引くため、0 2 4 6 8 1 3 5 7 9となる
S
各桁からの寄与の合計
m
モジュラス。Luhn方式とバーコードは10、ISBN-10は11。Sがmの倍数になる場合に検証を通過する
前提
一度に起こる間違いは一つであると仮定しています。一つの番号で二つの間違いが起こると互いに相殺される可能性があり、このページの集計ではそれらを考慮していません。また、比較表ではすべての数字のペアが同じ確率で出現するものとして計算していますが、実際のタイピングはそうではありません。Luhn方式が見落とす隣り合う数字のペアは09と90だけですが、この二つがどれくらいの頻度で隣り合うかは、どのような番号を扱うかに依存します。
成り立たない場合
チェックディジットはセキュリティではありません。方式を知っている人なら誰でも検証を通過する番号を作ることができます。Luhn方式を通過したカード番号は単に正しく入力された番号に過ぎないというのはこのためです。また、ISBN-13がバーコードの方式を使用しているのも、ISBN-13自体がGS1の提供する978や979というプレフィックスのもとで作られたバーコード番号だからです。

Luhn方式が見逃す隣り合う数字の入れ替えは一種類のみ:09と90 🖖

1234567890 + チェックを押してください。9と0を入れ替えた12345678093も検証を通過します。Luhn方式では一つおきに数字を2倍し、それが二桁になった場合は各桁の数を足し合わせます。つまり、9は18になりその後9に、0は0のままです。隣り合う二つの数字を入れ替えると、2倍する操作によってそれぞれの数字に加えられる値の差だけ、合計値が変動します。この操作によって、0には0が、1には1が、4には4が、5には−4が、8には−1が、そして9には0が加えられます。まったく同じように処理されるのは0と9の二つの数字だけです。左側のグリッドで赤くなっているセルが09と90の二つだけなのはこのためであり、この方式は隣り合う数字の入れ替えの97.8%を検出します。IMEIを押してみてください。0の隣に9はなく、13個ある隣り合う数字の入れ替えは一つも通過しません。

mod 10の足し算で作られたチェックディジットは、すべての入れ替えを検出することはできない 🖖

UPCバーコードを押してください。九つある隣り合う数字の入れ替えのうち、3と8、そして0と5の二つが通過します。バーコードでは一つおきに数字を3倍および1倍するため、aとbを入れ替えると合計値は2(a − b)だけ変化します。これは差が5になるたびに10の倍数となります。90組あるペアのうち10組がこれに該当します。他の重みを使っても結果は良くなりません。一つの数字の間違いをすべて検出するには、重みがmod 10で1、3、7、あるいは9である必要がありますが、これらのうちどの二つを取っても差は偶数になります。そして偶数に5を掛ければ10の倍数になるため、どのような重み付けであっても検出率の上限は88.9%となります。Luhn方式の2倍する操作は重み付けではなく、その検出率は97.8%に達します。しかし、100%には届きません。各桁の数字を最初にどのように変換しようとも、モジュラスが偶数の場合は、数字を足し合わせる方式ですべての数字の間違いや隣り合う数字の入れ替えを検出することは不可能であるとH. P. Gummが1985年に証明したことをGallianが紹介しています。J. Verhoeffは1969年に、かける順序が影響する五角形の二面体群での乗算を用いることで、その両方の検出を実現しました。

Luhn方式は、一つ飛ばしでの数字の入れ替えを一切検出できない 🖖

IMEIを押してください。12個ある一つ飛ばしでの入れ替えは、すべて検証を通過します。この二つの数字はパリティが同じ位置にあるため、Luhn方式では両方を2倍するか両方ともそのままにするかのどちらかになり、バーコードでは両方に同じ重みが与えられます。したがって、これらを入れ替えても合計値は変わらず、比較表でも両方式の検出率は0.0%となっています。ISBN-10では10から1まで各桁に独自の重みを与えるため、入れ替えると合計値は「二つの重みの差」に「二つの数字の差」を掛けた分だけ変化します。11は素数であるため、その積が11の倍数になることはありません。ISBN-13を押してからISBN-10を押してみてください。同じ番号でも、前者は9個あるそのような入れ替えの9個すべてを通過させてしまうのに対し、後者は6個中0個です。これは珍しい間違いであり、Verhoeffの集計による実際の入力ミスでは、隣り合う数字の入れ替えが10.2%であるのに対し、この間違いはわずか0.8%です。しかし、mod 11にも欠点があります。チェックディジットの10を表すためにXという記号を使う必要があり、さらに重みの和が11になる6と5の位置では、連続する数字の入力ミスをすべて通過させてしまいます。

全プロセスの詳細解説

  1. ISBN-10の汚れて読めない数字の復元 4 ステップ

    ISBN-10が0-11-000?22-9となっており、7番目の数字が汚れて読めません。この数字を求め、答えが一つに定まる理由を説明してください。ISBN-10を押して結果を確認してください。

    この問題をツールで開く

    1. 左から右へ10から1まで重みが割り当てられるため、汚れた7番目の数字の重みは4になります。それ以外の九つの数字にそれぞれの重みを掛けて足し合わせます。

    2. 全体の合計が11の倍数にならなければならないため、欠けている数字の4倍がその差額を埋める必要があります。

    3. 11は素数なので、mod 11では割り算が可能です。4 × 3 = 12は11より1大きいため、3を掛けることで4を掛けた操作を元に戻せます。

    4. 2を当てはめると、このページで計算される合計値は44となり、ちょうど11の4倍になります。

    解答

    その数字は2であり、ISBNは0-11-000222-9です。当てはまる数字がこれだけなのは、0から10までの11個の値に4を掛けると、mod 11では11個の異なる余りとなり、そのうちのちょうど一つだけが8になるからです。これは、この方式がこの位置におけるすべての数字の間違いを検出できるのと同じ性質を別の視点から見たものです。つまり、すべての単一の間違いを可視化できる重みは、汚れた一つの数字の復元も可能にするということです。同じ位置で重みが2のmod 10の方式だった場合は、候補が二つになるかゼロになり、さらに正解から5離れた間違った数字をすべて見逃してしまうことになります。

参考文献 (3)