• Nenhum resultado encontrado

Dado um sistema de cifragem de chave pública, as funções de deci-

Dividindo a equação 1.28 por N' obtemos

Propriedade 1.4.1 Dado um sistema de cifragem de chave pública, as funções de deci-

fragem e de cifragem são inversas, ou seja, para qualquer indivíduo I,

fcAfnAM)) = M.

Um esquema de assinatura digital deve possuir ainda as seguintes propriedades:

restaura a mensagem original M = / ^ (S) para confirmar que foi o Pedro, e só o Pedro que assinou a mensagem.

• A assinatura não pode ser falsificada, porque só o Pedro conhece sua chave privada

Dp, e mais ninguém pode assinar o documento em lugar do Pedro.

• A alteração de um documento assinado invalida a sua assinatura.

• A assinatura não deve ser reutilizável: deve ser uma função do documento que não pode ser transferida para outro documento.

• A assinatura não pode ser rejeitada, isto é, o Pedro não pode posteriormente negar ter assinado o documento.

O DSS (Digital Signature Standard) é o padrão adoptado a 1 de Dezembro de 1994 pelo NIST (National Institute of Standards and Technology, EUA). O algoritmo de assinatura digital proposto é o DSA (Digital Signature Algorithm), desenvolvido pela NSA (Nacional Security Agency, EUA), que tem por base o problema de logaritmos discretos, tal como o método de troca de chaves de Diffie e Hellman [25]. O DSA só pode ser usado como esquema de assinatura. Mas o esquema de assinatura digital que vamos apresentar baseia- se no criptossistema de chave pública RSA, que permite combinar a assinatura e a cifragem de mensagens.

1.4.2 Assinatura no RSA

Cada utilizador / possui uma chave pública (n/, c/) e uma chave privada (n7, d/) do sistema

de cifragem RSA. Suponhamos que o Pedro pretende enviar ao João uma mensagem M, assinada e cifrada.

• Primeiramente, o Pedro vai assinar a mensagem M aplicando a sua chave privada

(np,dp), obtendo:

S = Mdp (mod nP).

• Para cifrar a mensagem, o Pedro usa a chave pública do João (nj, cj):

Note-se que o Pedro é o único que conhece a chave privada dp, logo ele é o único que consegue produzir a assinatura digital S. Como a mensagem assinada foi cifrada com a chave pública do João, só ele a poderá decifrar! O Pedro pode mandar a mensagem X, assinada e cifrada, para o João através de um canal público.

• O João, ao receber X, pode usar a sua chave privada (nj,dj), para decifrar a mensagem:

S = Xdj ( m o d n j ) .

• Agora que o João está na posse da mensagem assinada S, ele pode usar a chave pública do Pedro (nP,cp), para verificar a autencidade da mensagem calculando:

M = Scp (mod nP).

Este esquema funciona porque a propriedade 1.4.1 é garantida por argumento semelhante ao utilizado no Teorema 1.2.1.

Pode ser necessário dividir a mensagem em blocos M,, para que o valor numérico de cada bloco Mi seja menor que nP. Por outro lado, caso nj < np, pode acontecer que os

blocos assinados Si excedam o módulo nj. Neste caso, basta reajustar o tamanho dos blocos para que se verifique S^ < nj (Note-se que os módulos são parte da chave pública).

Outro método consiste em escolher um valor limite h, por exemplo h = IO299. Um

utilizador pode possuir dois pares de chave pública RSA, um para a cifragem e outro para assinatura. Todo módulo n da chave usada para assinatura seria menor que h e todo o módulo usado para a cifragem de dados seria maior que h. Desta forma, desaparece a necessidade de reajustar o tamanho dos blocos Mj.

1.4.3 Funções unidireccionais (hash)

Na prática, os algoritmos de chave pública para esquemas de assinatura digital são muitas vezes ineficientes para assinar mensagens longas. De facto, cifrar mensagens longas pode demorar muito tempo. Por outro lado, uma mensagem assinada pelo processo descrito na secção 1.4.2 não permite visualizar a mensagem sem verificar a assinatura. Uma melhoria dos esquemas de assinatura digital consiste em implementar funções unidireccionais (one-

A maioria das funções unidireccionais são implementadas a partir de uma função / que produz uma saída de tamanho fixo de m bits, dadas duas entradas de m bits cada. Uma entrada consiste num bloco de texto da mensagem M e outra no hash resultante do processamento do bloco anterior. Matematicamente, tem-se que hi — / ( M j , /ii_i). A saída do último bloco torna-se o valor hash de toda a mensagem. Desta maneira, uma função unidireccional produz sempre uma saída de tamanho fixo, independente do tamanho da mensagem. A fim de resolver um eventual problema de segurança resultante do facto de duas mensagens de comprimento diferentes produzirem o mesmo valor de hash, por vezes alguma informação binária sobre o tamanho da mensagem M é concatenada a M antes de iniciar o cálculo do valor de hash.

Em resumo, uma função hash unidireccional opera sobre uma mensagem M de qual- quer tamanho, e produz um valor de hash h(M) de tamanho fixo. Estas funções devem ter características adicionais:

• Dado M, deve ser rápido e fácil calcular h(M).

• Dado h(M), é muito demorado e difícil calcular M.

• Dado M, deve ser muito difícil encontrar outra mensagem M' tal que h(M) = /i(M'),

ou seja, mudando um só bit da mensagem original M, h produz um valor de hash totalmente diferente.

O algoritmo mais utilizado para funções unidireccionais é o MD5 (Message Digest Algorithm) desenvolvido por Ron Rivest e que produz um valor hash de 128 bits. Em 1996, Hans Dobbertin quase quebrou este algoritmo, descobrindo sérias fraquezas do MD5. Outro algoritmo, projectado pelo NIST (Nacional Institute of Standards and Technology) e NSA (National Security Agency), é o SHA-1 (Secure Hash Algorithm), considerado por vários especialistas uma função unidireccional criptograficamente segura, que produz um hash de 160 bits, em vez de 128 bits. Todas as novas versões do P G P usam a função unidireccional SHA-1 para a criação de assinaturas digitais com o DSS. Mas, por questões de compatibilidade com antigas versões, o PGP usa o MD5 para assinar mensagens com oRSA.

Em vez de assinar a mensagem inteira, assinamos um pequeno pedaço de dados que "representa" a mensagem. Para isso, calcula-se o valor hash da mensagem, também

chamado message digest ou uma impressão digital. Assina-se somente a impressão digital, que normalmente é de tamanho reduzido (entre 128 e 512 bits).

Suponha-se que o Pedro pretende enviar ao João uma mensagem M assinada usando este esquema. Se o Pedro usa o sistema de cifragem RSA com chave pública (nP, cP) e

chave privada (np,dp), então ele seguirá os seguintes passos:

• Calcula a impressão digital h da mensagem M, através da função unidireccional MD5, ou seja, h = MD5(M).

• Assina somente a impressão digital com a sua chave privada (np,dp):

S = hdp (mod nP).

A assinatura da mensagem M é o valor S que só o Pedro consegue calcular, uma vez que só ele conhece dP.

• Envia (M, S), a mensagem e a assinatura, para o João. Para que o João verifique a autenticidade da assinatura S basta:

• Calcular a impressão digital da mensagem, h! = MD5(M).

• Restaurar a impressão digital assinada, usando a chave pública do Pedro, calculando:

h = Scp (mod np).

Note-se que qualquer pessoa poderia efectuar esta operação, uma vez que Cp é um parâmetro da chave pública RSA.

• Se he h' são iguais, então a mensagem M e a assinatura S são consideradas válidas, certificando que a mensagem não foi modificada após a assinatura da mesma. A rejeição da assinatura significa que a mensagem ou a assinatura sofreram alterações. Infelizmente, a assinatura digital pode apenas certificar que a mensagem foi modificada, mas não o que foi modificado e quanto foi modificado.

Este esquema tem vantagens adicionais.

• O documento e a assinatura podem ser guardados em locais diferentes, o que dificulta ainda mais as falsificações.

• O documento pode ser armazenado em forma legível, o que facilita o acesso e a

leitura.

• O espaço necessário para guardar a assinatura é bem pequeno.

Documentos relacionados