メニュー

IBAN の構造を読む:各国で違う mod-97 検証

IBAN の構造を三つの区間に分けて読み、国際規格が定める部分と各国が定める部分の境界、文字を数字に置き換える mod-97 の考え方を整理します。

公開日

  • IBAN
  • チェックディジット

IBAN の構造は、前半の二区間だけが国際規格で定められ、後半は各国の裁量に委ねられています。この非対称さを理解していないと、検証の設計を誤ります。この記事では、どの部分が共通で、どの部分が国ごとに違うのかを順に切り分け、長い番号を検証するときの考え方を整理します。

IBAN の構造はどのような区間に分かれるのか?

先頭から順に、三つの区間として読むのが基本です。

位置 区間 誰が定めるか
先頭 2 文字 国コード 国際規格
続く 2 文字 ISO のチェックディジット 国際規格
残り全部 BBAN 各国

国コードは、その口座がどの国・地域の制度に属するかを示します。続く二文字は、番号全体が自己矛盾していないかを確かめるためのチェックディジットです。そして残りは BBAN と呼ばれ、銀行の識別子と口座の識別子をどう並べるかを各国が決めます。

つまり、先頭の四文字は世界共通の読み方ができ、その先は国ごとに読み方が変わります。この境界を意識せずに一つの規則で扱おうとすると、必ずどこかで破綻します。

国コードと ISO のチェックディジット

先頭二文字の国コードは、番号の帰属を示す手がかりですが、それ以上のことは語りません。同じ国コードを持つ番号でも、後半の構成は銀行ごとに異なります。

三文字目と四文字目は、国際規格で定められたチェックディジットです。この二文字は、番号全体を対象に計算されます。したがって、後半の BBAN を一文字でも書き換えると、先頭の二文字と矛盾する状態になります。前半が共通で後半が可変という構成は、この二文字があるからこそ成立しています。

なお、国コードが同じでも長さはそろいません。全体の長さは各国が決めるため、一つの固定長を前提にした読み方はできません。

BBAN の中に国内チェックディジットが入るのはなぜか?

BBAN の内部には、その国独自のチェックディジットが埋め込まれていることがあります。銀行の識別子の末尾に置く国もあれば、口座番号の末尾に置く国もあります。位置も桁数も国ごとに違います。

この結果、一つの IBAN が二つの層で同時に検証されることになります。国際規格の層と、国内の層です。二つの層は別々の対象を守っています。国際層は番号全体の転記誤りを捕まえ、国内層はその国の手続きで使われる部分の誤りを捕まえます。

検証の結果を伝えるときは、どちらの層が成立しなかったのかを分けて示す必要があります。片方だけが落ちた場合、番号全体が偽物という意味ではなく、特定の区間に矛盾があるという意味だからです。チェックディジットという仕組みの一般形はチェックディジットのアルゴリズムで扱っています。

文字を数字に置き換える mod-97 の考え方

IBAN の検証は、骨格としては他の方式と同じで、重み付けした総和を法で割るという流れに乗っています。特徴は、数字だけでなく英字を含む文字列を対象にする点です。

英字は、位置に応じた二桁の数字に置き換えられます。たとえば十番目の英字は十と零、十一番目は十一というように、規則的に数字へ写されます。こうしてできた長い数字列を、大きな法で割った余りが、先頭の二文字と一致するかを見ます。

手順の細部をここに並べることはしませんが、考え方として押さえておきたいのは次の二点です。

  • 文字を数字へ写す段階と、割り算をする段階が分かれていること。
  • 長い数列を一度に抱えると桁あふれを起こしやすいこと。

検証を実装する側にとっては、二点目が実務上の課題になります。長い数列を一度に扱うのではなく、順に処理しながら余りだけを保持する方法が取られます。

検証を通ることが口座の存在を意味しないのはなぜか?

国際規格の検証に合格しても、分かるのは文字列が自己矛盾していないという一点です。次のことは何も分かりません。

  • その口座が実際に開設されているかどうか。
  • 誰の名義か。
  • 送金を受け取れる状態かどうか。
  • 現在も有効かどうか。

これらは登録の照会という別の手続きの結果です。番号の形が正しいことと、送金が成功することは、まったく別の層の話です。画面の文言でここを混ぜると、利用者は「通ったから送れるはずだ」と誤解します。

開発者向け:長さの差を国ごとに分流する

実装では、国コードを最初に読み、その国に対応する規則を引く形にします。規則はコードに埋め込まず、差し替え可能なデータとして持つのが望ましい設計です。各国の調整は頻繁ではないにせよ、必ず起こります。

処理の流れは次のようになります。

  1. 区切り記号を取り除き、英字を大文字にそろえる。
  2. 先頭二文字から国コードを読む。
  3. その国の規則を引き、全体の長さと文字種を確認する。
  4. 国際規格の層のチェックディジットを計算する。
  5. 国内の層がある場合は、その層も別の結果として返す。

重要なのは、四番目と五番目を一つの真偽値にまとめないことです。どちらの層で落ちたかによって、利用者に返すべき説明が変わります。あわせて、対応する規則が見つからない場合の振る舞いも決めておきます。規則がないことは、番号が偽物であることを意味しません。この区別の一般論はチェックディジットがない番号にまとめています。

本記事で示した区間の説明は公開されている構造の一般論であり、構成を説明するために示した値はすべて作り物の例です。実在の口座や利用者を指すものではなく、送金の可否を判断する根拠にはなりません。

次の一手

手元にある長い番号がどの国コードで始まっているかを確認し、番号検証ツールに貼り付けて、国際層と国内層のどちらまで結果が返るかを見てみてください。層が分かれて表示されれば、どこを直せばよいかも判断しやすくなります。検証の全体像は番号検証の仕組みで確認できます。

続けて読む

カード番号・公的番号の検証ツールの関連記事