Addresses
我如何(沒有庫)從私鑰獲取公共地址?
我想知道一種方法來了解用於從私鑰進行資金轉移的公共地址。(就像 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