Wie (ohne Bibliotheken) kann ich die öffentliche Adresse aus einem privaten Schlüssel erhalten?

Ich möchte wissen, wie ich die öffentliche Adresse, die für die Überweisung von Geldern aus dem privaten Schlüssel verwendet wird, erfahren kann. (Wie myetherwallet es tut, wenn Sie Ihre Wallet-Informationen durch Eingabe Ihres privaten Schlüssels erhalten)

Welche Programmiersprache ist mir egal (auch wenn ich Javascript bevorzuge, wenn es möglich ist).

Antworten (2)

Sind Sie sicher, dass Sie dies schreiben möchten, ohne eine Bibliothek zu verwenden? Es ist praktisch unmöglich, kryptographische Sachen sicher zu machen, sogar mit einem Hintergrund in Kryptographie.

Du wurdest gewarnt. Damit Sie aber möglichst wenig Seil zum Aufhängen haben, müssen Sie lediglich ein paar in diesem Blogbeitrag beschriebene Funktionen neu implementieren . Es liegt an Ihnen, herauszufinden, wie weit Sie gehen möchten, um Bibliotheken zu eliminieren (schreiben Sie Ihre eigene bignum-Bibliothek? Schreiben Sie Ihr Programm so, dass es in Baremetal-Assembly ausgeführt wird, um die Verwendung möglicherweise kompromittierter Betriebssystembibliotheken zu vermeiden?) Sie können sich auch den zur Implementierung verwendeten Code ansehen die Funktionalität in einer Bibliothek. Alles, was Sie für Python brauchen, ist Open Source .

Es dient hauptsächlich pädagogischen Zwecken. Ich werde es nirgendwo anders als in einer Testumgebung implementieren.

Wie von @lungj gesagt wurde, ist es wirklich keine gute Idee, keine Bibliotheken zu verwenden. Weil Sie Elliptische-Kurven-Kryptografie verwenden müssen, die stark von mathematischen Eigenschaften abhängt. Außerdem benötigen Sie sha3 zum Hashen.

Wenn Sie die Bibliotheken elliptic für Elliptic-Curve-Cryptography und js-sha3 für Sha3-Hashing verwenden können, hier ein kurzes Beispiel

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();

Sollte ausgeben

Privater Schlüssel: 0x14700869030423518308970518253936238282279417230371408086143856620903190600635

Öffentlicher Schlüssel: 0x836b35a026743e823a90a0ee3b91bf615c6a757e2b60b9e1dc1826fd0dd16106f7bc1e8179f665015f43c6c81f39062fc2086ed849625c06e046978598e2

Adresse: 0x0bed7abd61247635c1973eb38474a2516ed1d884

Ihr try-catch-Block um main() fängt keine Fehler ab, denn wenn main einen Fehler hat, gibt es nur ein abweisendes Versprechen zurück. Anstelle des Try-Catch-Blocks sollten Sie dies verwenden:main().catch(err => { console.error(err); });
Du hast Recht, das try/catch sollte drin sein main().