Una firma creada por el cliente Bitcoin-Qt siempre se puede decodificar (base64) en una matriz de 65 bytes. Esta matriz parece (según https://github.com/bitcoin/bitcoin/blob/master/src/key.cpp#L217 ) contener un byte de encabezado, una parte R de 32 bytes y una parte S de 32 bytes. .
He extraído algunos pares (R,S) de algunas firmas ECDSA codificadas en formato DER. Descubrí que R y S no tienen necesariamente un tamaño de 32 bytes. A veces pueden tener una longitud de 33 bytes. ¿Alguien podría decirme por qué la firma creada por el cliente Qt es siempre de 65 bytes, o si está bien convertir siempre R y S en una matriz de 32 bytes? Gracias.
Se utilizan dos codificaciones diferentes.
Todo en el protocolo Bitcoin, incluidas las firmas de transacciones y las firmas de alerta , utiliza la codificación DER . Esto da como resultado firmas de 71 bytes (en promedio), ya que hay varios bytes de encabezado y los valores R y S son de longitud variable.
Para las firmas de mensajes , se usa una codificación personalizada que es más compacta (y más reciente) y admite la recuperación de claves públicas (dado un mensaje y una firma, encuentre qué clave pública lo habría creado). El código al que se refiere en la pregunta es para crear tales firmas.
Una firma codificada en DER correcta tiene la siguiente forma:
0x30
: un byte de encabezado que indica una estructura compuesta.0x02
: un byte de encabezado que indica un número entero.0x02
: un byte de encabezado que indica un número entero.Donde los 0x00
bytes iniciales para R y S no están permitidos, excepto cuando su primer byte estaría arriba 0x7F
(en cuyo caso 0x00
se requiere un solo al frente). También tenga en cuenta que dentro de las firmas de transacciones, un byte de tipo hash adicional sigue a los datos reales de la firma.
Ning
codificador morse
pieter wuille
codificador morse
Jus12
Cisco mmu
pieter wuille
Cisco mmu