¿Dónde se realiza el doble hashing en Bitcoin?

¿En qué parte del protocolo Bitcoin se realiza SHA256 (SHA256 (x)) y por qué?

Respuestas (7)

Bitcoin usa hash doble en casi todas partes en las que tiene hash en una de dos variantes:

  • RIPEMD160(SHA256(x)) llamado Hash160 que produce una salida de 160 bits

    • hash de la clave pública para generar parte de una dirección de Bitcoin
  • SHA256 (SHA256 (x)) llamado Hash256 que produce una salida de 256 bits

    • generando la suma de verificación en una dirección de Bitcoin
    • hash el bloque en un árbol merkle
    • vinculación de entradas y salidas de transacciones
    • hash del encabezado del bloque (y por lo tanto la prueba de trabajo y el enlace al bloque anterior)

Parece que Satoshi eligió Hash256 cuando las colisiones son un problema, y ​​Hash160 cuando solo importan las segundas imágenes previas (multiobjetivo). Esto es coherente con el objetivo de lograr 128 bits de seguridad.

Necesita un hash de 2 * n bits para lograr una resistencia a la colisión de n bits, y necesita un hash de * n bits para lograr una resistencia previa a la imagen de n bits por segundo. Si asumimos un nivel conservador de 4 mil millones de objetivos y un nivel de seguridad de 128 bits, esto conduce a hashes de 256 bits para resistencia a colisiones y hashes de 160 bits para segundas preimágenes de objetivos múltiples.

Entonces, ¿por qué hace hash dos veces? Sospecho que es para evitar ataques de extensión de longitud.

SHA-2, como todos los hashes de Merkle-Damgard, sufre de una propiedad llamada "extensión de longitud". Esto permite que un atacante que conozca H(x) calcule H(x||y) sin conocer x. Por lo general, esto no es un problema, pero hay algunos usos en los que rompe totalmente la seguridad. El ejemplo más relevante es usar H(k||m) como MAC, donde un atacante puede calcular fácilmente un MAC para m||m'. No creo que Bitcoin alguna vez use hashes de una manera que sufra extensiones de longitud, pero supongo que Satoshi optó por la opción segura de evitarlo en todas partes.

Para evitar esta propiedad, Ferguson y Schneier sugirieron usar SHA256d = SHA256(SHA256(x)) que evita los ataques de extensión de longitud. Esta construcción tiene algunas debilidades menores (no relevantes para bitcoin), por lo que no la recomendaría para nuevos protocolos, y usaría HMAC con clave constante o SHA512 truncado en su lugar.

Algunas lecturas relacionadas:

Mi conjetura es que el doble hashing en todas partes fue una pista falsa para hacernos pensar que Satoshi era descuidado, tonto y desviar nuestro enfoque de un caso de uso válido postulado para RIPEMD160(SHA256). Mi razonamiento extenso y elaborado está en mi respuesta a la pregunta relacionada.

Aquí está la función hash principal:

template<typename T1>
inline uint256 Hash(const T1 pbegin, const T1 pend)
{
    static unsigned char pblank[1];
    uint256 hash1;
    SHA256((pbegin == pend ? pblank : (unsigned char*)&pbegin[0]), (pend - pbegin) * sizeof(pbegin[0]), (unsigned char*)&hash1);
    uint256 hash2;
    SHA256((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
    return hash2;
}

Diría que en cualquier lugar que llame use SHA256 dos veces.

En cuanto a por qué, vea esto .

Realizamos SHA-256d en hash RIPEMD-160 extendido, ejecutando SHA-256 en él dos veces. Tomamos los primeros 4 bytes de nuestro hash SHA-256d como nuestra suma de verificación y los agregamos al final de nuestro hash RIPEMD-160 extendido. Después de convertir el resultado a base58, finalmente tenemos nuestra dirección de Bitcoin.

Bitcoin usa hash doble en casi todas partes>SHA256[SH256[X]]llamado Hash256 que produce una salida de 160 bits. Vinculación de salidas y entradas de transacciones. Generación de la suma de verificación en una dirección de bitcoin.

Hashing el bloque en un árbol Merkle y con dos rondas de SHA256 aumenta la seguridad, por lo que ambas funciones tendrían que romperse para deshacer el hash.

I. Para generar una dirección Bitcoin a partir de una clave pública:

  1. ejecutar la función hash SHA-256 en la clave
  2. ejecute RIPEMD-160 en la clave Esto comprime el tamaño de la dirección a 160 bits y se conoce como "doble hash" (HASH160). Esto nos da el hash de clave pública.
  3. agregue un byte de versión delante del hash RIPEMD-160 y especifique nuestra red
  4. Ejecute una codificación Base58check para obtener cheksum.
  5. Ejecute SHA-256 en RIPEMD-160 dos veces
  6. Tome los primeros 4 bytes del hash SHA-256d como suma de verificación y agréguelos al final del hash RIPEMD-160 extendido
  7. convertir el resultado a la base 58 para obtener la dirección de Bitcoin

II. Para aumentar la seguridad al hacer que SHA-256 sea resistente a manipulaciones III. Sobre entradas y salidas de mensajes

Los remitentes especifican un script de bloqueo y los destinatarios especifican un script de desbloqueo. Estos hashes apilados confirman la prueba de trabajo del UTXO que envía y la legitimidad del destinatario para recibir la transacción.

Esto no tiene sentido y no responde la pregunta.