如何使用 libsodium 從私鑰生成 Ed25519 公鑰?
並非所有加密貨幣都使用secp256k1技術進行密鑰對生成和數字簽名。Curve25519技術(經常用於支持 ECDH 密鑰交換)正被其他一些加密貨幣使用。Ed25519加密(旨在支持 EdDSA 功能)和 Curve25519 加密通過轉換密切相關,趨勢是從 Ed25519 密鑰開始並將它們轉換為 Curve25519 密鑰對。
一直使用此參考作為八個ED25519_SECRET_KEYS和相應ED25519_PUBLIC_KEYS的來源,用作應用 Ed25519 包實現的測試向量。
讓floodyberry/ed25519-donna按預期執行。但是,我無法使用ed25519 -donna 使用它的*
curved25519_scalarmult_basepoint()
函式來匹配參考中的 ED25519_CURVE25519_PUBLIC_KEYS。這促使我嘗試jedisct1/libsodium。從libsodium 獲得crypto_scalarmult_base()
*函式結果以匹配來自 ed25519-donna 的函式結果:-)但是,
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
:-( jedisct1/libsodium 似乎需要始終從其本機密鑰對生成過程中生成密鑰,而不是外部提供的私鑰。使用*sodium_hex2bin()*將 ASCII 十六進制編碼的私鑰從引用填充到 64 unsigned char ed25519_skpk 變數中:
鈉 hex2bin(ed25519_skpk,32,ED25519_SECRET_KEYS[ii],64,NULL,NULL,NULL);
以下 libsodium 函式的結果符合預期:
crypto_scalarmult_base(curve25519_pk,ed25519_skpk)
當我發現 crypto_sign_ed25519_sk_to_pk() 被編碼為從 ed25519_skpk 中提取從未初始化的公鑰時,我有點沮喪。
crypto_sign_ed25519_sk_to_pk(ed25519_pk,ed25519_skpk);
當 ed25519_skpk 載入了來自外部源的工作私鑰時,沒有找到 libsodium 函式來計算 ed25519_pk 密鑰變得有點失望。任何幫助將不勝感激。
無法從私鑰直接計算 ed25519 公鑰。相反,使用確定性私鑰創建一個種子,然後使用該種子使用其對應的公鑰重新創建私鑰。以下程式碼片段假設
ed25519_skpk
已經初始化: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 );
在 libsodium > 1.0.15 上,
crypto_scalarmult_ed25519_base()
可以執行此操作。