Como funcionam os dígitos de controlo do IBAN

O método MOD-97 passo a passo, com um exemplo que pode seguir em papel e algumas linhas de código.

Atualizado em

O terceiro e o quarto caracteres de qualquer IBAN são dígitos de controlo. São calculados a partir de todos os outros caracteres com um método chamado MOD 97-10, definido na norma ISO/IEC 7064. Quando escreve um IBAN, o software repete o cálculo; se o resultado estiver errado, o IBAN tem um erro de digitação.

Verificar um IBAN em quatro passos

Tome como exemplo o IBAN alemão DE89 3704 0044 0532 0130 00.

  1. Retire os espaços: DE89370400440532013000.
  2. Passe os quatro primeiros caracteres para o fim: 370400440532013000DE89.
  3. Substitua cada letra por dois dígitos, com A = 10, B = 11 e assim sucessivamente até Z = 35. Aqui, o D passa a 13 e o E passa a 14: 370400440532013000131489.
  4. Divida este número por 97 e fique com o resto. Se o resto for 1, o IBAN é válido.

No exemplo, 370400440532013000131489 a dividir por 97 dá exatamente resto 1, por isso os dígitos de controlo estão corretos.

Calcular os dígitos de controlo

Para criar os dígitos de controlo de um novo IBAN, siga os mesmos passos com 00 no lugar dos dígitos de controlo:

  1. Escreva o código de país seguido de 00 e do BBAN: DE00370400440532013000.
  2. Reordene e converta como acima: 370400440532013000131400.
  3. Calcule o resto da divisão por 97. Aqui é 9.
  4. Subtraia o resto a 98: 98 − 9 = 89. Se for preciso, acrescente um zero à esquerda para ficar com dois dígitos (por exemplo, 7 passa a 07).

Os dígitos de controlo são 89, o que dá DE89370400440532013000. Como o resultado do passo 4 fica sempre entre 2 e 98, os dígitos de controlo de um IBAN válido nunca são 00, 01 nem 99.

Trabalhar com números grandes

O número convertido tem 17 dígitos na Noruega, 24 na Alemanha e mais de 40 num IBAN maltês que contém letras. A maioria é demasiado longa para uma calculadora normal ou para um inteiro de 64 bits, que comporta cerca de 19 dígitos. Pode dividir o número em partes. Comece pelos nove primeiros dígitos, calcule o resto, escreva esse resto à frente dos dígitos seguintes e repita:

Passo Número Resto da divisão por 97
1 370400440 23
2 23 + 5320130 = 235320130 70
3 70 + 0013148 = 700013148 38
4 38 + 9 = 389 1

O resto final é 1, o mesmo resultado da divisão completa.

A mesma verificação em código

Em JavaScript, tratando um dígito de cada vez, sem precisar de números grandes:

function isValidIban(input) {
  const iban = input.replace(/\s+/g, '').toUpperCase();
  if (!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(iban)) return false;
  const rearranged = iban.slice(4) + iban.slice(0, 4);
  let remainder = 0;
  for (const ch of rearranged) {
    const value = parseInt(ch, 36); // 0-9 stay digits, A-Z become 10-35
    remainder = (value > 9 ? remainder * 100 : remainder * 10) + value;
    remainder %= 97;
  }
  return remainder === 1;
}

Em Python, onde os inteiros podem ser tão grandes quanto for preciso:

def is_valid_iban(value: str) -> bool:
    iban = "".join(value.split()).upper()
    if not (iban.isascii() and iban.isalnum() and 15 <= len(iban) <= 34):
        return False
    rearranged = iban[4:] + iban[:4]
    digits = "".join(str(int(ch, 36)) for ch in rearranged)
    return int(digits) % 97 == 1

Estas funções verificam apenas a estrutura e os dígitos de controlo. Um validador completo verifica também se o país usa IBAN e se o comprimento corresponde a esse país, dados que os formatos por país indicam para todos os países que suportamos.

Para verificar um único IBAN à mão, cole-o no validador de IBAN: mostra que verificação falha e, quando só os dígitos de controlo estão errados, os dígitos que serviriam. Se preferir não manter este código, o iban-check é a nossa biblioteca de código aberto para JavaScript e TypeScript. Faz todas as verificações segundo o registo IBAN da SWIFT e não tem dependências. Instale-a a partir do npm com npm install iban-check.

O que a verificação deteta

O método é bom a encontrar os erros que as pessoas cometem ao escrever. Qualquer erro num único dígito e qualquer troca de dois dígitos vizinhos alteram o resto, por isso são sempre detetados. Os outros erros escapam em cerca de um caso em cada cem.

A verificação não consegue dizer se uma conta existe. Um IBAN com dígitos de controlo corretos pode apontar para um código de banco que não existe ou para uma conta que foi encerrada. É por isso que os IBAN do nosso gerador passam na verificação, apesar de nenhum banco os ter emitido.

Dígitos de controlo nacionais

Alguns países acrescentam os seus próprios dígitos de controlo dentro do BBAN, calculados com regras nacionais. No IBAN italiano, o BBAN começa com uma letra chamada CIN; em França e no Mónaco, termina com a "clé RIB" de dois dígitos; em Espanha, há dois dígitos de controlo entre o código da agência e o número de conta; e na Bélgica, o BBAN termina com dois dígitos de controlo. Estes controlos são independentes dos dígitos de controlo do IBAN: um IBAN pode passar no MOD-97 e falhar um controlo nacional. Dígitos de controlo nacionais no IBAN explica cada método, país a país.

Fontes

Precisa de um IBAN de teste?

Gere um IBAN válido para qualquer um dos 91 países, copie-o no formato de que precisa e veja o que significa cada segmento.

Abrir o gerador