2012-06-29 7 views
6

Finalmente pude verificar algunos bloques de mensajes simples firmados por PGP. Sin embargo, descubrí que, por alguna razón, mi implementación me limita a verificar datos de 9-16 bytes de longitud. no menos. no más.Longitud de los datos al hash para PGP

¿hay alguna instrucción en alguna parte (RFC4880 o en otro lugar) que especifica cómo tratar con datos de texto de cualquier longitud? tal vez hay algún tipo de relleno que me perdí? pkcs1?

Estoy bastante seguro de que he formateado los datos correctamente para hash, ya que las instrucciones en RFC 4880 sec 5.2.4 dicen para los documentos de texto, simplemente reemplace todos \n con \r\n y agregue un avance. ya que mis valores de la prueba fueron las líneas individuales de datos, nada tuvo que ser sustituido

todos estos valores están en la base 10 menos que se indique lo contrario:

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

no funciona:

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

de trabajo:

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

¿qué datos no incluí en el hash/qué hice mal?

EDIT: aquí está la clave pública conforme a lo solicitado, a pesar de que los valores pertinentes se han publicado ya)

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

se puede poner aquí el bloque "----- BEGIN PGP CLAVE PÚBLICA BLOQUE -----"? – shem

+0

@shem aquí va – calccrypto

Respuesta

4

no tengo suficiente tiempo para buscar los detalles, pero yo supongo que usted' volver a aplicar (o no aplicar) el relleno correctamente. Eso provocaría que se obtuviera el resultado correcto para algunas longitudes de entrada, pero no para otras.

Creo que voy a investigar esto más, pero quería conseguir algo de debajo del alambre de recompensas :)

Editar: Ok, que se encuentra un error. No estoy seguro de por qué lo está recibiendo, pero si se soluciona, entonces sale la respuesta correcta. En su ejemplo no-trabajo, se calcula w (s^-1 mod q) como

w = 702955297882281869313155599553522395227576660460 // s^-1 mod q 

pero consigo

w = 702955297882281869313155599553522395227576660458 

fuera por 2! Realmente, realmente muy cerca de valores. Y se puede demostrar que la mía es correcta:

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

Si conecta este valor w, a continuación, obtener

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

Espero que ayude.

+0

Sí. Mi apuesta es un error de uno por uno con las longitudes de relleno. – pg1989

+0

lol ¿cómo sucedió eso? Es hora de buscar en mi código entero de precisión arbitraria – calccrypto

+1

Y esto es solo para aprender, ¿no? Parece que debería repetir la siempre vital advertencia de "* Do not ever implementation crypto yourself *". –

Cuestiones relacionadas