¿Es posible crear un ataque de doble gasto reemplazando un Tx en el árbol merkle?

Esta pregunta en crypto.SE describe cómo se evitan los ataques de preimagen en la red Bitcoin.

Para un segundo ataque de preimagen:

hash(x) = hash(y)implicahash(hash(x)) = hash(hash(y))

Por lo tanto, no protegería contra un ataque de preimagen directo. Bitcoin construye un árbol de Merklea b c así: hash(hash(hash(a)+hash(b))+hash(hash(c)+hash(c))).

Puede ver nuevamente que si alguien encuentra un c'que tiene el mismo hash SHA-256 que c, podría sustituirlo y el resultado final seguiría siendo el mismo.

Si bien es cierto que esto podría mejorar la resistencia a los primeros ataques de preimagen, no hay casos obvios en los que eso importe: un atacante normalmente tendría el texto sin formato que generó el hash. (Y los ataques de preimagen en las direcciones parecen descabellados, dado que la operación ECDSA está ahí).

Supongamos que se generan dos transacciones fuera de línea con el mismo c'hash. Suponga que se necesitan varios meses/años para crear cada Tx. Después:

  1. El atacante crea un Tx a un comerciante
  2. El atacante crea un segundo Tx con las mismas entradas que el #1. Luego, se regenera una clave privada hasta que el hash de Tx es igual al hash de c'.

Pregunta

  1. ¿Cómo responde la red Bitcoin a estas transacciones en competencia con el mismo hash?

  2. ¿Cómo sería diferente el resultado si la transacción no fuera estándar y, por lo tanto, no se replicara entre los mineros?

Respuestas (2)

También debe saber que la tarea de encontrar una colisión SHA256 (el mismo hash para dos matrices de bytes diferentes) es bastante compleja. Los mineros gastan terahashes por segundo para encontrar un hash que sea más pequeño que un objetivo. Una coincidencia exacta sería muy difícil de encontrar.

Además, se requiere que el atacante en esta tarea sea un minero con poder suficiente para resolver y transmitir un bloque [especial] para incluirlo en la cadena principal.

En resumen, puedo decir que esta tarea requiere mucho poder de hash, por lo que si alguien tiene suficiente poder para eso, puede realizar un ataque menos complejo del 51% en lugar de este.

Incluso sin toda la discusión sobre los árboles Merkle, tener dos transacciones con el mismo hash podría crear una bifurcación que no se resolvería sin una intervención manual.

Como las transacciones también se identifican por su hash en el protocolo, los clientes obtendrían to t', donde hash(t) = hash(t'), eso significa que si bien los nodos creen que aceptaron la misma transacción, de hecho habrían acordado dos transacciones diferentes que entran en conflicto entre sí. Esto causaría estragos en el futuro cuando una transacción intente reclamar los resultados creados por t. Como estas salidas se crean en ty no en t'según cuál de las dos haya aceptado, la transacción de seguimiento sería válida o no válida, por lo que el problema se propaga de una transacción a muchas.

Una transacción que sea válida en una parte de la red y no en la otra provocará una bifurcación de la cadena de bloques, que podría persistir y posiblemente requerir una intervención manual.

Volviendo al escenario que mencionaste: el comerciante sería engañado sin su dinero. Él creería que los fondos se pueden gastar, pero cada transacción que intente con esos productos se marcaría como no válida, según su escenario, él obtiene, tmientras que la mayoría de la potencia minera obtiene t'y , por t'lo tanto, ingresará a la cadena.

Dicho esto, se cree que SHA-256 es resistente a las colisiones y la posibilidad de encontrar una colisión con un hash específico requiere una cantidad increíble de intentos. Incluso encontrar una colisión entre dos entradas cualquiera es increíblemente difícil y es objeto de muchos desafíos de investigación. Por lo tanto, es poco probable que suceda pronto.

¿Bitcoin usa SHA1 en alguna parte? Pensé que cada hash estaba basado en SHA2.
Por supuesto que tiene razón, es SHA-256 o RIPEMD160 para las direcciones. Lo corregiré en mi respuesta.