2012-06-29 11 views
6

Sono finalmente riuscito a verificare alcuni semplici blocchi di messaggi firmati PGP. Tuttavia, ho scoperto che per qualche ragione, la mia implementazione mi limita a verificare i dati che sono lunghi 9-16 byte. non di meno. non piu.Lunghezza dei dati all'hash per PGP

c'è qualche istruzione da qualche parte (RFC4880 o altrove) che specifica come trattare i dati in testo normale di qualsiasi lunghezza? forse c'è una sorta di imbottitura che ho perso? PKCS1?

Sono quasi sicuro che ho formattato i dati in modo corretto per l'hash, dal momento che le istruzioni in RFC 4880 sec 5.2.4 dicono per i documenti di testo, basta sostituire tutto \n con \r\n e aggiungere un trailer. dal momento che i miei valori di prova erano singole linee di dati, non ha dovuto essere sostituito

tutti questi valori sono in base 10, salvo diversa indicazione:

// DSA public key values 
p = 175466718616740411615640156350265486163809613514213656685227237159351776260193236923030228927905671867677337184318134702903960237546408302010360724274436019639502405323187799029742776686067449287558904042137172927936686590837020160292525250748155580652384740664931255981772117478967314777932252547256795892071 
q = 809260232002608708872165272150356204306578772713 
g = 127751900783328740354741342100721884490035793278553520238434722215554870393020469115393573782393994875216405838455564598493958342322790638050051759023658096740912555025710033120777570527002197424160086000659457154926758682221072408093235236853997248304424303705425567765059722098677806247252106481642577996274 
y = 1729359689660729090363046649964245002413818785374443321465729582030837456094002908141174514805122689

non funziona:

-----BEGIN PGP SIGNED MESSAGE----- 
Hash: SHA1 

abcd 
-----BEGIN PGP SIGNATURE----- 
Version: BCPG v1.39 

iFsEARECABsFAk/tB28UHGFiYyA8bWFrY21AYWFhLmNvbT4ACgkQMFIlRc933Ya2 
RwCfdMyI08Iz0rDXVHOPlGA3s5Y9j/8An2He7+hHjWfGJNoOJT7gAxqJaoLo 
=I2rT 
-----END PGP SIGNATURE----- 

data hashed (in hex): 6162636404011102001b05024fed076f141c616263203c6d616b636d406161612e636f6d3e04ff00000021 

r = 666804200764671083282351405489424949903645052927 
s = 558743769080942454889260816818443017172325925608 

w = 702955297882281869313155599553522395227576660460 // s^-1 mod q 
u1 = 190417717173929082607343542521304347388874234334 
u2 = 306786785479358548892951170619047936651163362761 
v = g^u1 * y^u2 % p % q = 737052148656331043521702886300418501784667890334 

v != r 

di lavoro:

-----BEGIN PGP SIGNED MESSAGE----- 
Hash: SHA1 

abcdef 
-----BEGIN PGP SIGNATURE----- 
Version: BCPG v1.39 

iFsEARECABsFAk/tCE0UHGFiYyA8bWFrY21AYWFhLmNvbT4ACgkQMFIlRc933YYG 
IQCfercgPsXFnah6otgQdEMbv9OeCgIAnRIyOLirbqSlBugBT6Ex/Adz4+7L 
=bzab 
-----END PGP SIGNATURE----- 

data hashed (in hex): 3031323334353637383961626364656604011102001b05024fed084d141c616263203c6d616b636d406161612e636f6d3e04ff00000021 

r = 700580719365380086754774917458461236187098909186 
s = 103881812262595813943381509986903840453887782603 

w = 178510125628083028184051840492924307896586330444 // s^-1 mod q 
u1 = 78831508775508876446567239486098677466912246622 
u2 = 572875590470993668032596348682349224460207395691 
v = g^u1 * y^u2 % p % q = 700580719365380086754774917458461236187098909186 

v == r 

quali dati non ho incluso nell'hash/cosa ho fatto di sbagliato?

EDIT: qui è la chiave pubblica come richiesto, anche se i valori relativi sono stati pubblicati già)

-----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----- 
+0

puoi inserire qui il blocco "----- BEGIN PGP PUBLIC KEY BLOCK -----"? – shem

+0

@shem qui vai – calccrypto

risposta

4

Non hai abbastanza tempo per cercare i dettagli, ma direi che si' applicando correttamente (o non applicando) il padding. Ciò farebbe sì che il risultato giusto si presenti per alcune lunghezze di input, ma non per gli altri.

immagino Cercherò in questo di più, ma ho voluto ottenere qualcosa in sotto il filo di taglie :)

Edit: Ok, ha trovato un errore. Non sei sicuro del motivo per cui lo stai ricevendo, ma se è stato risolto, la risposta giusta viene fuori. Nel tuo esempio non-lavoro, si calcola w (s^-1 q mod) come

w = 702955297882281869313155599553522395227576660460 // s^-1 mod q 

ma ottengo

w = 702955297882281869313155599553522395227576660458 

fuori da 2! Tuttavia, valori davvero molto vicini. E si può dimostrare che la mia è a destra:

s * your_w mod q = 308227306159276200906356361486529830038073078504 
s * my_w mod q = 1 

Se si collega questo valore w, è quindi ottenere

u1 = 536931432138658080437983667536052790245747416035 
u2 = 591698847955233800072578903940910445457030802333 
v = (g^u1 * y^u2) % p % q = 666804200764671083282351405489424949903645052927 
r == v 

Speranza che aiuta.

+0

Yup. La mia scommessa è un errore off-one con lunghezze di padding. – pg1989

+0

lol come è successo? tempo di scavare attraverso il mio numero intero di precisione arbitraria – calccrypto

+1

E questo è solo per l'apprendimento, giusto? Sembra che dovrei ripetere l'avvertimento sempre vitale "* non implementare mai cripto te stesso *". –

Problemi correlati