ルーン・アルゴリズム計算機 - クレジットカードとIMEIの検証
ルーンアルゴリズム(mod10チェックサム)を使って、クレジットカード番号やIMEI、カナダの社会保険番号など各種ID番号が正しい形式かどうかを検証する無料の計算ツール。桁ごとの計算過程を表示し、ソフトウェアのテストやシステム開発向けに有効な番号を即座に複数生成することもできる。
ルーン・アルゴリズム計算機
数字がルーン・モッド10検証を通過するかチェック
ドキュメンテーション
ルーンアルゴリズムとは何か?
ルーンアルゴリズムは、mod 10アルゴリズムとも呼ばれ、数字の並びが有効な識別番号になり得るかを確認する公式です。クレジットカード番号、携帯電話のIMEI番号、その他のIDコードの入力ミスを、エラーが発生する前に検出するために使われます。IBMの技術者ハンス・ペーター・ルーンが、1954年に出願した特許でこの方法を説明しました。
このアルゴリズムは、番号が実在するか、現在有効かを証明するものではありません。数字が想定されたパターンに従っていることだけを確認します。カード番号がルーンチェックに合格しても、偽造、期限切れ、または利用可能な残高がない可能性があります。
ルーンチェックサムの計算方法
このチェックでは、番号の数字を右から左に読み取ります。
- 右から二番目の数字を起点に、一つおきに各数字を二倍します。
- 数字を2倍した結果が9より大きい場合は、そこから9を引きます。(これは、結果の2桁を足すことと同じです。したがって、16は1 + 6 = 7となり、同様に16 − 9 = 7となります。)
- 二倍した数字(調整後)と、そのまま残した数字をすべて合計します。
- 合計が10で割り切れれば、その番号は有効です。割り切れなければ無効です。
事業者が新しいID番号を発行するときは、同じ手順を逆に使います。最後の1桁以外のすべての数字を選んでチェックを実行し、合計が10で割り切れるように最後の「チェックデジット」を選びます。
実例:カード番号の検証
テスト番号 4532015112830366を使います。
- 右から左に並べた数字:6、6、3、0、3、8、2、1、1、5、1、0、2、3、5、4
- 一桁おきに各数字を2倍する:6、12、3、0、3、16、2、2、1、10、1、0、2、6、5、8
- 9を超える結果から9を引く:6、3、3、0、3、7、2、2、1、1、1、0、2、6、5、8
- すべてを合計する:6+3+3+0+3+7+2+2+1+1+1+0+2+6+5+8 = 50
- 50は10で割り切れるため、この番号は有効です。
実例:無効な番号
490154203237517を使います。これはIMEI番号で使われる形式の15桁の番号です。
同じ手順を実行すると、合計は59になります。59は10で割り切れないため、この番号は無効です。
有効な番号にするには、最後の数字だけを変更すればよいことになります。最後の数字に可能な値を1つずつ試すと、最後の数字を8にした場合、合計は60となり、10で割り切れます。したがって、490154203237518は有効なルーン番号であり、0から9までのその他の最後の数字(8を除く)では無効になります。
この計算機の使い方
計算機には、Actionボタンを使って選択する2つのモードがあります。
Validateは、入力中の番号を検証します。ボタンを押す必要はありません。入力欄に数字が入るとすぐに結果 が表示され、その下の手順別の内訳 には、各数字、2倍して桁を合算した後の寄与値、 および合計が示されます。
Generateは、チェックに合格する番号を生成します。入力 欄にすでに入力されている数字は、新しい番号の先頭部分として残されます。計算機は残りの部分を ランダムな数字で埋め、チェックディジットを追加します。結果は16桁で、 一般的な決済カード番号の長さになります。ただし、入力された数字が すでに16桁以上の場合は、結果は入力された数字より 1桁長くなります。
入力中の空白、ハイフン、ピリオドは無視されるため、「4532 0151 1283 0366」と 「4532-0151-1283-0366」は、数字だけの場合と同じように読み取られます。その他の 文字(文字など)が含まれている場合は、エラーメッセージを表示して拒否されます。
ルーンアルゴリズムの用途
- 決済カード。 Visa、Mastercard、American Expressなどのネットワークは、カード番号全体がルーンチェックに合格するように番号を設定しています。決済処理業者に問い合わせる前に、決済フォームで入力された数字の誤りを検出できます。
- IMEI番号。 携帯電話などの移動体通信機器に割り当てられる15桁の識別番号には、ルーンチェックディジットが含まれています。
- カナダ社会保険番号。 9桁のSINには同じチェックが使われます。
- 米国の国家プロバイダー識別子(NPI)。 米国の医療提供者には、ルーンアルゴリズムに基づく検査によって検証された10桁のNPIが付与されます。
ルーンアルゴリズムで検出できないもの
このアルゴリズムは、どの数字であっても、またどの位置にあっても、一桁だけの入力ミスを必ず検出します。また、隣接する二桁の入れ替え(「39」と入力すべきところを「93」と入力する場合)もすべて検出しますが、唯一の例外があります。それは、0と9を隣り合わせで入れ替える場合で、たとえば「09」が「90」になるケースです。
また、同じ数字二つの組を別の同じ数字二つの組に置き換える「双子」エラーを三種類見逃します。22を55と読み違える場合、33を66と読み違える場合、44を77と読み違える場合です。こうした検出漏れの種類は既知で限定的なため、ルーンチェックは通常の入力ミスの検出には信頼できますが、それだけで完全なエラー検出システムとはみなされません。
ルーンチェックはセキュリティチェックではない
ルーンアルゴリズムは、不正行為ではなく、偶発的なデータ入力ミスを検出するために設計されました。チェックに合格した番号は数学的に正しい形式になっているだけです。実際の決済セキュリティは、ルーンチェック後に追加されるカードのCVVコード、住所確認、3-Dセキュア認証など、別の層に依存します。ルーンチェックは、時間のかかる後続のチェックに先立って実行される、単純で低コストな最初のフィルターにすぎません。
JavaScriptで番号を検証する
1function isValidLuhn(number) {
2 const digits = number.replace(/\D/g, '').split('').map(Number);
3 if (digits.length === 0) return false;
4
5 let sum = 0;
6 let doubleDigit = false;
7 for (let i = digits.length - 1; i >= 0; i--) {
8 let d = digits[i];
9 if (doubleDigit) {
10 d *= 2;
11 if (d > 9) d -= 9;
12 }
13 sum += d;
14 doubleDigit = !doubleDigit;
15 }
16 return sum % 10 === 0;
17}
18空の入力に対するガードは重要です。空文字列の数字の合計は0であり、0は10で
割り切れるため、ガードがなければ関数は何もない空文字列を
有効な番号として扱ってしまいます。番号を検証する代わりにチェックディジットを求めるには、チェックディジットより前の数字に対して同じループ
を実行します。ただし、最後の数字から二倍を開始し、
その後、(10 - sum % 10) % 10を求めます。
よくある質問
ルーンアルゴリズムは何に使われるか?
クレジットカード番号、IMEI番号、カナダのSINなどの識別番号が内部的に整合しているかを確認します。処理エラーが発生する前に、入力ミスや数字の入れ替えを検出します。
ルーンアルゴリズムのエラー検出精度はどの程度か?
1桁だけの入力ミスをすべて検出し、隣接する2桁の入れ替えのほぼすべてを検出します。見逃す入れ替えは、0と9が隣り合っている場合だけです。また、3種類の特定の「双子」置換、つまり22を55にする場合、33を66にする場合、44を77にする場合も見逃します。
有効なルーン番号なら、カードは実在するのか?
いいえ。このチェックで確認できるのは、数字が想定されたパターンに合っていることだけです。カードが存在するか、有効な状態か、利用可能な残高があるかは分かりません。事業者はそのために、CVVコードなどの別のチェックを追加します。
ルーンチェックはコンピューターなしで実行できるか?
はい。必要なのは二倍、減算、加算だけなので、手計算や簡単な計算機で実行できます。これは、デジタルコンピューターが普及する前のパンチカード時代を想定した、当初の設計の一部でした。
生成された番号は実在するカード番号か?
いいえ。ジェネレーターが生成するのは、ルーンチェックを満たす数字の並びだけです。生成された番号は 入力フォームのテスト用です。銀行が発行したものではなく、何かの支払いに 使うこともできません。
なぜmod 10アルゴリズムと呼ばれるのか?
最後の手順で、合計が10でちょうど割り切れるかを確認するためです。数学ではこれを「sum mod 10 = 0」と表します。「mod」はmoduloの短縮形で、除算後に残る余りを意味します。
ルーンアルゴリズムを発明したのは誰か?
IBMの技術者ハンス・ペーター・ルーンが、1954年に出願した特許(1960年に米国特許2,950,048として登録)でこの方法を説明しました。彼は、コンピューターによるテキスト索引付けの初期研究でも知られています。