本文へスキップ
totonoe.tech
システム入力

カード番号の最後の1桁は何のため?──チェックデジット(Luhn)の仕組み

クレジットカード番号の最後の1桁は、ほかの桁から計算される検査用の数字です。右から1桁おきに2倍して合計が10の倍数なら合格、というLuhnの計算を、架空のテスト番号で1桁ずつ追い、見つけられる誤りと限界、プログラムでの書き方を整理します。

この記事のポイント

  • 最後の1桁は検査用。右から1桁おきに2倍し、合計が10の倍数なら合格
  • 合格は実在の証明ではない。無作為な番号の10分の1も通る
  • 「チェックデジットを整える」でテスト番号の内訳を確認できる
Q.
カード番号の最後の1桁は何のためにある?
A.
入力ミスや読み間違いを見つけるための検査用の数字で、チェックデジットと呼ばれます。ほかの桁から計算して決まり、全体の計算結果が合わないと番号の誤りとわかります。カードが実在するかどうかまでは確かめられません。
この記事の作業は、無料のツールでそのままできます(入力は送信されません) チェックデジットを整える 番号の最後の1桁が「合っているか」を、桁ごとの計算で確かめる 開く

ネットショップでカード番号を1桁間違えて入力すると、送信する前に「番号が正しくありません」と表示されることがあります。カード会社に問い合わせたわけではないのに、なぜ番号の誤りがわかるのか。その仕組みが、番号の最後の1桁にあるチェックデジットと、Luhn(ルーン)アルゴリズムです。

この記事では、架空のテスト番号だけを使って、計算の手順、見つけられる誤りと見つけられない誤りを整理します。実在のカード番号は、使いません。

結論:右から1桁おきに2倍して、合計が10の倍数なら合格

カード番号は、最大19桁の数字で、最後の1桁がチェックデジットです。計算の手順は次のとおりです。

  1. 番号を、最後の桁から右から左へ見る
  2. 最後の桁は、そのまま使う(チェックデジット自身)
  3. 右から2桁目、4桁目、6桁目……と、1桁おきに2倍する
  4. 2倍して10以上になった桁は、9を引く(桁の和と同じ)
  5. すべての桁を合計する
  6. 合計が10の倍数なら合格

この計算を提案したのは、IBMのハンス・ピーター・ルーンで、1960年に米国で特許が成立しています。現在は、国際規格のISO/IEC 7812-1に規定され、クレジットカード番号のほか、携帯電話のIMEI番号などにも使われています。

例:79927398713で1桁ずつ計算する

まず、短い例で確かめます。79927398713は、チェックデジットの説明でよく使われる架空の番号です。最後の3がチェックデジットです。

チェックデジットを含めて、右から数えます。右から1桁目の3はそのまま、2桁目の1から1桁おきに2倍します。

右から桁2倍するか計算後の値
13しない3
21する2
37しない7
48する16→7
59しない9
63する6
77しない7
82する4
99しない9
109する18→9
117しない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です。

入力フォームでこの検査を入れておくと、サーバーに送る前に誤入力を弾けます。ただし、合格は番号の形が整っているというだけなので、決済の可否は、必ずカード会社側の確認に任せます。

間違えやすい点

  1. 数える向きは右から。 桁数が違っても同じ計算ができるように、2倍する桁は先頭ではなく、右の端から決めます。左から数えると、桁数が奇数のときにずれます。
  2. 10以上になったら9を引く。 16は1+6=7で、16−9=7と同じです。9を引き忘れると、合計が大きくずれます。
  3. ほかの番号とは別の計算。 マイナンバーや法人番号、ISBN、バーコードのJANコードにもチェックデジットがありますが、重みや割る数が違います。Luhnをそのまま当てはめても合いません。

チェックデジットを自分で確かめる

「チェックデジットを整える」は、Luhnのほか、マイナンバー、法人番号、ISBN、JANコードの検査用数字を、桁ごとの重み、積、合計、余りの内訳つきで確かめられます。テスト用番号を作る機能もあるので、実在のカード番号やマイナンバーは入力せず、架空の番号で試してください。入力した番号は、端末の外には送られません。

運営サイト

私たちが運営するサイト