2012-05-29 11 views
5

RFC 4880 descrive il pacchetto firma versione 4, etichetta 2, comeOpenPGP Firma Packet hash dati

- One-octet signature type. 
- One-octet public-key algorithm. 
- One-octet hash algorithm. 
- Two-octet scalar octet count for following hashed subpacket data. 
Note that this is the length in octets of all of the hashed 
subpackets; a pointer incremented by this number will skip over 
the hashed subpackets. 
- Hashed subpacket data set (zero or more subpackets). 
- Two-octet scalar octet count for the following unhashed subpacket 
data. Note that this is the length in octets of all of the 
unhashed subpackets; a pointer incremented by this number will 
skip over the unhashed subpackets. 
- Unhashed subpacket data set (zero or more subpackets). 
- Two-octet field holding the left 16 bits of the signed hash 
value. 
- One or more multiprecision integers comprising the signature. 

e considera che il penultima riga significa semplicemente prendere la stringa della subpacket hash e hash con l'algoritmo hash e prende i suoi primi 2 byte. tuttavia, non importa quello che faccio, non riesco a capirlo.

ho generato questo falso chiave molto tempo fa

-----BEGIN PGP PUBLIC KEY BLOCK----- 
Version: BCPG v1.39 

mQGiBE5B0h8RBAD533Z5bK1IpBx02QyQL0QoJE4uFRIMGDiwXuwmZzVl+R7Vlurd 
GRLsCCbE6vOOh7XQVZGzLEBy9WNzZ9m+EbCfSVAYkjS6FhLws6hG6irrnS+b3JBf 
gFJ8vNGF9Z7bhx+7y7NBk0IMyWkGnUkcnav73t5FQUI2faEBN4c/yAGJZwCgjcB7 
3akWk9XVWvTCsiMXxpyvkukEALXsvB6cOoFEtQq9cQHjP63fBlvD94dhhMiM0cH6 
hW9JotxdK+cxFGG9ZIWgoN2PWbMJka/H4W5EL6tS+YiNAR7I1Ozkt6X16GjnQUzZ 
MlSpleK+KiKVN2anRaPEoOIinHrE3ZXd6QlJ/4+OJn4IVWmSEaJpFf4QNgvEu4rh 
xinyBAD2RNzREOA+wpnFZ4lDt9NZXmXdxQME/l0J9XcvWhpGsxA/MATQKImy7N49 
7GT/M38F+TrpBobag1O3buE99fOLyws4Tbc+sZMdHxoiGZDAIRNQS2rv475E6ktj 
7vd5CYvOkA6+8sX1+hPcNlkHtHB1OFkJRsYp6k0zkyC9adjBM7QTYWJjIDxtYWtj 
bUBhYWEuY29tPohGBBMRAgAGBQJOQdIfAAoJEDBSJUXPd92GRSQAoItbtbToOg7a 
/hcg2sA/aBEQNwuxAKCGR69vmSoCWoBP5waPk0UsjM3BSbjMBE5B0h8QAgCUlP7A 
lfO4XuKGVCs4NvyBpd0KA0m0wjndOHRNSIz44x24vLfTO0GrueWjPMqRRLHO8zLJ 
S/BXO/BHo6ypjN87Af0VPV1hcq20MEW2iujh3hBwthNwBWhtKdPXOndJGZaB7lsh 
LJuWv9z6WyDNXj/SBEiV1gnPm0ELeg8Syhy5pCjMAf9QHehP2eCFqfEwTAnaOlA6 
CU+rYHKPZaI9NUwCA7qD2d93/l08/+ZtFvejZW1RWrJ8qfLDRtlPgRzigoF/CXbR 
iEYEGBECAAYFAk5B0h8ACgkQMFIlRc933YZRrACfUnWTjHHN+QsEEoJrwRvFmvzj 
bR4An24pTpeeN+I6R59O/sdmYsAhjULX 
=sStS 
-----END PGP PUBLIC KEY BLOCK----- 

quello che penso im dovrebbe fare:

sha1("\x05\x02\x4e\x41\xd2\x1f") = "52f07613cfd61c80d2343566a8f3f487a0975b80" 

\x05 - length of subpacket 
\x02 - subpacket type 
\x4e\x41\d2\x1f - creation time 

Da pgpdump.net, vedo che la sinistra 2 byte del hash (SHA 1) il valore è 45 24 per il primo pacchetto di firma e 51 ac per il secondo. sto ottenendo 52 f0 per entrambi. ovviamente, non includo alcune informazioni, ma che cos'è? i pacchetti secondari hash sono identici e tutti i dati prima dei dati hash sono uguali, tranne che sono diversi tipi di pacchetti di firma (0x13/0x18). non sono stato in grado di ottenere uno dei valori hash corretti anche quando aggiungo/prendo caratteri dal pacchetto di dati. la generazione di key im è esattamente la stessa della chiave qui mostrata tranne che per i valori hash.

quali sono i dati che dovrei essere hashing ??

edit: se trovato questo un po 'più avanti:

The concatenation of the data being signed and the signature data 
from the version number through the hashed subpacket data (inclusive) 
is hashed. The resulting hash value is what is signed. The left 16 
bits of the hash are included in the Signature packet to provide a 
quick test to reject some invalid signatures. 

Ma qual è il dati che vengono firmati? tutti i pacchetti prima della firma? solo il pacchetto prima del pacchetto di firma corrente?

l'esempio chiave in alto è composto da packet 6 + packet 13 + packet 2 + packet 14 + packet 2. Ho provato tutte le combinazioni possibili di packet 6, packet 13, e packet 2 (dal numero di versione di hash dei dati compreso), ma ancora non riesce a trovare la stringa che hash con i valori corretti

risposta

2

Quando si genera un pacchetto di firma, è sempre un firma di qualcosa di di qualcuno. Cioè, c'è un certo numero di dati che vengono firmati e una chiave pubblica, e il punto di una firma è che è qualcosa che dovrebbe essere fatto solo da qualcuno che ha i dati esatti e la chiave privata corrispondente.

Quindi "i dati firmati" saranno qualsiasi cosa si verifichi. Vedere la sezione 5.2.1 di RFC4880 per alcuni esempi. Nel caso presente, presumibilmente ti interessano i pacchetti di firma all'interno del tuo blocco di chiave pubblica.

Il primo è una "Certificazione positiva di un pacchetto ID utente e chiave pubblica (0x13)". Questo è descritto nella sezione 5.2.4 di RFC4880.

Il secondo è una "firma di sottochiave", in base al quale la chiave primaria (quella DSA) garantisce che la sottochiave (solo Elcrypt di crittografia) appartenga ad essa. Il modo in cui funziona è descritto anche nella sezione 5.2.4 di RFC4880.

Ecco il testo rilevante da 5.2.4:

Quando una firma viene effettuata su una chiave, i dati hash inizia con il ottetto 0x99, seguita da un tratto due ottetto della chiave, e poi il corpo del pacchetto chiave. (Si noti che questa è un'intestazione di pacchetto vecchio stile per un pacchetto chiave con lunghezza di due ottetti.) Una firma di sottochiave (tipo 0x18) o firma di associazione chiave primaria (tipo 0x19) quindi hash la sottochiave utilizzando lo stesso formato come chiave principale (utilizzando anche 0x99 come primo ottetto ). Le firme di revoca delle chiavi (tipi 0x20 e 0x28) hanno cancellato l' solo la chiave è stata revocata.

e poi

Una firma certificazione (tipo 0x10 attraverso 0x13) hash l'ID utente essere legato alla chiave nel contesto hash dopo che i dati di cui sopra. Una certificazione Vblocca il contenuto del pacchetto di pacchetto ID utente o attributo , senza alcuna intestazione. Una certificazione V4 blocca la costante 0xB4 per le certificazioni ID utente o la costante 0xD1 per le certificazioni degli attributi dell'utente, seguita da un numero di quattro ottetti che fornisce la lunghezza dei dati User ID o User Attribute e quindi l'ID utente o l'utente Dati degli attributi