Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

140
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!