CPF と CNPJ の検証は、同じ計算の骨格を共有しながら、対象と桁の構成が異なります。どちらも末尾の二位が計算で導かれ、その二位が成立するかどうかで番号の自己整合性を確かめます。この記事では、二つの番号を並べて見たときの違いと、検証でつまずきやすい点を整理します。
CPF と CNPJ はそれぞれ何を指すのか?
ブラジルの税番号には、自然人に対応するものと法人に対応するものがあります。前者が CPF、後者が CNPJ です。
- CPF は個人に割り当てられ、本人の識別に使われます。
- CNPJ は法人に割り当てられ、事業体の識別に使われます。
- どちらも末尾に検証用の位を持ち、計算で導かれます。
- どちらも表示のときに区切り記号を伴うことが多く、その位置は種類ごとに決まっています。
同じ人が個人として CPF を持ち、事業を起こして CNPJ も持つ、という状態は珍しくありません。二つの番号は役割が違い、片方がもう片方を置き換えるものではありません。
二つの番号の構成の違い
構成の違いは、桁の並びの意味づけに現れます。
| 観点 | CPF | CNPJ |
|---|---|---|
| 対象 | 自然人 | 法人 |
| 検証用の位 | 末尾の二位 | 末尾の二位 |
| 表示の区切り | 点とハイフン | 点、斜線、ハイフン |
| 帰属の示し方 | 個人を識別 | 事業体を識別 |
共通しているのは、末尾の二位が計算で決まるという点です。異なるのは、その前の並びが何を表すかという点です。検証の実装としては、二つの計算を別々に持つ必要があります。片方の規則をもう片方に流用することはできません。
なお、具体的な桁数や区分の割り当ては法令と運用で決まるものであり、ここでは立ち入りません。実装する際は、その時点で公表されている説明に従ってください。
検証用の位はどのような考え方で求めるのか
二つの番号に共通する考え方は、前半の位に重みを掛けて足し、決められた数で割り、その結果をもとにして一位を導く、という流れです。これを二回繰り返して、末尾の二位を得ます。
手順を細かく書き写すことはしませんが、押さえておきたい性質は次の三点です。
- 最初の一位を求めるときと、次の一位を求めるときとで、対象になる位の範囲が変わります。二つ目を求めるときは、一つ目の結果を含めた範囲を見ます。
- 重みは位ごとに異なり、規則的に巡回します。
- 割った結果から位を導く段階で、補数を取るかどうかという分岐があります。
この構造のため、途中で一文字でも取り違えると、二つ目の位まで連鎖して変わります。末尾の二位がそろって成立しているかを見ることは、転記誤りを捕まえる上で有効です。同種の計算の一般的な形はチェックディジットのアルゴリズムで整理しています。
全同数字をわざわざ除外するのはなぜか?
すべての位が同じ数字、たとえば全零や全一のような並びは、単純な計算を通ってしまうことがあります。計算の性質上、位の値がそろっていると総和と割り算の関係が特別な形になり、見かけ上つじつまが合う場合があるためです。
そこで、正式な規則ではこうした並びを明示的に排除する扱いが取られます。これは「計算が間違っている」のではなく、「計算だけでは排除できない形を、規則の側で禁じている」という整理です。
実装する側にとっての教訓は、計算を通ったかどうかだけで有効性を判断してはいけないという点です。計算の外側にある条件も、必ず規則として組み込む必要があります。なお、具体的にどの並びが排除されるかは、ここには列挙しません。規則の側の説明を確認してください。
形式の確認と登記状態は別の話
番号が計算上つじつまの合う形をしていることと、その番号が実際に登録されていることは別です。前者は文字列の性質であり、後者は登録の状態です。
この二つを混ぜると、二種類の害が出ます。一つは、つじつまの合う作り物の番号を「登録済み」と扱ってしまうことです。もう一つは、規則は合っているのに登記が閉じられている番号を「不正」と決めつけてしまうことです。どちらも、利用者に誤った説明を返す結果になります。
画面では「形式が合う」「検証用の位が成立する」「登記が確認できる」を別々に示すのが適切です。
開発者向け:入力の洗浄とエラー表示
実装で最初にやるべきことは、計算ではなく洗浄です。点、斜線、ハイフン、空白は表示のための記号であり、計算の前には取り除きます。英字が混じる表記ゆれがある場合は、大文字と小文字をそろえます。
洗浄を省くと、同じ番号が二つの値として扱われます。これは検証の失敗よりも厄介です。重複の判定、突合、集計がすべて狂い、しかも画面上は正しく見えます。
エラー表示では、次の三段階を分けてください。
- 文字種または桁数が合わない。利用者が入力を見直せます。
- 検証用の位が成立しない。利用者が入力を見直せます。ただし、規則の変更という可能性も残ります。
- 登記状態を確認できない。利用者には直せません。照会の結果として扱います。
三段階を一つの失敗メッセージにまとめると、利用者は何を直せばよいか分からなくなります。また、本文で扱った例や計算結果は、検証の考え方を説明するために構成した作り物であり、実在の人物や事業体の税番号ではありません。登記の有無を示すものでもありません。
次の一手
自分のシステムがこの二種類の番号をどう扱っているかを確認し、洗浄の段階と計算の段階が分かれているかを見てください。番号検証ツールに実際の形式の値を貼り付けると、どの段階まで通るかを目で確認できます。各国の公的番号の扱いの差は各国の公的番号を検証するルールはなぜそろわないのかで扱っています。