Controlo de Integridade e Assinatura Digital

Controlo de Integridade

Em poucas palavras o "Controlo de Integridade" destina-se a verificar se uma mensagem sofreu algum tipo de alteração de conteúdo entre a origem e o destino. Neste aspecto pode fazer recordar o problema da detecção de erros durante a transmissão de dados. O controlo de integridade é contudo muito mais complexo porque temos de entrar em consideração com todo o tipo de acções de terceiros no sentido de "furar" o sistema.

Para implementar o controlo de integridade é adicionada à mensagem alguma informação adicional que representa o resultado da aplicação de algum tipo de algoritmo ao conteúdo da mensagem.

Quando a mensagem chega ao destino o algoritmo é novamente aplicado e compara-se o resultado obtido com aquele que a mensagem transporta. Até este ponto este mecanismo é semelhante a uma vulgar "detecção de erro".

Implementado deste modo, nada impede que um terceiro capture a mensagem, produza alterações no seu conteúdo e aplique o algoritmo para gerar o resultado correcto a adicionar à mensagem, a entidade de destino não vai poder detectar este tipo de situação.

Sob o ponto de vista de segurança, os mecanismos de controlo de integridade só são válidos quando associados a algum tipo de autenticação.

Cifragem

A simples aplicação de cifragem é capaz de garantir tanto a integridade como a autenticação. Considere-se a o envio de uma mensagem cifrada de A para B:

Criptografia Convencional (simétrica)
Como apenas A e B conhecem a chave secreta, se a decifragem em B produz texto legivel isto indica que a mensagem veio de A e que não se produziram alterações ao seu conteudo.

É necessário então implementar um mecanismo automático para determinar se uma mensagem é ou não legivel, isto pode ser complicado, ou mesmo impossível se os dados não são texto.

Em casos limite em que as mensagens não possuem qualquer tipo de estrutura que possa ser reconhecida, a solução é adicionar à mensagem um bloco que de algum modo represente o conteudo da mensagem antes da cifragem. As funções que são usadas para produzir estes blocos são conhecidas por funções "hash".

Criptografia de Chave-Publica
Para proporcionar integridade e autenticação a entidade A terá de cifrar a mensagem com a sua chave secreta, a entidade B tenta decifrar com a chave publica de A, se obtiver algo que faça sentido tal indica que a mensagem veio de A e que não se produziram alterações ao seu conteudo.

Colocam-se aqui os mesmo problemas quanto a determinar se a mensagem obtida faz ou não sentido.

Como se verá adiante a utilização deste mecanimo proporciona uma capacidade adicional: "assinatura digital". Note-se também que não existe confidencialidade, para tal acontecer A teria de aplicar a chave publica de B depois de aplicar a sua chave secreta.

"Checksum" Criptográfico

Esta técnica envolve a utilização de uma chave secreta, em conjunto com um algoritmo são aplicados à mensagem e produzem um bloco de dados de dimensão fixa conhecido por "Checksum" Criptográfico ou "Message Authentication Code" (MAC).

MAC = checksum(MENSAGEM,CHAVE SECRETA)

O MAC é enviado em conjunto com a mensagem da entidade A para a entidade B, a entidade B gera também um MAC e verifica se coincide com o que chegou juntamente com a mensagem. Como apenas A e B conhecem a chave secreta, B sabe que a mensagem veio de A e não foi adulterada.

Como sempre alguém pode recorrer à força bruta para tentar obter a chave secreta. Supondo que não se implementa confidencialidade, então existe acesso público à mensagem M e ao respectivo MAC, basta executar MAC1 = checksum(MENSAGEM,CHAVE) para todas as chaves possíveis, tentando obter MAC = MAC1. Sendo k o número de bits da CHAVE, então existe um total de 2k chaves possíveis, este será também o número de MAC's obtidos, contudo sendo n o número de bits do MAC, se n < k então apenas serão produzidos 2n < 2k MAC's diferentes.

Nestas condições ao empregar a força bruta vão ser obtidas 2(k-n) chaves possíveis. Será necessário recorrer a outro exemplar (M,MAC) e aplicar a mesma técnica, agora apenas serão testadas as 2(k-n) chaves obtidas no passo anterior, serão então obtidas 2(k-2xn) chaves possiveis. Em média serão necessários k/n passos destes até obter uma chave única.

Uma implementação comum de "Checksum" Criptográfico é o FIPS PUB 113 ou ANSI X9.17. O X9.17 basia-se no DES em modo CBC, com um vector inicial zero. Este algoritmo também é conhecido por DAA ("Data Authentication Algotithm"), usa uma chave DES de 56 bits e produz um resultado de 64 bits, neste algoritmo o MAC é também designado de DAC ("Data Authentication Code").

Para DAC pode utilizar-se menos do que os 64 bits produzidos pelo DAA. Neste caso utilizam-se pelo mesnos os 16 bits da esquerda.

Funções "Hash"

Uma função "hash" tipica recebe como "input" uma mensagem de comprimento variável e produz um bloco de comprimento fixo que representa o conteúdo da mensagem. A função deve ser tal que a minima alteração da mensagem produz uma alteração no bloco de saida. Por outro lado a probabilidade de duas mensagens diferentes produzirem o mesmo bloco deve ser praticamente nula.

Os algoritmos "hash" mais conhecidos são:

  • "Message-Digest" (MD2; MD4 e MD5)(RFC 1320) - aceita mensagens de qualquer tamanho e produz um bloco de 128 bits ("digest"), a mensagem é inicialmente dividida em blocos de 512 bits que são processados.
  • SHA ("Secure Hash Algorithm") - aceita mensagens de comprimento inferior a 264 e produz um "digest" de 160 bits. Baseado no MD4, o facto de gerar mais 32 bits do que o MD4 torna-o à partida mais seguro.

Um função "hash" não proporciona autenticação, qualquer um pode criar uma mensagem e gerar o respectivo "message digest" ou "hash code", para se conseguir autenticação é necessário usar conjuntamente algum mecanismo de cifragem, convencional ou não:

  • O conjunto mensagem/hash-code são cifrados. Neste caso existe confidencialidade.
  • Apenas o "hash-code" é cifrado. Se é usada cifragem de chave secreta, torna-se equivalente a um "checksum" criptográfico. Se é usada cifragem de chave pública temos ainda uma assinatura digital(*).
  • Uma outra opção possível é usar um valor secreto que é concatenado à mensagem para efeitos de cálculo do "hash-code", mas não é enviado.

(*) este tipo de assinatura pode ser atacado do seguinte modo ("birthday attack"):

  • A entidade X pretende realizar a fraude, então produz um conjunto de variações da mensagem licita. Produz também um conjunto de variações da mensagem fraudulenta.
  • De entre os dois conjuntos procura um par que produza o mesmo "hash-code", envia então o exemplar licito a entidade A para esta "assinar".
  • A entidade A acrescenta a assinatura digital, ou seja calcula o "hash-code" e cifra-o com a sua chave secreta.
  • A entidade X pode agora usar esta assinatura para a mensagem ilicita, como os "hash-code" são os mesmos, então as assinaturas são iguais.

O grau de dificuldade com que este tipo de fraude é realizado depende do número de "bits" do "hash-code", para m bits será necessário começar por gerar dois conjuntos de 2m/2 mensagens, nesta situação a probabilidade de se conseguir um par adequado (mesmo hash-code) é de 0,5 (50%).

Assinatura Digital

Anteriormente foram já abordados mecanimos que permitem a implementação da assinatura digital. A assinatura digital tem objectivos equivalentes aos das assinaturas manuscritas. As principais propriedades de uma assinatura digital são:

  • Deve usar informação que apenas o autor da assinatura possua, tipicamente a chave secreta de criptografia de chave publica. Esta propriedade autentica a proveniencia e impede o repudio (autor negar a autoria).
  • Deve depender de toda a mensagem, sendo impraticavel encontrar duas mensagens com a mesma assinatura.

A estas propriedades adicionam-se algumas da caracter prático: "deve ser fácil produzir a assinatura", "deve ser fácil verificar a assinatura", "deve ser fácil armazenar assinaturas".

"Direct Digital Signature"

A implementação directa ("Direct Digital Signature") envolve a cifragem da mensagem com a chave privada do autor ou a geração de um "hash-code" que é depois cifrado da mesma forma. Este tipo de implementação tem um ponto fraco, em caso de disputa o autor pode negar a autoria alegando que a sua chave privada foi roubada ou forjada por alguém.

"Arbitrated Digital Signature"

A solução para o problema apontado envolve o recurso a uma entidade na qual todas as partes são obrigadas a confiar ("Arbitrated Digital Signature").

A entidade A assina a mensagem e envia-a à entidade C ("árbitro"), esta entidade é então responsável por tomar todas as medidas e verificações necessárias para autenticar a origem da mensagem, adiciona-lhe uma etiqueta temporal e envia-a à entidade de destino. Todas as transações (A para C e de C para B) são devidam autenticadas e com confidencialidade garantida. Existem inumeras implementações, em algumas C tem acesso ao conteúdo decifrado da mensagem, noutras não.