O que acontece quando você verifica uma assinatura desanexada?

O que acontece quando você verifica uma assinatura desanexada?

Estou tentando entender o que acontece ao verificar uma assinatura gpg desanexada.

Aqui está um exemplo do gnupgmanual:

blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun  4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"

Como o gpg determina que a assinatura é boa? A assinatura contém um hash do arquivo que foi assinado? Se sim, como você extrai esse hash da própria assinatura?

Eu tentei gpg --list-packets <signature>, mas não parece mostrar informações completas.

Responder1

Você pode usar a --list-packetsopção para obter um despejo do que está em um arquivo gpg. A descrição do formato do arquivo éRFC 4880(padrão OpenPGP).

A assinatura não contém diretamente um hash. Contém informações que permitem verificar tanto o hash quanto o remetente: existe umalgoritmo de verificação de assinatura, que recebe um valor hash e uma chave pública como entrada e retornasimounão; o algoritmo retornasimse a assinatura foi feita pela chave privada correspondente à chave pública fornecida de uma mensagem com a chave privada fornecida, e retornanãoem todas as outras circunstâncias (assinatura de um hash diferente, assinatura feita por uma chave diferente ou um monte de bytes que não podem ser uma assinatura). Debaixo deDSAalgoritmo, acho inviável extrair o hash de uma assinatura se você não tiver a chave privada.

O arquivo de assinatura contém a identidade do signatário, bem como o valor da assinatura. Para verificar a assinatura, o gpg lê a chave pública do signatário do seu chaveiro, calcula o hash dos dados e aplica o algoritmo de verificação de assinatura.

Responder2

$ gpg --list-packets myfile.asc
[...]
       digest algo 10, begin of digest 77 dd

Isso mostra qual algoritmo de resumo foi usado. Infelizmente, nem a página de manual nem gpg --versionnos informa qual algoritmo está atribuído a qual ID. Precisamos mergulhar na RFC do formato do pacote para encontrar esta informação:https://www.rfc-editor.org/rfc/rfc4880#section-9.4

ID           Algorithm                             Text Name
--           ---------                             ---------
1          - MD5 [HAC]                             "MD5"
2          - SHA-1 [FIPS180]                       "SHA1"
3          - RIPE-MD/160 [HAC]                     "RIPEMD160"
4          - Reserved
5          - Reserved
6          - Reserved
7          - Reserved
8          - SHA256 [FIPS180]                      "SHA256"
9          - SHA384 [FIPS180]                      "SHA384"
10         - SHA512 [FIPS180]                      "SHA512"
11         - SHA224 [FIPS180]                      "SHA224"
100 to 110 - Private/Experimental algorithm

Responder3

Sim, as assinaturas digitais geralmente são hashes seguros, assinados pela chave secreta do signatário.

Assinar a mensagem inteira é muito mais lento e não mais seguro. Além disso, o algoritmo deve cuidar do comprimento dos blocos, preenchimento (de forma a não divulgar muitas informações), etc.

Nota: também na criptografia assimétrica, por motivos de velocidade, apenas uma chave simétrica efêmera é criptografada assimétrica e o restante da mensagem é apenas criptografado simetricamente.

informação relacionada