Addresses

我如何(沒有庫)從私鑰獲取公共地址?

  • September 27, 2017

我想知道一種方法來了解用於從私鑰進行資金轉移的公共地址。(就像 myetherwallet 通過輸入私鑰獲取錢包資訊時所做的那樣)

我不在乎哪種程式語言(即使我更喜歡 javascript,如果可能的話)。

您確定要在不使用庫的情況下編寫此內容嗎?即使有密碼學背景,也幾乎不可能安全地進行密碼學工作。

你被警告了。但是為了給你盡可能少的上吊繩索,你所要做的就是重新實現這篇博文中描述的幾個函式。由您決定要消除庫在多遠(編寫自己的 bignum 庫?編寫程序以在裸機程序集中執行以避免使用可能受損的 OS 庫?)您還可以查看用於實現的程式碼庫中的功能。Python 所需的一切都是開源的。

正如@lungj 所說,不使用庫真的不是一個好主意。因為您需要使用橢圓曲線密碼學,這在很大程度上依賴於數學屬性。此外,您將需要 sha3 進行散列。

如果您可以將庫elliptic用於橢圓曲線加密,將 js-sha3用於 sha3 散列,這裡有一個簡短的範例

const assert = require('assert');
const EC = require('elliptic').ec;
const keccak256 = require('js-sha3').keccak256;

async function main() {
 try {
   const ec = new EC('secp256k1');

   const key = ec.keyFromPrivate('208065a247edbe5df4d86fbdc0171303f23a76961be9f6013850dd2bdc759bbb', 'hex');

   const privateKey = key.getPrivate();
   const publicKey = key.getPublic().encode('hex').slice(2);
   assert.equal(publicKey, '836b35a026743e823a90a0ee3b91bf615c6a757e2b60b9e1dc1826fd0dd16106f7bc1e8179f665015f43c6c81f39062fc2086ed849625c06e04697698b21855e');

   const address = keccak256(Buffer.from(publicKey, 'hex')).slice(64 - 40);
   assert.equal(address, '0bed7abd61247635c1973eb38474a2516ed1d884');

   console.log(`Private Key: 0x${privateKey}`);
   console.log(`Public Key: 0x${publicKey}`);
   console.log(`Address: 0x${address.toString()}`);
 } catch (err) {
   console.log(err);
 }
}

main();

應該輸出

私鑰:0x14700869030423518308970518253936238282279417230371408086143856620903190600635

公鑰:0x836b35a026743e823a90a0ee3b91bf615c6a757e2b60b9e1dc1826fd0dd16106f7bc1e8179f665015f43c6c81f39062fc2086ed849625c06e04697698b218

地址:0x0bed7abd61247635c1973eb38474a2516ed1d884

引用自:https://ethereum.stackexchange.com/questions/27028