Webサイトや実店舗での買い物で、クレジットカードや会員番号を入力したとき、打ち間違いがあると「入力ミスがあります」と出る時があります。しかも、データベースへの照合を行う前に間違いが分かることがあり、不思議に思ったことはないでしょうか。実はこれ『チェックディジット』という仕組みによるものです。今回は、この仕組みを利用して、実際に入力ミスを検出するツールを作ってみましょう。
クレジットカードのチェックディジットについて
クレジットカードの番号や会員証番号の打ち間違いを検出する『チェックディジット』というのは、誤り検出訂正の一種です。カード番号などの各桁を足したり割ったりして、番号が正しいかを調べています。なお、クレジットカード番号は『ルーンアルゴリズム』という計算方法を利用して打ち間違いを検出できるように工夫されています。クレジットカードの番号のほか、カナダ社会保険番号、携帯電話の識別番号のIMEI番号など、様々な番号で採用されています。
ルーンアルゴリズムの計算方法
それでは、ルーンアルゴリズムの計算方法を確認してみましょう。これは、カード番号の各桁を以下の規則に従って計算することで、入力の誤りを検出するものです。
・(1)カード番号の奇数桁を足し合わせる。
・(2)カード番号の偶数桁を二倍して足し合わせる。ただし10以上ならば9を引く。
・(3)上記(1)と(2)を足し合わせて、10で割って割り切れれば、カード番号は正しい。
ちなみにカード番号の桁ですが、右から数えて(向かって左、0から)何桁目かの偶数か奇数かを判定します。
計算方法を試してみよう
ここで、よくクレジットカード番号のサンプルとして用いられている『3566002020360505』という番号を例にとって計算してみましょう。
まずは、(1)奇数桁を足し合わせます。
[奇数桁を足し合わせる]
5+6+0+0+0+6+5+5 = 27
次に、(2)偶数桁を取り出してみましょう。
[偶数桁を取り出す]
3 6 0 2 2 3 0 0
このとき、数字を二倍したものを足し合わせましょう。ただし、二倍して10以上になるもの(5から9)については、その値から9を引いた値を足し合わせます。例えば、6ならば二倍して12になるので、12-9で3となり、3を足す値として採用します。
[二倍したものを足し合わせる]
6+(12-9)+0+4+4+6+0+0 = 23
最後に(1)と(2)を足したものを10で割った余りを調べます。
(27 + 23) = 50
50 % 10 = 0
確かに、0となったので、このクレジットカードの番号は正しいということになります。
プログラミングで検証してみよう
それでは、これを日本語プログラミング「なでしこ」のプログラムで確かめてみましょう。なでしこのWebサイトの簡易エディタに以下のプログラムを貼り付けて試してみましょう。
●(カード番号を)クレジットカード番号検証するとは # --- (*1)
合計値=0
L=カード番号の文字数
Nを1からLまで繰り返す # --- (*2)
C=カード番号で(L-N+1)から1文字抜き出す。# --- (*3)
もし、N%2=0ならば # --- (*4)
C=C×2
もし、C>9ならば、C=C-9。
ここまで
合計値=合計値+C # --- (*5)
ここまで。
それは(合計値%10=0)# --- (*6)
ここまで。
#--- 実際の値で確認してみる ---
「3566002020360505」をクレジットカード番号検証。
もし、それがOKならば「正しい」と表示。違えば「間違い」と表示。
「4242424242424242」をクレジットカード番号検証。
もし、それがOKならば「正しい」と表示。違えば「間違い」と表示。
「378282246310005」をクレジットカード番号検証。
もし、それがOKならば「正しい」と表示。違えば「間違い」と表示。
「実行」ボタンを押すと、プログラムが実行されて、結果を確認できます。
プログラムを確認してみましょう。(*1)の部分では、関数『クレジットカード番号検証』を定義しています。この関数にはカード番号という引数を1つ与えるものです。そして、(*2)の部分では、カード番号の文字数分だけ繰り返し処理を行います。(*3)の部分では、カード番号の右からN番目の文字を1文字抜き出します。(*4)では偶数桁の時の処理を記述します。偶数桁ならば、値を二倍し、それが9超であれば9を引くという処理です。(*5)の部分で値を足し合わせます。(*6)では10で割った余りを求め、それが0と等しいかどうかを求め、それを関数の結果にします。
実用的なカード番号チェックアプリに仕上げよう
ここまでの手順で、クレジットカード番号を検証するプログラムを作りました。そこで、この関数を利用して、もう少し実用的なツールを作ってみましょう。
# --- カードをチェックするUIをHTMLで構築 --- (*1)
UI=『<h1>カードチェック</h1>
<p id="cardform">カード番号:
<input type="text" id="card" value="3566002020360505" size=40>
<span id="result">...</span></p>
』
「#nako3_div_1」にUIをHTML設定。
# --- イベントを設定 --- (*2)
「#card」のキー離した時には
「#card」のテキスト取得して、クレジットカード番号検証。
もし、それがOKならば
結果は「OK」。
スタイルは{"background-color":緑色}
違えば
結果は「NG」。
スタイルは{"background-color":赤色}
ここまで。
「#result」に結果をHTML設定。
「#cardform」にスタイルをDOMスタイル一括設定。
ここまで。
# --- カード検証用関数 --- (*3)
●(カード番号を)クレジットカード番号検証とは
合計値=0
L=カード番号の文字数
Nを1からLまで繰り返す
C=カード番号で(L-N+1)から1文字抜き出す。
もし、N%2=0ならば
C=C×2
もし、C>9ならば、C=C-9。
ここまで
合計値=合計値+C
ここまで。
それは(合計値%10=0)
ここまで。
同じように、なでしこ簡易エディタにプログラムを貼り付けて実行してみましょう。以下の画面のように、正しいカード番号を入力すると、緑色になり、間違った番号を入力すると、赤色になります。
プログラムの(*1)の部分では、HTMLでカードチェックのためのUIを指定します。(*2)の部分では、キーイベントを監視して、クレジットカード検証関数を呼び出して結果を表示します。(*3)の部分は、カード検証用の関数を定義しているものです。
まとめ
以上、今回はクレジットカード検証のためのプログラムを作ってみました。このために、ルーンアルゴリズムを利用しました。この検証方法はそれほど難しいものではないので、12行程度の短いプログラムでも確認できるものでした。簡単なチェックでカード番号の入力ミスを指摘できるのは便利です。
実際、クレジットカードを入力してもらうようなWebサイトを作ることは多くないかもしれません。しかし、何かしらの会員証を発行するような機会があるかもしれません。そのような時に、会員番号にこうした間違いチェックの仕組みを仕込んでおけば、会員番号の入力ミスを防ぐことができます。覚えておくと便利でしょう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。