validação de cpf e cnpj
Publicado; março 23, 2008 Filed under: programação, python | Tags: cnpj, cpf, programa, python, teoria, validação 14 Comments »Embora o CPF (Cadastro de Pessoa Física) e o CNPJ (Cadastro Nacional de Pessoa Jurídica) sejam números do Ministério da Fazenda, não é fácil encontrar informações técnicas a seu respeito nos sites do governo – a não ser sobre alíquotas de impostos e taxas. O algoritmo de validação desses números parece um mistério, algo secreto.
Bom, ambos podem ser validados através do DV (Dígito de Verificação) módulo 11. O tal DV módulo 11 é o resto da divisão por 11. Quando o resto é 10, este número é substituído por 0 (zero). Algumas instituições como Banco do Brasil substituem o 10 por X.
Validando CPF
O CPF é composto por 9 dígitos, mais 2 DVs, resultando em um número com 11 casas decimais. Os oito primeiros são chamados de número-base, o nono define a Região Fiscal, o décimo é o DV módulo 11 dos nove anteriores, e o último é o DV módulo 11 dos dez anteriores.
A Região Fiscal especificada no nono dígito guarda informação de onde o CPF foi emitido:
- 1: DF, GO, MS, MT, TO
- 2: AC, AM, AP, PA, RO, RR
- 3: CE, MA, PI
- 4: AL, PB, PE, RN
- 5: BA, SE
- 6: MG
- 7: ES, RJ
- 8: SP
- 9: PR, SC
- 0: RS
Porém, misteriosamente este dígito pode conter um valor inadequado. Há CPFs válidos, emitidos no DF, com o nono dígito com valor 5 (BA, SE?).
Para validar, por exemplo, o CPF 322.394.402-87, deve-se somar os nove primeiros dígitos, cada um multiplicado pela base iniciando em 9, terminando em 0, decrescente. Assim:
3 2 2 3 9 4 4 0 2 <- CPF x x x x x x x x x 1 2 3 4 5 6 7 8 9 <- base
O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0×8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.
3 2 2 3 9 4 4 0 2 8 <- CPF + DV1 x x x x x x x x x x 0 1 2 3 4 5 6 7 8 9 <- base
Agora, o resultado é calculado por 3×0 + 2×1 + 2×2… = 183, cujo resto da divisão por 11 é 7. Portanto, temos os dois DVs: 87.
Validando CNPJ
O CNPJ é composto por 8 dígitos de número base, seguidos de 4 dígitos de ordem das filiais da empresa, e 2 DVs – totalizando 14 casas decimais. A base para sequência de somatória e multiplicação inicia em 9, e termina em 2.
Supondo que o CNPJ em questão é 34.703.058/0001-13, temos:
3 4 7 0 3 0 5 8 0 0 0 1 <- CNPJ x x x x x x x x x x x x 6 7 8 9 2 3 4 5 6 7 8 9 <- base
O resultado, assim como no cálculo do CPF, dá-se por 3×6 + 4×7 + 7×8… = 177, cujo resto da divisão por 11 é 1. Agora, o mesmo procedimento, incluindo o primeiro DV já encontrado.
3 4 7 0 3 0 5 8 0 0 0 1 1 <- CNPJ x x x x x x x x x x x x x 5 6 7 8 9 2 3 4 5 6 7 8 9 <- base
A somatória da multiplicação resulta em 179, e o resto da divisão por 11 é 3. Assim, temos os DVs com valor 13.
Como não poderia ser perfeito, há aqui um outro mistério. No caso específico do CNPJ, deve-se validar o oitavo dígito pela somatória da múltiplicação dos sete primeiros dígitos, usando como base a sequência 2 1 2 1 2 1 2. Aqui, ao invés de módulo 11, deve-se usar módulo 10. Veja:
3 4 7 0 3 0 5 <- sete primeiros dígitos do CNPJ x x x x x x x 2 1 2 1 2 1 2 <- base
O resultado será calculado assim: 3×2 + 4×1 + 7×2 + 0×1 + 3×2 + 0×1 + 5×2 = 40. O resto da divisão por 10 é 0 (zero) – neste CNPJ já não funciona. Talvez haja alguma explicação pra isso, mas eu desconheço totalmente.
Conclusões
Se ignorarmos o cálculo do oitavo dígito do CNPJ (que aparentemente não serve pra nada), o procedimento para CPF e CNPJ é praticamente o mesmo, diferindo apenas na sequência usada como base: 0-9 no CPF e 2-9 no CNPJ.
Desta maneira, números com 11 dígitos podem ser considerados CPF, e entre 12 e 14 CNPJ? Claro que não, aqui é o Brasil. Há sempre mais uma exceção à regra. O Banco do Brasil, por exemplo, possui um CNPJ 00000191868. Nesse caso, o cálculo irá funcionar perfeitamente, porém, não se pode assumir que é um CPF.
Programa para validar CPF e CNPJ
Claro que depois de tudo isso você certamente irá escrever seu próprio código para validação. Minha lógica para isso é a seguinte:
- Se o número tem mais que 11 dígitos, trata como CNPJ – a menos que você force;
- Se for CPF a base vai de 9 a 0, caso contrário vai de 9 a 2 – sempre decrescente, claro;
- Recebendo o número do registro como string, pode-se guardar os dois últimos dígitos para verificação;
- No restante da string, executa o cálculo para gerar os dois últimos DVs;
- Compara os DVs gerados com os que foram guardados no item 3.
Neste código em python, chamei a função de is_brId() – se você discorda, pode mudar pro nome que quiser. Ela recebe um número (como string), e um argumento opcional que força o cálculo como CNPJ – pois qualquer número com menos de 12 dígitos é tratado como CPF. A função ignora a quantidade de dígitos na string, portanto, esse trabalho será seu. O retorno é um tuple, informando True ou False para a validação, e o tipo do registro – se é CPF ou CNPJ.
#!/usr/bin/env python
# coding: utf-8
# is_brId.py 20080218 AF
# atualizado 20080429 AF
import sys
def is_brId(value, force_cnpj=False):
def calcdv(numb):
result = int()
seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
for digit, base in zip(numb, seq):
result += int(digit)*int(base)
dv = result % 11
return (dv < 10) and dv or 0
id_type = (len(value)>11 or force_cnpj) \
and ['CNPJ', 1] or ['CPF', -1]
numb, xdv = value[:-2], value[-2:]
dv1 = calcdv(numb)
dv2 = calcdv(numb + str(dv1))
return (('%d%d' % (dv1, dv2) == xdv and True or False), id_type[0])
if __name__ == '__main__':
try:
id = sys.argv[1]
except IndexError:
print 'use: %s [CPF|CNPJ]' % sys.argv[0]
else:
print is_brId(id)Era isso. :)


O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0×8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.
Tem um erro nessa instração, o valor não é 140, do somatórios das multiplicações, msa sim 148, e para se conseguir a DV dos noves numeros base, o valor 8,
O cálculo é o seguinte: 3×1 + 2×2 + 2×3 + 3×4 + 9×5 + 4×6 + 4×7 + 0×8 + 2×9. O resultado é 140, e aplicando o DV, obtendo o resto da divisão por 11, temos o número 8. Agora, ainda é necessário calcular o último dígito.
Tem um erro nessa instrução, o valor não é 140, mais sim 148, de deve ser multiplicado por 10 e depois dividido por 11, so assim encontrará o resultado dea DV = 8. caso contrario, não dará 8 de forma alguma. (http://pt.wikipedia.org/wiki/D%C3%ADgito_verificador#M.C3.B3dulo_11)
confira nessa url, o que eu acabei de afirmar acima!!!,
eu verifiquei melhor o que eu escrevi acima e refiz os calculos, vcs estão certos, eu me equivoquei, desculpa ai galeira
Na real foi bom você ter escrito, porque independente do erro inexistente que você mencionou, eu encontrei um pequeno erro no código.
Agora já resolvi e marquei como atualizado, e está funcionando perfeitamente.
Estou lendo essa materia achei interressante, mas gostaria de saaber qual a utilidade pratica desses calculos do numero do CPF, porque a gente ja recebe o cpf com 11 numeros.
Pergunto : tem como alguem emitir um numero do cpf Falso.?
A utilidade prática do cálculo é criar programas que informam se um determinado número de CPF ou CNPJ é válido ou não.
Olá,
Alguém poderia disponibilizar o código corrgido, por favor?
Grato
Cearense
O código está correto, Cearense. ;)
Olá.
No caso da conferência do oitavo número, existem dois erros:
1. Sempre que alguma multiplicação tiver 2 dígitos, deve-se somar os dois. (ex.: 7 x 2 = 14, logo 1 + 4 = 5 e não 14.
2. O que conta não é o resto da divisão por 10, e sim o que falta para completar o próximo múltiplo de 10.
No exemplo:
3 4 7 0 3 0 5 <- sete primeiros dígitos do CNPJ
x x x x x x x
2 1 2 1 2 1 2 <- base
6 4 5 0 6 0 1 = 22, para chegar no próximo múltiplo de 10, que seria 30, faltam 8. portanto, neste caso, o oitavo dígito é 8.
Abraços e obrigado pela matéria, aprendi com ela e procurei a fundo para tentar descobrir o por quê deste problema. Espero ter ajudado assim como me ajudou.
Até mais,
CaioToOn!
Mais um detalhe, para achar isso no código, pode fazer o cálculo:
digito = 10 – total % 10;
Abraços,
CaioToOn!
Cara, fiz uma nova versão da tua função só que melhorada. Agora o usuário pode inserir caracteres entre os números que ele continua apenas lendo os números.
Acho até que tem como melhorar ainda mais.
def is_brId(value, force_cnpj=False):
“”"
Versão melhorada da função validadora de CPF/CNPJ de Alexandre Fiori (@AlexandreFiori)
#Testando
>>> is_brId(“42226624295″)
True
>>> is_brId(“12345678910″)
False
>>> is_brId(“94151352000191″)
True
>>> is_brId(“422.266.242-95″)
True
>>> is_brId(“42|||2!266.242-95″)
True
>>> is_brId(“9415.1352/0001-91″)
True
“”"
def calcdv(numb):
result = int()
seq = reversed(((range(9, id_type[1], -1)*2)[:len(numb)]))
for digit, base in zip(numb, seq):
result += int(digit)*int(base)
dv = result % 11
return (dv 11 or force_cnpj) \
and ['CNPJ', 1] or ['CPF', -1]
numb, xdv = value[:-2], value[-2:]
dv1 = calcdv(numb)
dv2 = calcdv(numb + str(dv1))
return ((‘%d%d’ % (dv1, dv2) == xdv and True or False))
Complementando… Porque não utilizar o 8º dígito do CNPJ como dígito verificador:
texto extraido do site CNPJ da RFB
“[...]Até o ano de 1993, o número básico era composto de sete (7) dígitos que identificavam a empresa e o oitavo (8) dígito era um dígito verificador; como a quantidade de empresas cadastradas superou a unidade de milhão e não se optou por um recadastramento, o oitavo dígito deixou de ser um dígito verificador, o que permitiu um aumento de 90 milhões de números.[...]”
Por este motivo NÃO se deve utilizar o 8º dígito como dígito verificador do CNPJ básico.
so gostaria de saber como faço a validaçao do cpf mais nada , eeeta sat complicadinho esse em
Folgado… vai aprender no site do Ministério! Ou então, agradeça ao autor e leia o comentário do Caio Cunha, que já são suficientes para te mostrar como fazer o algorítimo de validação.