Los dígitos de control del IBAN explicados: el algoritmo MOD-97

Los dígitos de control del IBAN explicados: el algoritmo MOD-97

Aprende exactamente cómo se calculan los dígitos de control del IBAN con el algoritmo MOD-97, por qué detectan errores de escritura y cómo calcularlos y validarlos en código.

Escrito por Random IBAN Team · Publicado el 2025-01-15 · Actualizado el 2026-05-22
#IBAN checksum #modulo 97 #IBAN validation #IBAN algorithm #IBAN control digits #ISO 7064 #check digits

Cada número de cuenta bancaria internacional (IBAN) lleva dos pequeños dígitos que hacen un trabajo sorprendentemente importante. Se sitúan justo después del código de país —en las posiciones tres y cuatro— y son el detector de errores integrado del IBAN. Si te equivocas en un solo dígito en cualquier parte del número de cuenta, la mayoría de las veces esos dos dígitos de control dejan de cuadrar. El pago se rechaza antes de que se mueva un solo céntimo.

Esta guía explica cómo se calculan esos dígitos de control, por qué el paso de módulo 97 resulta tan eficaz y cómo calcularlos o verificarlos de forma fiable en tus propios sistemas.


Qué son realmente los dígitos de control del IBAN

Los dos dígitos que siguen al código de país se denominan formalmente dígitos de control. No son aleatorios y no forman parte de tu número de cuenta: se derivan del resto del IBAN mediante una fórmula matemática definida en la norma ISO 7064 (la misma familia de estándares que respalda muchos otros esquemas de dígitos de control).

El objetivo es la integridad. Cuando un cliente teclea un IBAN en un formulario de pago, los dedos resbalan: un 3 se convierte en un 8, se intercambian dos dígitos contiguos, se omite un carácter. Los dígitos de control permiten que cualquier banco —o tu propio código de validación— detecte esos errores al instante, sin necesidad de contactar con el banco de destino.

Piénsalo como un bit de paridad a una escala mucho mayor: una huella compacta de la referencia de la cuenta que viaja junto a los datos que protege.


Cómo funciona el cálculo de los dígitos de control

La rutina de validación es engañosamente sencilla. Toma un IBAN francés como FR76 3000 6000 0112 3456 7890 189. Para comprobarlo:

  1. Mueve los cuatro primeros caracteres al final. FR76 pasa al final y queda 30006000011234567890189FR76.
  2. Sustituye cada letra por dos dígitos. Cada letra se asigna a un número: A=10, B=11, … Z=35. Así, F=15 y R=27, lo que convierte FR76 en 15277 6.
  3. Lee el resultado como un único entero grande y calcula entero mod 97.
  4. Si el resto es exactamente 1, el IBAN es válido. Cualquier otro resto significa que el número está corrupto.

Ese es todo el algoritmo. La genialidad está en el paso 4: los dígitos de control se eligen, cuando el IBAN se crea por primera vez, precisamente para que ese resto dé 1.

Cálculo de los dígitos de control desde cero

Generar un IBAN nuevo ejecuta el proceso a la inversa:

  1. Construye el BBAN (el código de banco, la sucursal y el número de cuenta específicos de cada país).
  2. Añade el código de país seguido de 00 como marcador de posición de los dígitos de control.
  3. Convierte las letras en números y calcula el entero grande.
  4. Calcula 98 - (entero mod 97).
  5. Rellena el resultado con ceros hasta dos dígitos: ese es tu par de dígitos de control.

Por ejemplo, construir un IBAN alemán a partir de un BBAN válido produce algo como DE89 3704 0044 0532 0130 00, donde 89 es el par calculado. Esto es exactamente lo que hace internamente el generador de Random IBAN para cada país compatible: construye un BBAN estructuralmente correcto y luego deriva los dígitos de control para que el número final supere el MOD-97.


¿Por qué módulo 97 (y no algo más sencillo)?

Los diseñadores podrían haber usado una suma de verificación básica, como «sumar todos los dígitos». Eligieron el módulo 97 de forma deliberada, y esa elección tiene consecuencias reales para la precisión.

  • 97 es primo. Usar un módulo primo distribuye los errores de manera uniforme y evita los puntos ciegos que afectan a los esquemas con módulos no primos.
  • Detecta cualquier error de un solo dígito. Cambia un dígito cualquiera y el resto cambia, garantizado.
  • Detecta casi todas las transposiciones. Intercambiar dos caracteres contiguos (un error típico) se detecta en la inmensa mayoría de los casos.
  • La tasa de detección ronda el 98,9 % para errores aleatorios de varios caracteres, muy por encima de lo que podría lograr una simple suma o un único dígito de control.

La contrapartida es que necesitas aritmética de enteros grandes, porque un IBAN de 34 caracteres se expande hasta un número de docenas de dígitos. En la práctica esto no es problema: todos los lenguajes habituales lo manejan de forma nativa o con una biblioteca de una sola línea, y existe un truco por bloques (más abajo) que evita por completo los enteros grandes.


Cálculo de los dígitos de control en código

Rara vez necesitas un tipo de entero grande. Por cómo funciona la aritmética modular, puedes procesar el IBAN en pequeños fragmentos manteniendo un resto acumulado. Este es el enfoque canónico en varios lenguajes.

JavaScript:

function isValidIban(iban) {
  const s = iban.replace(/\s+/g, '').toUpperCase();
  // Move first 4 chars to the end
  const rearranged = s.slice(4) + s.slice(0, 4);
  // Convert letters to numbers (A=10 ... Z=35)
  const numeric = rearranged.replace(/[A-Z]/g, ch =>
    (ch.charCodeAt(0) - 55).toString()
  );
  // Piece-wise mod 97 to avoid BigInt
  let remainder = 0;
  for (const digit of numeric) {
    remainder = (remainder * 10 + Number(digit)) % 97;
  }
  return remainder === 1;
}

Python:

def is_valid_iban(iban: str) -> bool:
    s = "".join(iban.split()).upper()
    rearranged = s[4:] + s[:4]
    numeric = "".join(
        str(ord(c) - 55) if c.isalpha() else c
        for c in rearranged
    )
    return int(numeric) % 97 == 1   # Python ints are arbitrary-precision

PHP:

function isValidIban(string $iban): bool {
    $s = strtoupper(preg_replace('/\s+/', '', $iban));
    $rearranged = substr($s, 4) . substr($s, 0, 4);
    $numeric = '';
    foreach (str_split($rearranged) as $ch) {
        $numeric .= ctype_alpha($ch) ? (string)(ord($ch) - 55) : $ch;
    }
    // bcmod handles the large integer safely
    return bcmod($numeric, '97') === '1';
}

Los tres siguen los mismos cuatro pasos. La única diferencia real es cómo gestiona cada lenguaje el número grande: Python usa enteros grandes nativos, PHP se apoya en bcmod y JavaScript esquiva el problema con el bucle de resto acumulado.


Valida pronto, valida dos veces

Detectar un IBAN incorrecto en el momento adecuado ahorra problemas a todo el mundo. Algunas prácticas que dan buenos resultados de forma constante:

  • Valida primero en el lado del cliente. Ejecuta la comprobación MOD-97 en el navegador mientras el usuario escribe o al perder el foco, para que corrija el error al instante en lugar de después de enviar el formulario.
  • Vuelve a validar en el servidor. Nunca confíes solo en el cliente: repite la comprobación en el backend para protegerte frente a manipulaciones y peticiones automatizadas.
  • Normaliza antes de comprobar. Elimina los espacios, pásalo todo a mayúsculas y rechaza los caracteres que no estén entre A–Z y 0–9 antes de ejecutar el algoritmo.
  • Separa los errores de formato de los errores de dígitos de control en tus mensajes. «Este IBAN es demasiado corto para Alemania» es mucho más útil para un cliente que un genérico «IBAN no válido».

Recuerda el límite de los dígitos de control: confirman que el número es estructuralmente correcto, no que la cuenta exista. Un IBAN perfectamente válido puede seguir apuntando a una cuenta cerrada o inexistente. Para eso necesitas la verificación de la cuenta con el banco o un servicio específico.


Generar IBAN de prueba válidos para tus pruebas

Codificar un único IBAN en tu conjunto de pruebas es frágil, y usar uno real es un riesgo de cumplimiento. En su lugar, genera IBAN sintéticos con dígitos de control válidos bajo demanda.

Cuando creas números con Random IBAN, cada valor se construye con el método MOD-97 de la norma ISO 13616, de modo que supera la validación en cualquier biblioteca conforme. Úsalos para:

  • Probar de forma unitaria tus funciones de validación con entradas válidas y no válidas conocidas.
  • Hacer QA de importaciones masivas exportando cientos de IBAN a CSV o JSON.
  • Mostrar recorridos de pago sin tocar nunca un número de cuenta real.

Combínalo con el validador de IBAN para confirmar que tu propia implementación coincide con el algoritmo de referencia, y vuelve a comprobar tus datos de prueba cada vez que un país actualice su formato de IBAN. Para profundizar en la propia norma, consulta nuestra guía sobre qué es un número IBAN.


Preguntas frecuentes

¿Por qué siempre hay exactamente dos dígitos de control?

La norma del IBAN fija el campo de los dígitos de control en dos dígitos para todos los países, sea cual sea su longitud total. Dos dígitos dan 100 valores posibles, suficientes para satisfacer el requisito del módulo 97 (los restos van de 0 a 96) manteniendo el formato compacto y uniforme en todo el mundo.

¿Puede un IBAN incorrecto superar la comprobación MOD-97?

Sí, aunque es poco probable. El algoritmo detecta alrededor del 98,9 % de los errores aleatorios y todos los errores de un solo dígito, pero una pequeña fracción de los errores de varios caracteres puede dar por casualidad un resto de 1. La comprobación garantiza la estructura, no que la cuenta sea real o correcta.

¿Cuál es la diferencia entre los dígitos de control y los dígitos de control nacionales?

Los dos dígitos de control del IBAN (posiciones 3 y 4) protegen todo el IBAN mediante MOD-97. Algunos países —España, Francia, Italia y otros— incorporan además sus propios dígitos de control nacionales dentro del BBAN para proteger el número de cuenta nacional. Son mecanismos distintos que operan en capas diferentes.

¿Necesito una biblioteca de enteros grandes para validar un IBAN?

No necesariamente. El método del resto por bloques que se muestra arriba procesa el número en pequeños pasos manteniendo un valor acumulado por debajo de 97, así que basta con aritmética de enteros normal. Solo necesitas enteros grandes si calculas int(numeric) % 97 de una sola vez, como hace el ejemplo de Python.

¿Por qué la conversión de letras usa A=10 en lugar de A=1?

Cada letra se expande a un número de dos dígitos, del 10 al 35. Empezar en 10 (en lugar de 1) garantiza que toda letra se asigne a exactamente dos dígitos, lo que mantiene coherente la aritmética posicional. Si A fuera 1, las letras producirían una mezcla de valores de uno y dos dígitos y el cálculo se rompería.

¿Cómo genero un IBAN con dígitos de control válidos para pruebas?

Usa el generador de Random IBAN: elige un país y construye un BBAN correctamente estructurado y calcula los dígitos de control automáticamente. Todos los resultados superan la validación MOD-97, por lo que sirven como dato de prueba listo para usar sin exponer ningún dato bancario real.

Prueba Nuestras Herramientas IBAN

Pon en práctica tus conocimientos con nuestras herramientas gratuitas.