Wie generiert man den öffentlichen Ed25519-Schlüssel aus dem privaten Schlüssel mit libsodium?

Nicht alle Kryptowährungen verwenden die secp256k1 -Technologie für die Generierung von Schlüsselpaaren und digitale Signaturen. Die Curve25519 -Technologie (häufig zur Unterstützung des Austauschs von ECDH-Schlüsseln verwendet) wird von einigen anderen Kryptowährungen verwendet. Ed25519- Kryptografie (zur Unterstützung der EdDSA-Funktionalität) und Curve25519-Kryptografie sind durch Transformationen eng miteinander verwandt, und der Trend geht dahin, mit Ed25519-Schlüsseln zu beginnen und sie in Curve25519-Schlüsselpaare umzuwandeln.

Ich habe diese Referenz als Quelle für acht ED25519_SECRET_KEYS und entsprechende ED25519_PUBLIC_KEYS verwendet, um sie als Testvektoren für die Anwendung von Ed25519-Paketimplementierungen zu verwenden.

Floodyberry /ed25519-donna funktioniert wie erwartet. Allerdings konnte ich die ED25519_CURVE25519_PUBLIC_KEYS nicht aus der Referenz berechnen, indem ich ed25519-donna mit seiner curved25519_scalarmult_basepoint()passenden Funktion verwendete. Dies hat mich dazu gebracht, jedisct1/libsodium auszuprobieren . Erhaltene crypto_scalarmult_base()Funktionsergebnisse von libsodium, um denen von ed25519-donna zu entsprechen:-)

Allerdings it is unclear how jedisct1/libsodium can be applied to generate public Ed25519 keys only from secret Ed25519 keys that are natively in an ASCII hexadecimal format:-( Es scheint, dass jedisct1/libsodium erfordert, dass Schlüssel immer aus dem nativen Schlüsselpaar-Generierungsprozess generiert werden, im Gegensatz zu einem extern bereitgestellten privaten Schlüssel.

Verwendete dieNatrium_hex2bin() um einen ASCII-Hex-codierten privaten Schlüssel aus der Referenz in die 64 unsigned char ed25519_skpk-Variable zu stopfen:

Natrium_hex2bin (ed25519_skpk, 32, ED25519_SECRET_KEYS[ii], 64, NULL, NULL, NULL);

Die Ergebnisse der folgenden libsodium-Funktion waren wie erwartet:

crypto_scalarmult_base( curve25519_pk, ed25519_skpk )

War ein bisschen frustriert, als ich entdeckte, dass crypto_sign_ed25519_sk_to_pk() so codiert war, dass der öffentliche Schlüssel aus ed25519_skpk extrahiert wurde, der nie initialisiert wurde.

crypto_sign_ed25519_sk_to_pk ( ed25519_pk, ed25519_skpk );

Ich bin etwas enttäuscht, dass ich keine libsodium-Funktion gefunden habe, um den ed25519_pk-Schlüssel zu berechnen, wenn ed25519_skpk mit einem funktionierenden privaten Schlüssel aus einer externen Quelle geladen wird. Jede Unterstützung wird sehr geschätzt.

Kleines Manko: Die Ed25519-Kurve wird verwendet, um EdDSA zu implementieren, nicht ECDSA.
Fantastisches Auge fürs Detail! Spiegelt die EdDSA-Änderung wider.
FYI - es gibt zahlreiche Geschmacksrichtungen von ed25519. tools.ietf.org/html/rfc8032#section-5 Dokumente ed25519 , ed25519ph und ed25519ctx . Monero und I2P verwenden red25519 . Siehe geti2p.net/spec/proposals/146-red25519 für eine I2P-Perspektive.

Antworten (2)

Es ist nicht möglich, den öffentlichen Schlüssel ed25519 direkt aus dem privaten Schlüssel zu berechnen. Verwenden Sie stattdessen den deterministischen privaten Schlüssel, um einen Seed zu erstellen, und verwenden Sie dann den Seed, um den privaten Schlüssel mit dem entsprechenden öffentlichen Schlüssel neu zu erstellen. Das folgende Code-Snippet geht davon aus, dass ed25519_skpkes bereits initialisiert ist:

char           hex_ed_pk[65];                                      
unsigned char  seed[crypto_sign_SEEDBYTES];                       
unsigned char  ed25519_skpk[crypto_sign_ed25519_SECRETKEYBYTES];        
unsigned char  ed25519_pk[crypto_sign_ed25519_PUBLICKEYBYTES];

// COMPUTE ED25519 PUBLIC KEY, REQUIRES ESTABLISHING A SEED
(void)crypto_sign_ed25519_sk_to_seed( seed,ed25519_skpk);                
(void)crypto_sign_seed_keypair( ed25519_pk, ed25519_skpk, seed );      
(void)sodium_bin2hex( hex_ed_pk, 65, ed25519_pk, 32 );

Auf libsodium > 1.0.15 crypto_scalarmult_ed25519_base()ist dies möglich.