Ich muss einen öffentlichen Schlüssel in eine Form umwandeln, die für die Verwendung mit BouncyCastle geeignet ist.
Dazu öffne ich den Debugger und schreibe:
ListAddressGroupings
Dann suche ich mir eine Adresse aus und schreibe
validateaddress 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Und ich bekomme das Ergebnis:
{
"isvalid" : true,
"address" : "1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS",
"ismine" : true,
"isscript" : false,
"pubkey" : "020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50",
"iscompressed" : true,
"account" : "testDONOTUSE"
}
Allerdings bin ich mir nicht sicher, welches Format das hat.
pubkey
?Ich stelle diese Frage, damit ich den "recId"-Wert bestimmen kann, der für die Signaturwiederherstellung benötigt wird, wenn eine UTF8-Nachricht signiert wird. Mit anderen Worten, ich muss den unten stehenden öffentlichen Schlüssel in ein Array konvertieren, das ich für diesen Zweck verwenden kann.
Beispieldaten
Base58: 1HQCZTfr7V7WAMUcVHM21TLfLoeQWEtNmS
Public: 020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50
SignMessage: Test
Output: IITRv4NdcaIgXP7DDNOkOrShBiJkBFoBqjXJXozKNClHnwSmNK3+QbT7ypKTkcc0F5UPsUCef5+gqhTb8sBZLuQ=
Weitere Versuche:
Wenn ich den öffentlichen Wert "020ba3ebc2f55152df5653bb7aba6548f0615d67b072379bdd19e72bc63c052c50" mit dieser Methode auf SO als Hex in Bytes umwandle, erhalte ich die Spalte unten links. Das ist falsch. Wenn ich jedoch den öffentlichen Schlüssel aus dem privaten Schlüssel extrahiere , erhalte ich rechts ein ähnliches, aber unterschiedliches Ergebnis.
public static byte[] publicKeyFromPrivate(BigInteger privKey, bool compressed)
{
X9ECParameters ecParams = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1");
ECPoint point1 = ecParams.G.Multiply(privKey);
return point1.GetEncoded(compressed);
}
Der öffentliche Schlüssel hat das von OpenSSL zurückgegebene Format und ist eine reine Hex-Codierung der Bytes. Wenn das erste Byte 0x04 ist, handelt es sich um einen 65-Byte-unkomprimierten Schlüssel (32-Byte-X und 32-Byte-Y). Wenn das erste Byte 0x02 oder 0x03 ist, handelt es sich um einen komprimierten 33-Byte-Schlüssel (32-Byte X und ein Bit für das Y-Zeichen).
Die recID wird als Teil der signierten Nachricht codiert. Überprüfen Sie die Methode verifyMessage() in der ECKey-Klasse, um zu sehen, wie sie extrahiert wird.
Die rechte Spalte ist korrekt und stimmt mit dem überein, was Sie von validateaddress erhalten haben.
Macher7