カード番号の最後の1桁は何のため?──チェックデジット(Luhn)の仕組み
クレジットカード番号の最後の1桁は、ほかの桁から計算される検査用の数字です。右から1桁おきに2倍して合計が10の倍数なら合格、というLuhnの計算を、架空のテスト番号で1桁ずつ追い、見つけられる誤りと限界、プログラムでの書き方を整理します。
この記事のポイント
- 最後の1桁は検査用。右から1桁おきに2倍し、合計が10の倍数なら合格
- 合格は実在の証明ではない。無作為な番号の10分の1も通る
- 「チェックデジットを整える」でテスト番号の内訳を確認できる
- Q.
- カード番号の最後の1桁は何のためにある?
- A.
- 入力ミスや読み間違いを見つけるための検査用の数字で、チェックデジットと呼ばれます。ほかの桁から計算して決まり、全体の計算結果が合わないと番号の誤りとわかります。カードが実在するかどうかまでは確かめられません。
ネットショップでカード番号を1桁間違えて入力すると、送信する前に「番号が正しくありません」と表示されることがあります。カード会社に問い合わせたわけではないのに、なぜ番号の誤りがわかるのか。その仕組みが、番号の最後の1桁にあるチェックデジットと、Luhn(ルーン)アルゴリズムです。
この記事では、架空のテスト番号だけを使って、計算の手順、見つけられる誤りと見つけられない誤りを整理します。実在のカード番号は、使いません。
結論:右から1桁おきに2倍して、合計が10の倍数なら合格
カード番号は、最大19桁の数字で、最後の1桁がチェックデジットです。計算の手順は次のとおりです。
- 番号を、最後の桁から右から左へ見る
- 最後の桁は、そのまま使う(チェックデジット自身)
- 右から2桁目、4桁目、6桁目……と、1桁おきに2倍する
- 2倍して10以上になった桁は、9を引く(桁の和と同じ)
- すべての桁を合計する
- 合計が10の倍数なら合格
この計算を提案したのは、IBMのハンス・ピーター・ルーンで、1960年に米国で特許が成立しています。現在は、国際規格のISO/IEC 7812-1に規定され、クレジットカード番号のほか、携帯電話のIMEI番号などにも使われています。
例:79927398713で1桁ずつ計算する
まず、短い例で確かめます。79927398713は、チェックデジットの説明でよく使われる架空の番号です。最後の3がチェックデジットです。
チェックデジットを含めて、右から数えます。右から1桁目の3はそのまま、2桁目の1から1桁おきに2倍します。
| 右から | 桁 | 2倍するか | 計算後の値 |
|---|---|---|---|
| 1 | 3 | しない | 3 |
| 2 | 1 | する | 2 |
| 3 | 7 | しない | 7 |
| 4 | 8 | する | 16→7 |
| 5 | 9 | しない | 9 |
| 6 | 3 | する | 6 |
| 7 | 7 | しない | 7 |
| 8 | 2 | する | 4 |
| 9 | 9 | しない | 9 |
| 10 | 9 | する | 18→9 |
| 11 | 7 | しない | 7 |
合計は、3+2+7+7+9+6+7+4+9+9+7=70です。70は10の倍数なので、合格です。
チェックデジットを決めるときは、逆の手順になります。最後の3を取り除いた7992739871について、右端の桁から1桁おきに2倍して合計すると67になります。これに足して10の倍数にするには3が必要です。だから、チェックデジットは3になります。
カード番号の形をした例:4111 1111 1111 1111
カード番号の長さ(16桁)のテスト番号も確かめます。4111 1111 1111 1111は、決済のテスト用に広く公開されている番号で、実在のカードではありません。
右から数えて、2倍する桁(右から2、4、6……16桁目)のうち、16桁目の「4」だけが2倍されて8になります。それ以外の2倍する桁は、すべて「1」で、2になります。
- 2倍しない桁(右から1、3、5……15桁目):1が8個で合計8
- 2倍する桁のうち「1」の7個:2×7=14
- 16桁目の「4」:2倍して8
合計は8+14+8=30です。30は10の倍数なので、合格です。
最後の桁を2に変えた4111 1111 1111 1112は、合計が31になり、10の倍数ではないので不合格です。1桁の誤りは、これで見つかります。
見つけられる誤りと、見つけられない誤り
Luhnの計算は、次の誤りを見つけられます。
- 1桁だけの間違い。 1桁だけを別の数字に変えると、必ず合計が変わるので、すべて見つかります。
- 隣り合う2桁の入れ替え。 ほとんどの入れ替えを見つけられます。例外は、「09」と「90」を入れ替えた場合だけです。この例外は、チェックデジットを含めた6桁のすべての番号に対する計算で確かめました。
逆に、見つけられない誤りもあります。
- 無作為な番号でも、10分の1は合格する。 合計が10の倍数になる確率は10分の1です。したがって、合格したからといって、番号が正しいとは限りません。
- カードが実在するかはわからない。 発行されていない番号でも、計算が合えば合格します。有効期限や、カード裏面のセキュリティコードの確認とも別の仕組みです。
- 悪意のある偽造は防げない。 計算式は公開されており、誰でも合格する番号を作れます。誤入力の検出が目的で、不正利用を防ぐ仕組みではありません。
プログラムで確かめる書き方
計算は短いコードで書けます。次のPythonは、文字列の番号が合格かどうかを返します。
def luhn_ok(number: str) -> bool:
total = 0
for i, ch in enumerate(reversed(number)):
d = int(ch)
if i % 2 == 1: # 右から2桁目、4桁目……
d *= 2
if d > 9:
d -= 9
total += d
return total % 10 == 0
print(luhn_ok("4111111111111111")) # True
print(luhn_ok("4111111111111112")) # False
最後の桁を決める側は、先頭の15桁に「0」から「9」までの数字を足して、合格するものを探せば求まります。たとえば、先頭の15桁が411111111111111のとき、チェックデジットは1で、完成した番号は4111111111111111です。
入力フォームでこの検査を入れておくと、サーバーに送る前に誤入力を弾けます。ただし、合格は番号の形が整っているというだけなので、決済の可否は、必ずカード会社側の確認に任せます。
間違えやすい点
- 数える向きは右から。 桁数が違っても同じ計算ができるように、2倍する桁は先頭ではなく、右の端から決めます。左から数えると、桁数が奇数のときにずれます。
- 10以上になったら9を引く。 16は1+6=7で、16−9=7と同じです。9を引き忘れると、合計が大きくずれます。
- ほかの番号とは別の計算。 マイナンバーや法人番号、ISBN、バーコードのJANコードにもチェックデジットがありますが、重みや割る数が違います。Luhnをそのまま当てはめても合いません。
チェックデジットを自分で確かめる
「チェックデジットを整える」は、Luhnのほか、マイナンバー、法人番号、ISBN、JANコードの検査用数字を、桁ごとの重み、積、合計、余りの内訳つきで確かめられます。テスト用番号を作る機能もあるので、実在のカード番号やマイナンバーは入力せず、架空の番号で試してください。入力した番号は、端末の外には送られません。