Este documento descreve o algoritmo canônico para validação e geração do CNPJ Alfanumérico conforme a Instrução Normativa RFB nº 2.229/2024. Ele serve como referência única para todas as implementações deste monorepo.
Um CNPJ tem sempre 14 caracteres sem máscara, divididos em:
| Parte | Posições | Conteúdo |
|---|---|---|
| Raiz | 1–8 | A–Z e 0–9 |
| Ordem | 9–12 | A–Z e 0–9 |
| Dígitos verificadores | 13–14 | Sempre 0–9 (numéricos) |
A máscara de exibição é: XX.XXX.XXX/XXXX-DD
Remover todos os caracteres que não sejam letras ou dígitos e converter para maiúsculas:
"12.abc.345/01ab-77" → "12ABC34501AB77"
O resultado normalizado deve ter exatamente 14 caracteres. Qualquer outro comprimento é inválido.
Se todos os 14 caracteres forem iguais (ex: "00000000000000", "AAAAAAAAAAAAAA"), o CNPJ é inválido. Essa regra existe porque algumas sequências uniformes passariam pela verificação de dígitos por coincidência matemática (ex: todos zeros).
Cada caractere é convertido subtraindo 48 do seu código ASCII:
| Caractere | Código ASCII | Valor numérico |
|---|---|---|
'0' |
48 | 0 |
'9' |
57 | 9 |
'A' |
65 | 17 |
'B' |
66 | 18 |
'Z' |
90 | 42 |
Em código: valor = charCode(c) - 48
- Tome os 12 primeiros caracteres (base)
- Multiplique cada caractere pelo peso correspondente:
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Peso | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
- Some todos os produtos
- Calcule
resto = soma % 11 - Se
resto < 2→d1 = 0; caso contrário →d1 = 11 - resto
- Forme uma string de 13 caracteres:
base + d1(o dígito calculado acima, como caractere numérico) - Multiplique cada caractere pelo peso correspondente:
| Posição | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Peso | 6 | 5 | 4 | 3 | 2 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
- Some todos os produtos
- Calcule
resto = soma % 11 - Mesma regra:
d2 = (resto < 2) ? 0 : 11 - resto
O CNPJ é válido se e somente se os dois últimos caracteres do CNPJ normalizado forem iguais a d1 e d2 respectivamente:
cnpj_normalizado[12] == d1 && cnpj_normalizado[13] == d2
Para gerar um CNPJ válido aleatório:
- Sortear 12 caracteres aleatórios do alfabeto
[A-Z0-9] - Rejeitar e repetir se todos os 12 caracteres forem iguais
- Calcular
d1ed2conforme as etapas 5 e 6 acima - Retornar a concatenação
base + d1 + d2(14 caracteres normalizados)
O CNPJ gerado é garantidamente válido pois os dígitos são calculados — não sorteados.
Entrada: "12.ABC.345/01AB-77"
Passo 1 — Normalização: "12ABC34501AB77"
Passo 2 — Comprimento: 14 ✓
Passo 3 — Sequência uniforme: não ✓
Passo 4 — Base: "12ABC34501AB" (12 chars)
Passo 5 — 1º dígito:
| Char | Valor | Peso | Produto |
|---|---|---|---|
1 |
1 | 5 | 5 |
2 |
2 | 4 | 8 |
A |
17 | 3 | 51 |
B |
18 | 2 | 36 |
C |
19 | 9 | 171 |
3 |
3 | 8 | 24 |
4 |
4 | 7 | 28 |
5 |
5 | 6 | 30 |
0 |
0 | 5 | 0 |
1 |
1 | 4 | 4 |
A |
17 | 3 | 51 |
B |
18 | 2 | 36 |
Soma = 444 · Resto = 444 % 11 = 4 · d1 = 11 - 4 = 7 ✓
Passo 6 — 2º dígito (base "12ABC34501AB7"):
Soma = 411 · Resto = 411 % 11 = 4 · d2 = 11 - 4 = 7 ✓
Resultado: cnpj[12..13] == "77" → válido ✓