Jan 222011
 

cartao-do-cidadao[1]

No seguimento do artigo sobre o misterioso número de controle dos Bilhetes de Identidade, incluindo as falhas do mesmo, ter gerado bastante interesse, vamos agora ver como é o mecanismo de controlo de erros no Cartão do Cidadão.

Ao referir a um amigo, que já tem o Cartão do Cidadão, as falhas do mecanismo de controlo de erros do número dos velhos Bilhetes de Identidade, diz-me ele: “mas isso é num sistema desactualizado”, “por isso é que o cartão de cidadão não o usa”.

Imediatamente me interroguei se teriam substituído um sistema falível por… nada! Uma procura rápida no google revelou que tal não era verdade. O velho algarismo de controlo está lá! Embora agora lhe chamem “check digit”, sem dúvida porque em inglês parece ser uma coisa muito mais avançada! E existe ainda um segundo “check digit” complementar. Já lá vamos.

No Cartão do Cidadão o número de Identificação Civil aparece seguido de 4 caracteres, e tudo em conjunto constitui o “Número de Documento”. O primeiro desses caracteres, será sempre um algarismo de 0 a 9 e corresponde precisamente ao velhinho algarismo de controlo (agora ‘promovido’ a check digit). É exactamente o mesmo algarismo que constava no BI, e o algoritmo para detectar erros de transcrição é o mesmo.

Seguem-se dois caracteres alfanuméricos que representam o número da emissão do cartão para determinada pessoa. Ou seja, o primeiro Cartão do Cidadão emitido para uma pessoa terá ZZ. Se o perder, ou por qualquer motivo pedir um novo cartão, este virá com ZY, e por aí fora. Isto significa que ao longo da sua vida nenhum cidadão português terá dois cartões com o mesmo número de documento, o que permite às autoridades competentes identificar cartões substituídos, cancelados, roubados, extraviados, etc.

Finalmente temos mais um algarismo (0 a 9). O “check digit” final que permite detectar erros na transcrição do número de documento completo. Mas será o mesmo algoritmo falível do anterior? Não. Felizmente optaram por outro. Uma variante do algoritmo de Luhn, inventado em 1954 pelo cientista Hans Peter Luhn da IBM, usado nos cartões de crédito.

Como funciona este? Vejamos o número 49927398716, sendo o último algarismo o de controlo. Começa-se por duplicar, da direita para a esquerda, cada segundo algarismo.

4 9 9 2 7 3 9 8 7 1 6
4 18 9 4 7 6 9 16 7 2 6

Nos casos em que a duplicação resulta num produto com dois algarismos (por exemplo 16), soma-se esses dois algarismos um com o outro (16 fica 1+6 = 7).

4 9 9 2 7 3 9 8 7 1 6
4 18 9 4 7 6 9 16 7 2 6
4 1+8 9 4 7 6 9 1+6 7 2 6

Finalmente soma-se tudo:
4 + ( 1 + 8 ) + 9 + ( 4 ) + 7 + ( 6 ) + 9 + ( 1 + 6 ) + 7 + ( 2 ) + 6 = 70

O resultado tem de ser múltiplo de 10, que é o caso, logo o número é válido. O algarismo de controlo, neste caso 6, é simplesmente escolhido para a soma final resultar num múltiplo de 10. Sem ele a soma daria 64.

O algoritmo usado no Cartão do Cidadão é uma variante deste, e está descrito neste documento oficial (PDF). Imagine-se um cartão com número 12345678 9 ZZ1. Primeiro que tudo há que converter as letras em números, segundo uma tabela que consta no documento indicado (A=10, B=11 … Y=34, Z=35):

1 2 3 4 5 6 7 8 9 35 35 1

Em seguida duplica-se cada 2º elemento a contar da direita para a esquerda, tal como no algoritmo de Luhn original:

1 2 3 4 5 6 7 8 9 35 35 1
2 2 6 4 10 6 14 8 18 35 70 1

Agora aparece a diferença em relação ao algoritmo de Luhn. Aqui subtrai-se 9 aos números que foram duplicados e são maiores que 10:

1 2 3 4 5 6 7 8 9 35 35 1
2 2 6 4 10 6 14 8 18 35 70 1
2 2 6 4 10-9 6 14-9 8 18-9 35 70-9 1

Finalmente, soma-se tudo:
2 + 2 + 6 + 4 + 1 + 6 + 5 + 8 + 9 + 35 + 61 + 1 = 140

140 é um múltiplo de 10, logo o número estaria correcto.

Tal como no artigo anterior, forneço-vos uma folha de cálculo em Excel para verificarem se funciona com o número do vosso Cartão do Cidadão e fazerem as experiências que quiserem (por exemplo as trocas indicadas em baixo :)). Não se esqueçam de trocar as letras pelo valor numérico apropriado, visto que não o automatizei. Se mudarem para a Sheet 2 (Folha 2) podem ver a verificação do número que inseriram pelo método “antigo”. Qualquer dúvida usem a caixa de comentários.

Forças e Fraquezas

Segundo a Wikipedia, o algoritmo de Luhn detecta praticamente todos os erros num só algarismo (erros singulares) e praticamente todos as transposições de algarismos adjacentes. Esta versão modificada deve manter as mesmas propriedades, ou muito perto disso. Erros singulares e transposições representam mais de 90% dos erros cometidos.

E quanto a fraquezas? O Luhn original não consegue detectar transposições de 90 para 09 e vice versa, por razões bastante óbvias (9×2=18 –> 1+8=9). Esta versão modificada sofre do mesmo problema (9×2=18 –> 18-9=9). Troca de números intercalados, idem: 123 trocado por 321 passa despercebido. Na verdade todos os algarismos que são duplicados na verificação podem ser trocados entre si que a verificação dá certa. E o mesmo se aplica para os restantes algarismos, excepto o de verificação. São trocas que muito dificilmente serão feitas de forma involuntária, mas possíveis.

A Wikipedia diz também que a troca dos pares 22 ? 55, 33 ? 66 e 44 ? 77 não é detectada pelo Luhn. Pelas minhas experiências, a versão modificada do nosso Cartão do Cidadão consegue detectar trocas dos pares 22 ? 55. Porém não detecta trocas entre 55 ? 88. Mantém portanto 3 falhas em trocas de pares. A versão modificada do nosso Cartão do Cidadão mantém as mesmas falhas.

No entanto, se o Luhn é considerado suficiente para os cartões de crédito, também o deverá ser para o nosso Cartão do Cidadão. E além disso o número do CC tem não um, mas sim dois dígitos de verificação, calculados com dois algoritmos diferentes. A combinação de ambos será provavelmente imbatível. Além do mais isto só serve para transcrições manuais do número. Se for usada a leitura electrónica do chip do cartão, não só se elimina o erro humano, como serão aplicados certamente outros métodos (CRC-32 talvez).

Publicidade

  6 Responses to “Controlo de Erros no Cartão do Cidadão”

Comments (6)
  1. Achei interessante, no entanto tentando verificar com o meu próprio cartão obtive “incorrecto”. Consultei o ferido documento oficial e penso que encontrei onde está o erro: na explicação aqui dada e no excel fornecido subtrai-se 9 aos números que foram duplicados e são maiores que 10. Ora o documento oficial diz:
    “No caso do resultado da duplicação ser IGUAL ou superior a 10, subtrair 9 ao seu valor”. Correcção feita o meu cartão já obtém o merecido “correcto” ! Em contrapartida o presente exemplo deixa de o ser, para tal teria de ser alterado o ultimo digito de controle para 1.

  2. Caro António Pascoal, obrigado pelo aviso. Quando criei a folha de cálculo esqueci-me que era maior ou igual! Mas eu até me lembro de ler isso! Por causa desse erro, o que eu disse sobre as trocas de pares também estava errado. As falhas do algoritmo de Luhn são mantidas.

    Já está tudo corrigido (creio). Obrigado mais uma vez.

  3. Valerá a pena fazer a verificação da parte BI adicionalmente ou é redundante?

    • Caro João Palhoto Matos, sim, fazer a verificação do primeiro “check digit” (do número de identidade) é algo redundante. Porém, dado que o algoritmo de Luhn tem as suas falhas (descritas no artigo) parece-me útil verificar os dois se tal for possível e prático de fazer. Se for para uma aplicação de software, em que a complexidade extra não seja obstáculo, acho que vale a pena. Se for para uma aplicação de natureza oficial ainda mais importante me parece fazê-lo.

      Já se for para uma implementação em hardware, onde a complexidade seja de evitar, o caso muda de figura.

  4. Artigo muito interessante e informativo. Tendo como base a folha de cálculo disponibilizada para o segundo dígito de controlo do Cartão de Cidadão, criei uma que verifica simultaneamente o primeiro dígito de controlo e o segundo, permitindo discriminar em qual deles se verificou o possível erro. Também converte as letras do número do cartão para os valores respetivos, dispensando a consulta da tabela e a substituição manual. Obrigado pelo artigo.
    Atalho para a folha de cálculo:
    http://www.cognoscomm.com/Validar_Cartão_do_Cidadão.xls

  5. Obrigado pelo artigo. Muito informativo.

    Vou trabalhar numa aplicação com forte integração com o cartão do cidadão e achei interessante conhecer mais sobre este tópico.

    Abraço.

Sorry, the comment form is closed at this time.