Controlo de Erros no Cartão do Cidadão

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).



error: Conteúdo protegido