Wie kann ich eine Nachricht mit einem privaten Litecoin-Schlüssel signieren und auch eine Litecoin-Adresse aus einem String generieren?

Ich arbeite mit Bitcoins, aber gibt es ein Litecoinjs-Äquivalent? Ich möchte in der Lage sein, Nachrichten mit meinem privaten Litecoin-Schlüssel zu signieren und zu verifizieren und auch Litecoin-Adressen aus einer Zeichenfolge zu generieren. Wie würde man diese Funktionen mit einer Javascript-Bibliothek ausführen, falls eine vorhanden ist?

Das scheint ein X/Y-Problem zu sein. Was versuchst du zu erreichen?
versuchen, eine ltc-Adresse mit einer Zeichenfolge zu generieren und dann diesen privaten ltc-Schlüssel zum Signieren einer Nachricht zu verwenden.
Eine Adresse aus einer Zeichenfolge generieren? Das nennt man Brainwallet, ist aber SCHRECKLICH UNSICHER, wenn man nicht weiß, was man tut.
Es ist unsicher, wenn Sie keinen anderen Hash-Algorithmus verwenden, um ihn zu stärken, wie z. B. Scrypt, der im Warp-Wallet-Generator verwendet wird. Es ist sicherer, als zu versuchen, Ihren privaten Schlüssel oder Seed irgendwo aufzuschreiben. Sie können sich leicht an Ihre Brain Wallet erinnern, wenn Sie es richtig gemacht haben. Es ist ein dummes Missverständnis, dass ALLE Brain Wallets unsicher sind, was überhaupt nicht stimmt.
Tatsächlich könnte eine richtig generierte Brainwallet sicher sein, aber ich wollte Sie nur warnen.

Antworten (1)

bitcoinjs hat bereits Unterstützung für Litecoin, ein kurzer Blick auf /src/network.js und die README zeigt dies. https://github.com/bitcoinjs/bitcoinjs-lib/blob/d853806/test/integration/basic.js#L30

Sehen Sie, wie sie die Variable network: litecoin festlegen, die wahrscheinlich konsistent durch den Code verwendet wird (zumindest für die Adressgenerierung).

Um ehrlich zu sein, gibt es keine wirklich großen Änderungen für die Unterzeichnung, werfen Sie einen Blick auf https://github.com/bitcoinjs/bitcoinjs-message


WIF und Adressgenerierung Nehmen Sie die Warnung vor dem kryptografisch sicheren Zufallszahlengenerator nicht auf die leichte Schulter. Wenn Sie es nicht ändern, werden Sie ständig dieselbe Adresse generieren und es wird schrecklich unsicher sein.

//import bitcoinjs libs
var bitcoin = require('bitcoinjs-lib') // v2.x.x
var bitcoinMessage = require('bitcoinjs-message')

//set a litecoin variable equal to its network type, which we'll use throughout the example
var litecoin = bitcoin.networks.litecoin

//let's generate a litecoin keypair from a string
//WARNING: YOU MUST REPLACE rng() WITH A FUNCTION THAT ACTUALLY RETURNS CRYPTOGRAPHICALLY SECURE RANDOM DATA!
function rng () { return Buffer.from('MAKE SURE THIS IS NEW RANDOM DATA EACH TIME RNG() IS CALLED') }

var keyPair = bitcoin.ECPair.makeRandom({ network: litecoin, rng: rng })


var wif = keyPair.toWIF()
//You should store the output of the variable wif here, this is the actual key to the litecoin address (contains the private key) and is crucial to signing messages, do not share this and handle with care.

var address = keyPair.getAddress()

console.log("wif: " + wif + "\n")
console.log("address: " + address + "\n")

Nachrichtensignierung mit WIF aus Beispiel1

Dies nimmt Ihr WIF und signiert dann eine Nachricht.

//import bitcoinjs libs
var bitcoin = require('bitcoinjs-lib') // v2.x.x
var bitcoinMessage = require('bitcoinjs-message')

//set a litecoin variable equal to its network type, which we'll use throughout the example
var litecoin = bitcoin.networks.litecoin

// add the wif key you stored
var wif = 'WIF key goes here'

var keyPair = bitcoin.ECPair.fromWIF(wif, litecoin)
var privateKey = keyPair.d.toBuffer(32)
var message = 'This is an example of a signed message.'
var messagePrefix = litecoin.messagePrefix

var signature = bitcoinMessage.sign(message, messagePrefix, privateKey, keyPair.compressed)
console.log(signature.toString('base64'))

Ersetzen Sie die WIF durch die, die Sie im vorherigen Beispiel generiert haben.

Nachrichtenüberprüfung anhand der Adresse aus Beispiel1 und Signaturausgabe aus Beispiel2

//import bitcoinjs libs
var bitcoin = require('bitcoinjs-lib') // v2.x.x
var bitcoinMessage = require('bitcoinjs-message')

//set a litecoin variable equal to its network type, which we'll use throughout the example
var litecoin = bitcoin.networks.litecoin

var address = 'THE ADDRESS FROM EXAMPLE1'
var signature = 'THE OUTPUT OF CONSOLE LOG OF EXAMPLE2'
var message = 'This is an example of a signed message.'
var messagePrefix = litcoin.messagePrefix

console.log(bitcoinMessage.verify(message, messagePrefix, address, signature))
Gibt es einen guten Beispielcode, den ich kopieren und einfach ändern kann?
Hallo Duckx, das obige Beispiel ist fast fertig, ich werde die Adressgenerierung hinzufügen und den Hauptpost bearbeiten.
Ich habe alles hinzugefügt: Adressgenerierung, Nachrichtensignierung und Nachrichtenüberprüfung.
function rng () { return Buffer.from ('STELLEN SIE SICHER, DASS DIES ZUFÄLLIGE DATEN SIND') }; var keyPair = bitcoin.ECPair.makeRandom({ network: litecoin, rng: rng }) --- Diese 2 Zeilen funktionieren nicht, da makeRandom die network- und rng-Argumente nicht übernimmt, als ich die Funktionsdefinition nachgeschlagen habe.
Ich habe diesen Code vollständig auf dem in der Testsuite bereitgestellten Beispiel basiert. makeRandom nimmt das rng-Argument: github.com/bitcoinjs/bitcoinjs-lib/blob/… Was dann wiederum ein neues ECPair zurückgibt, das das Netzwerkargument verwendet. github.com/bitcoinjs/bitcoinjs-lib/blob/…
Es scheint, als würde die Signierfunktion jedes Mal die gleiche Signatur erzeugen, wenn man den gleichen privaten Schlüssel und die gleiche zu signierende Nachricht übergibt. Das... ist nicht normal. Mache ich etwas falsch?
@EvilJordan Ich habe es gerade in Bitcoin-Core getestet und es generiert immer wieder dieselbe Signatur für dieselbe Adresse (privater Schlüssel) und dieselbe Nachricht.
@Penquin Der Code ist korrekt. Die Implementierung, die ich zuvor verwendet habe, war nicht standardmäßig, verwendete einen RNG und erzeugte nicht deterministische, aber gültige Ergebnisse.
@EvilJordan, es bleibt jedoch eine gute Beobachtung. (zu: deterministische Signaturen)