Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

141
Vistas
Las bibliotecas secp256k1/schnorr no se comunican entre sí

Actualmente estoy generando una clave privada en el navegador y derivando su clave pública usando la biblioteca javascript noble-secp256k1 :

 const privKey = secp.utils.randomPrivateKey() const pubKey = Buffer.from(secp.schnorr.getPublicKey(privKey)).toString('hex')

Luego envío la clave pública a mi servidor, que usa la biblioteca secp256k1 para verificar una firma de carga útil que también transmito. Esto falla cuando intento instanciar la clave pública:

 pub_key = secp256k1.PublicKey(binascii.unhexlify(hex_pub_key), raw=True)

Esto funciona si construyo un par de claves usando la biblioteca de python ( python -m secp256k1 privkey -p ), pero si envío la clave generada en el cliente, el servidor genera un error:

 Exception: unknown public key size (expected 33 or 65)

La biblioteca de python genera una clave pública codificada en hexadecimal de 66 caracteres. El cliente genera una clave pública codificada en hexadecimal de 64 caracteres mediante el método secp.schnorr.getPublicKey y una clave pública codificada en hexadecimal de 130 caracteres mediante el método secp.getPublicKey . ¿Hay alguna manera de hacer que mi biblioteca de python acepte la clave pública de schnorr generada en la interfaz? ¿Hay algún lugar donde pueda leer sobre de qué se trata esta semisuperposición entre secp256k1 y schnorr?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

La clave pública de 32 bytes de la biblioteca NodeJS ( noble-secp256k1 ) debe extenderse a 33 bytes con un 0x02 inicial y luego puede importarse mediante la biblioteca de Python ( secp256k1 ):

... elegimos esa opción para P y, por lo tanto, nuestras claves públicas exclusivas de X se vuelven equivalentes a una clave pública comprimida que es la clave exclusiva de X precedida por el byte 0x02...

de la documentación de BIP0340 , sec. Diseño , Coordenadas Y Implícitas .


Prueba:

El siguiente código NodeJS usa la biblioteca NodeJS y genera un par de claves y una firma Schnorr:

 var secp = require("@noble/secp256k1"); (async () => { const privateKey = secp.utils.randomPrivateKey(); const publicKey = secp.schnorr.getPublicKey(privateKey) const msgHash = await secp.utils.sha256("hello world"); const signature = await secp.schnorr.sign(msgHash, privateKey); const isValid = await secp.schnorr.verify(signature, msgHash, publicKey); console.log("Public key (hex):", Buffer.from(publicKey).toString('hex')) console.log("Signature (hex) :", Buffer.from(signature).toString('hex')) console.log("Verified :", isValid); })();

con la siguiente salida posible:

 Public key (hex): f9a10a9bbb93e14a35d82c514f4eb052734ba55b93f6553f12366d6e887b76ee Signature (hex) : b08a0e9d02da2bbb3e2220b90e591c82ebcfc337aaac36ebe2f91eec288c79b3b9513b1018126526f99697abb78c60041f0683bbce6760b8ff76cb53a4c87137 Verified : true

El siguiente código de Python usa la biblioteca de Python y verifica la firma de Schnorr con la clave exportada por el código de NodeJS, que se extiende con un 0x02 inicial:

 import secp256k1 import hashlib publicKeyHexFromNodeJS = 'f9a10a9bbb93e14a35d82c514f4eb052734ba55b93f6553f12366d6e887b76ee' signatureHexFromNodeJS = 'b08a0e9d02da2bbb3e2220b90e591c82ebcfc337aaac36ebe2f91eec288c79b3b9513b1018126526f99697abb78c60041f0683bbce6760b8ff76cb53a4c87137' digest = hashlib.sha256() digest.update(b'hello world') msgHash = digest.digest() publicKey = secp256k1.PublicKey(bytes.fromhex('02' + publicKeyHexFromNodeJS), raw=True) signature = bytes.fromhex(signatureHexFromNodeJS) isValid = publicKey.schnorr_verify(msgHash, signature, '', raw=True) print("Verified: " + str(isValid))

Con la salida:

 Verified: True

es decir, una verificación exitosa.


Nota: Incluso si se antepone un 0x03 (en lugar de un 0x02), la verificación es exitosa. Probablemente, la biblioteca solo verifica si la clave está comprimida (0x02 o 0x03), y si es así, el byte inicial simplemente se trunca.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda