O boleto confere a própria conta

A linha digitável não é texto livre: é um rearranjo fixo do código de barras, amarrado por quatro dígitos verificadores. A conta pega um valor redigitado. O que ela não pega é o boleto que nasceu falso, e este post mede os dois lados.

Referência: Como identificar um boleto falso

Dá para conferir um boleto sem consultar ninguém, porque a linha digitável confere a si mesma. Os três primeiros dígitos são o código do banco, os dez últimos são o valor em centavos e os quatro anteriores codificam o vencimento. Quatro dígitos verificadores amarram tudo isso, três em módulo 10 e um geral em módulo 11. Dígito verificador é um número extra que só fecha a conta se o resto da linha estiver intacto, então um valor redigitado quase sempre a quebra. O que a conta não prova é legitimidade. Um boleto gerado inteiro pelo golpista carrega dígitos verificadores perfeitos. Para esse caso, o que vale é o app do banco, que consulta o cadastro do título.

O que os 47 dígitos carregam

A linha digitável de um boleto bancário é um rearranjo fixo do código de barras de 44 dígitos. Nesse rearranjo entram três dígitos verificadores, um no fim de cada um dos três primeiros campos, cada um calculado em módulo 10.

O dígito solto no meio da linha é o quarto. Ele é o DV geral do código de barras, em módulo 11, calculado pelo banco emissor sobre exatamente o valor e o vencimento que o resto da linha codifica.

os 47 dígitos, campo a campo

AAABC.CCCCX  DDDDD.DDDDDY  EEEEE.EEEEEZ  K  UUUUVVVVVVVVVV

AAA   banco                X, Y, Z   DV de cada campo, módulo 10
B     moeda (9 = real)     K         DV geral do código de barras, módulo 11
UUUU  fator de vencimento  VVVVVVVVVV  valor em centavos

Boletos de arrecadação, os de água, luz e tributos, começam com 8, têm 48 dígitos e organizam os campos de outro jeito. Nada neste post vale para eles, e o motor também não os lê. Um 8 na frente é um instrumento diferente, não um boleto bancário malformado.

A conta que pega um valor redigitado

Reconstrua o código de barras a partir da linha impressa, que é um rearranjo fixo, e rode o módulo 11. Se alguém retocou o valor ou o vencimento na linha, a conta deixa de fechar, porque o DV geral foi calculado pelo banco sobre os números originais. A contradição não precisa de decodificador de código de barras, não precisa de pixel e não precisa de segundo documento para comparar. Ela está inteira dentro da própria linha.

É isso que o sinal br-identifier-checksum faz desde o motor 1.21.0, sobre a camada de texto de um PDF digital. As duas fixtures que justificam a família, ou seja, os dois arquivos de teste, diferem em quatro dígitos e em nada mais. Uma fica em silêncio. A outra reporta high, com o achado dizendo que a linha impressa do boleto discorda do próprio dígito verificador. O guia de sinais de números descreve a família inteira.

E a conta sobrevive ao que quase nenhum outro sinal sobrevive. Uma reescrita com qpdf ou Ghostscript lava os sinais de bytes, o histórico de revisões, os metadados. Não muda o que os dígitos imprimem.

A assimetria é o desenho

Um dígito verificador que falha é evidência. Um que passa não é: qualquer gerador produz uma linha com todos os DVs corretos, em loop. Por isso a família reporta falhas e fica em silêncio nos sucessos. E por isso um DV de campo quebrado sozinho, em módulo 10, sai como medium: erro de transcrição produz isso com a mesma facilidade que edição.

Por que um DV correto não prova nada

Um golpe não precisa editar um boleto verdadeiro. Pode gerar um boleto novo, estruturalmente impecável, com a linha digitável do golpista apontando para a conta do golpista. Todos os quatro dígitos verificadores fecham, porque foram calculados de verdade, só que sobre os números errados. Nenhuma aritmética sobre a linha pega esse caso, e nenhum sinal estrutural do arquivo pega um documento que nunca foi outro documento.

Para esse caso, a conferência que decide não é conta, é consulta. Escaneie a linha no app do seu banco e leia, na tela de confirmação, o beneficiário que o cadastro do título aponta. O guia percorre essas conferências uma a uma. Este post é sobre a metade que dá para fazer offline, e sobre o que ela vale.

A medição que ninguém publica: 2 linhas em 3.822 PDFs

Antes de construir o resto do plano, o decodificador do código de barras vetorial e o cruzamento de três vias, medi a cobertura no corpus. São 3.822 PDFs públicos, de contratos do PNCP a documentos de bancos e da web brasileira.

PDFs varridos3.822
Páginas com cara de boleto (3+ nomes de campo Febraban)63
Dessas, com uma linha digitável de verdade2
"Códigos de barras vetoriais" aparentes15, e nenhum é código de barras

Os 63 documentos com cara de boleto são, na esmagadora maioria, manuais de cobrança e especificações de layout CNAB, o formato que os bancos usam para trocar arquivos de cobrança. São documentos sobre boletos, e carregam todos os nomes de campo da Febraban porque são eles que os definem. As duas linhas digitáveis do corpus são exemplos citados dentro de especificações.

E os 15 "códigos de barras" são réguas de tabela, editais e um manual de API, com 1.273 a 3.128 retângulos finos. Eles passam num teste de duas larguras de barra exatamente porque régua de tabela é uniforme. A heurística que devia achar um código de barras achou uma tabela.

A resposta honesta da medição não é uma taxa: é n≈0. E a rota óbvia para consertar isso está fechada de propósito: um boleto real é a cobrança de um estranho, com nome e muitas vezes CPF de quem paga. A regra do corpus deste projeto não é "busque e tome cuidado", é não construir um acervo com as contas dos outros. Por isso o decodificador não foi construído: seria código que não teria como ser validado.

A prova de que o método funciona veio de outro número

A mesma família valida o número de processo judicial do CNJ, que fecha em módulo 97-10, e aí o corpus tinha população de verdade:

Números reais na máscara canônica156, em 34 documentos
Verificam em módulo 97-10156
Falsos positivos0
Edições de um dígito testadas (156 × 20 posições × 9 dígitos)28.080
Pegas pela conta23.478 (83,6%)
Caem fora do guard de layout, silêncio por desenho4.602 (16,4%)
Passam como válidas0

156 números independentes satisfazendo uma identidade de módulo 97 por coincidência tem probabilidade 97⁻¹⁵⁶. Ou seja: a aritmética confere com o que os tribunais realmente emitem, não consigo mesma. E nenhuma edição de um dígito sobre um número real sobrevive à conta. É a mesma classe de verificação que a linha digitável carrega, medida onde havia o que medir.

O outro lado da mesma medição, dito com todas as letras. Sobre as 1.006 falsificações construídas do corpus de tamper, o recall das checagens de PIX e CNJ é zero. Recall é a fração dos casos ruins que a checagem pega: aqui, nenhum.

Aquelas falsificações editam valores, datas e pixels, não redigitam referências. O valor da aritmética está numa classe de documento que o corpus não tem: o comprovante de pagamento e a petição. É por isso que este post existe em vez de um gráfico de recall.

Onde o motor lê, e onde ele fica calado

  • Uma sequência solta de 47 dígitos não acusa sozinha. Medido: cerca de 10% das sequências aleatórias de 47 dígitos passam o guard de layout e falhariam um DV. A família teria chamado isso de "alguém editou um boleto". Então uma sequência sem pontuação só é lida numa página com três ou mais nomes de campo da Febraban. A forma pontuada canônica é a única que acusa por si.
  • Boleto escaneado ou fotografado não é lido. A camada de texto de um scan é uma transcrição de OCR, feita por leitura automática da imagem, e erro de transcrição quebra DV sem dizer nada sobre fraude. No corpus, 6.179 páginas que são imagem inteira foram puladas de propósito.
  • Nada disso é consulta. Nenhum registro é acessado e nada sai do processo. A evidência no relatório carrega só os quatro últimos dígitos de um identificador, porque CPF é dado pessoal e relatório é coisa que se armazena e se encaminha. Saber que onze dígitos satisfazem uma identidade publicada não diz que eles pertencem a alguém.
  • O comprovante PIX é o mesmo problema do boleto. O motor valida o CRC-16 de um BR Code quando ele aparece como texto, que é o dígito de conferência do código copia-e-cola do PIX. Mas o corpus não contém nenhum payload PIX, pela mesma razão ética. Então a taxa de falha em comprovantes reais é não medida, e a severidade fica um degrau abaixo do que o plano pedia. O que um comprovante PIX entrega é assunto do guia irmão.

Confira um boleto que você ia pagar mesmo

A conta da linha digitável é sua e custa uma calculadora. O que o motor soma a ela é o resto do arquivo. Quantas vezes o PDF foi gravado, que ferramenta assina os metadados, se há texto por baixo de uma tarja. Sinais, nunca veredictos: um relatório limpo não prova boleto legítimo, e um achado não prova golpe.

Verifique um PDF: grátis, sem conta, o arquivo é analisado em memória e descartado com a resposta.