Private-Key

如何使用 libsodium 從私鑰生成 Ed25519 公鑰?

  • October 15, 2019

並非所有加密貨幣都使用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()可以執行此操作。

引用自:https://bitcoin.stackexchange.com/questions/42437