Luhn チェックサム計算機 | クレジットカード番号と IMEI の Mod 10 を per-digit テーブルで開く
クレジットカード番号や IMEI、カナダの SIN で使われる Luhn アルゴリズム (Mod 10) を、検証と生成の 2 モードで計算するツール。各桁の倍化、digit-sum、累積和を 5 列テーブルで表示するので、Python や Go で書いた自作の Luhn 実装と桁単位で照合できる。
💡 このツールについて
Stripe や Square の testmode で動作確認をしていると、自前で組んだチェックサム関数が参照実装と一致しないことがある。「Invalid と出るが原因が分からない」という場面で詰まると、デバッグ用に小さな手計算スクリプトを書き、それも疑わしくなって参照ツールを探す、というループに入りがちだ。
ほとんどのカードバリデーター系ページは Valid / Invalid の verdict しか返さない。それでは「12 桁目の倍化結果が 10 になり、digit-sum 1 を加える」というレベルでの突き合わせはできない。原因が桁の並びにあるのか、倍化対象の選び方にあるのか、digit-sum を取り忘れているのか、それぞれで修正箇所が違う。
このツールは VERIFY モードで完全な番号 (チェック数字を含む) の妥当性を判定し、GENERATE モードでチェック数字を除いた部分から末尾 1 桁を逆算する。両モードとも、右端からの位置インデックス・桁の値・倍化値・digit-sum・累積和を 5 列で開示する。自作実装の出力を横に並べて差分を取れば、どの桁で計算が分岐したかが直接読める。
入力欄はクレジットカード形式の空白区切り (4532 0151 1283 0366) でもハイフン区切り (4532-0151-1283-0366) でも受け付け、内部で数字のみを抽出してから計算する。
🧐 よくある質問
Q. VERIFY と GENERATE はいつ使い分ける? A. VERIFY は「すでに完成した番号 (チェック数字含む) の妥当性を確かめたい」とき、GENERATE は「チェック数字を除いた部分から末尾 1 桁を逆算したい」とき。GENERATE は testmode カード番号を自前で合成するときや、IMEI のチェック数字を手で振りたいときに使う。
Q. IMEI でも使える? A. 使える。IMEI 15 桁の末尾はチェック数字で、Luhn (Mod 10) と同じアルゴリズムで決まる。15 桁の IMEI を VERIFY に貼れば判定できるし、TAC + serial の 14 桁だけ持っている場合は GENERATE で末尾を求められる。
Q. カナダの SIN (社会保険番号) も同じ?
A. SIN 9 桁も Luhn (Mod 10) で検査される。046 454 286 のような 9 桁をそのまま VERIFY に入れて妥当性を確認できる。スペースやハイフンの有無は問わない。
Q. 倍化結果が 9 を超えたときの計算は?
A. 倍化結果の桁を分けて digit-sum を取る。8 × 2 = 16 なら 1 + 6 = 7。実装上は等価な doubled - 9 (5〜9 を倍化したケースで成立) でも書けるが、このツールは原典どおりに digit-sum 形式で表示する。
Q. クレジットカード以外のチェックサム規格にも使える? A. Luhn (Mod 10) を採用しているものなら使える。クレジットカード (ISO/IEC 7812)、IMEI (3GPP TS 23.003)、カナダ SIN、米国 NPI (医療従事者識別番号) は同じアルゴリズム。一方 ISBN-10 は Mod 11、ISBN-13 / EAN は別の重み付け Mod 10 で計算式が異なるので、このツールでは判定できない。
Q. 何桁まで入力できる? A. ハード上限は設けていない。クレジットカードの 16 桁、Amex の 15 桁、IMEI の 15 桁、SIN の 9 桁、社内の独自フォーマットでも動作する。極端に長い場合はテーブルが縦に伸びるだけで計算式は同じ。
📚 豆知識
Luhn アルゴリズムは IBM の研究者 Hans Peter Luhn が 1954 年に考案し、1960 年に特許 US 2950048 を取得した。Luhn 自身は全文検索の先駆けにあたる KWIC (Key Word in Context) インデックスの発明者として知られる人物で、Mod 10 の検証式は彼の業績のごく一部にすぎない。
設計の狙いは厳密で、1 桁の入力ミスと、隣接 2 桁の入れ替え (ただし 0 ↔ 9 の組を除く) を検出できる最小限のチェックに留められている。暗号学的強度はなく、攻撃者が Mod 10 を満たす番号を生成すること自体は防げない。あくまで POS 端末の誤読や、手書きの番号を人が読み違えたケースを弾くための「人為的ミス検出層」として設計された。
特許は 1977 年に失効し、ちょうどその時期に Visa や MasterCard が国際的なカード番号フォーマットを ISO/IEC 7812 として標準化した。タイミングが綺麗に重なったことで、現代発行されるほぼ全てのクレジットカードと IMEI が、半世紀以上前の手書き伝票時代の発明をいまだに末尾 1 桁で受け継いでいる。