So erhalten Sie die Adresse aus dem privaten Schlüssel in Java

Ich verwende einen privaten Schlüssel in Java-Code generierenHashUtil.sha3("cow".getBytes())

Schreiben Sie in eine neue private Schlüsseldatei:

c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4

Dann verwende ich geth account import, ich habe eine Adresse ["0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826"]in Geth.

Aber wenn ich versuche, eine öffentliche Adresse in Java zu bekommen, zeigt es eine andere Adresse:

BigInteger pk = new BigInteger(senderPrivKey);
ECKey key = ECKey.fromPrivate(pk);
System.out.println("address\t: " + Hex.toHexString(key.getAddress()) );

Das Ergebnis istaddress : 8e54de809503da0a87309f8d5e98f77551ddd7f5

Ich habe erwartet, dass die Adresse angezeigt cd2a3d9f938e13cd947ec05abc7fe734df8dd826wird, habe ich einen falschen Code verwendet?

Ich habe auch ECKeyTest.java in EthereumJ gelernt, es gibt Komponententests, die zuerst den öffentlichen Schlüssel vom privaten Schlüssel und dann die Adresse vom öffentlichen Schlüssel erhalten. Aber in meinem Fall ist das Ergebnis immer noch 8e54de809503da0a87309f8d5e98f77551ddd7f5.

Ich habe vergessen zu erwähnen, dass in diesem Code , byte[] senderPrivKey = HashUtil.sha3("cow".getBytes());und Hex.encode(senderPrivKey) gleich "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4" ist.

Antworten (1)

Zusammenfassung

Der Code in der Frage sollte theoretisch nicht ausgeführt werden, da der private Schlüssel im Hex-Format vorliegt und der Aufruf zum new BigInteger(senderPrivKey)Analysieren der Hex-Zeichenfolge ohne die 16angegebene Basis zu einer ausgelösten Ausnahme führen würde.

Wenn der Code so angepasst wird, new BigInteger(senderPrivKey, 16)dass er den Basis-16-Radix angibt, wird der öffentliche Schlüssel wie erwartet generiert.



Die Details

Hier ist ein funktionierendes Beispiel. Speichern Sie es als TestKey.java, kompilieren und führen Sie es aus.

import java.math.BigInteger;

import org.ethereum.crypto.ECKey;
import org.spongycastle.util.encoders.Hex;

public class TestKey {

    public static void main(String[] args) {
        String senderPrivKey = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4";

        BigInteger pk = new BigInteger(senderPrivKey, 16);
        System.out.println("Private key: " + pk.toString(16));

        ECKey key = ECKey.fromPrivate(pk);
        System.out.println("Public key: " + Hex.toHexString(key.getAddress()));
    }
}

Und die Ausgabe beim Ausführen:

Private key: c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4
Public key: cd2a3d9f938e13cd947ec05abc7fe734df8dd826

Ich habe die folgende Maven-Abhängigkeit verwendet:

    <dependency>
        <groupId>org.ethereum</groupId>
        <artifactId>ethereumj-core</artifactId>
        <version>1.1.0-RELEASE</version>
        <!--  <type>zip</type>  -->
    </dependency>

Ich weiß nicht, wie Ihr Code gelaufen ist, denn wenn ich die folgende Zeile im obigen Quellcode so ändere, dass sie Ihrem Code entspricht, BigInteger(...)erwartet der Konstruktor, dass er eine Zahl zur Basis 10 anstelle einer Zahl zur Basis 16 analysiert:

        BigInteger pk = new BigInteger(senderPrivKey);

Und ich bekomme die folgende Ausnahme:

Exception in thread "main" java.lang.NumberFormatException: For input string: "c"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.math.BigInteger.<init>(BigInteger.java:461)
    at java.math.BigInteger.<init>(BigInteger.java:597)
    at TestKey.main(TestKey.java:14)
Danke, es funktioniert wie ein Zauber! Ich füge einen Kommentar des fraglichen Codes hinzu, dass in meinem Code byte[] senderPrivKey = HashUtil.sha3("cow".getBytes());senderPrivKey kein String ist und Hex.encode(senderPrivKey)ist"c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"
Hat die aktualisierte Version etwas geändert? Ich kann die Adresse nicht generieren!