So verschlüsseln Sie eine Nachricht mit dem öffentlichen Schlüssel einer Ethereum-Adresse

Ich schreibe etwas Code in nodejs/browser. Ich habe erfolgreich Ethereum-Adressen mit der secp256k1 -Bibliothek erstellt. Ich konnte auch Nachrichten signieren und verifizieren. Jetzt möchte ich eine Nachricht mit dem öffentlichen und privaten Schlüssel der generierten Adressen verschlüsseln/entschlüsseln. Hat das schon mal jemand gemacht? Kann ich CryptoJS verwenden, um mein Ziel zu erreichen?

Antworten (2)

thx @Edmunx Edgar, ich habe versucht, ECIES zu verwenden, aber es konnte aufgrund einer untergeordneten Abhängigkeit nicht installiert werden. Ich habe jetzt die bitcore-lib zusammen mit bitcore-ecies verwendet . Das funktioniert wie erwartet.

BEARBEITEN: Ich habe ein npm-Modul erstellt, das genau diese Dinge tut und auch einige Leistungsoptimierungen und Tutorials enthält : github:eth-crypto .

Hier ist mein Code für alle mit der gleichen Frage:

// run 'npm install eth-crypto --save'

const EthCrypto = require('eth-crypto');

// create identitiy with key-pairs and address
const alice = EthCrypto.createIdentity();

const secretMessage = 'My name is Satoshi Buterin';
const encrypted = await EthCrypto.encryptWithPublicKey(
    alice.publicKey, // encrypt with alice's publicKey
    secretMessage
);

const decrypted = await EthCrypto.decryptWithPrivateKey(
    alice.privateKey,
    encrypted
);

if(decrypted === secretMessage) console.log('success');

Ausführen über CodeSandbox

Ich habe die Anforderungen für Bitcoin-Schlüsselpaare und Ethereum-Schlüsselpaare gelesen. Ihre Größen sind unterschiedlich, genauer gesagt ist ein öffentlicher Schlüssel für das Bitcoin-Protokoll 65 Bytes (oder 33 Bytes komprimiert), während der öffentliche Schlüssel auf Ethereum 64 Bytes beträgt. Der obige Code funktioniert nicht für ein Ethereum-Schlüsselpaar. Sie können jedoch den Ethereum privKey verwenden, um einen neuen pubKey aus der obigen Bibliothek wie folgt zu generieren. var pubKey = new bitcore.PublicKey.fromPrivateKey(privKey);Sie können jetzt Nachrichten verschlüsseln und entschlüsseln. Irgendwelche Vorschläge, wie ich diese Bibliothek verwenden kann, ohne eine Problemumgehung zu haben? Vielen Dank!
@Malone nein sorry, mir ist derzeit keine Lösung ohne Workaround bekannt. Zu erwähnen ist auch, dass Bitcore-ecies anscheinend Leistungsprobleme hat.
@pubkey Nachdem ich mich etwas eingehender damit befasst habe, habe ich mich dafür entschieden, die obige Verschlüsselungsmethode beizubehalten. Ich verwende den folgenden [ github.com/flyswatter/eth-sig-util](code) , um beim sicheren Abrufen des Ethereum pubKey zu helfen (ziemlich nützlich, um Schlüsselinformationen durch Signieren von Txs zu erhalten). Ich baue einen Prototyp und diese Verschlüsselung wird nicht sehr oft vorkommen, also mache ich mir keine allzu großen Sorgen, wenn ich bitcore-eciesjetzt Leistungsprobleme habe. Danke noch einmal.
Hallo @Malone, kannst du mir bei der verwendeten Verschlüsselungsmethode helfen? In dem oben geteilten Code hat er das private und öffentliche Schlüsselformular bitcore-lib generiert, das Sie richtig erwähnt haben und das nicht mit der Ethereum-Adresse funktioniert. Wäre es also möglich, das Code-Snippet mit mir zu teilen, so wie Sie es erreicht haben die Verschlüsselung. Ich generiere den Schlüssel mit dem Blog kobl.one/blog/create-full-ethereum-keypair-and-address . und wenn ich das über diesen Blog generierte Schlüsselpaar verwende, erhalte ich einen Fehler. Bitte posten Sie eine Antwort darauf, wenn möglich
Ich liebe den Namen, den du ausgesucht hast! Haha
Gibt es eine Möglichkeit, die Entschlüsselung mit einem Web3-Anbieter durchzuführen? Ich habe keinen direkten Zugriff auf den privaten Schlüssel, kann aber Nachrichten mit einem Web3-Anbieter wie Metamask signieren.
Dies funktioniert nicht für normale öffentliche Ethereum-Adressen, zum Beispiel: 0x9a53113da6c670ab04bc80efab364615e54cf1eb. Alle öffentlichen Schlüssel in den Beispielen sind viel länger, z. Kann jemand erklären, wie man das mit den normalen kurzen eth-Adressen macht?
@PASH die eth-Adresse ist ein Hash des öffentlichen Schlüssels. Aufgrund der Funktionsweise von Hashing gehen Informationen verloren. Es ist also niemals möglich, die Adresse zur Verschlüsselung zu verwenden. Sie müssen den öffentlichen Schlüssel abrufen, der zu der Adresse gehört. Sie können das eth-crypto-Modul verwenden, um sicherzustellen, dass der Schlüssel wirklich zu dieser Adresse gehört, indem Sie die Hash-Funktion erneut ausführen.
@pubkey Es ist möglich, den öffentlichen Schlüssel einer Adresse zu erhalten, solange sie eine Transaktion gesendet hat, siehe zum Beispiel ethereum.stackexchange.com/a/13892/56242. Es ist jetzt auch möglich, eine Nachricht mithilfe von Metamask mit eth_decrypt( docs .metamask.io/guide/rpc-api.html#other-rpc-methods )

Angenommen, Sie haben den öffentlichen Schlüssel der Person, an die Sie eine Nachricht senden möchten (wenn sie bereits eine Transaktion signiert hat, können Sie sie aus der Signatur wiederherstellen), sollte es möglich sein, mit ECIES zu verschlüsseln und zu entschlüsseln. Anscheinend gibt es dafür eine JavaScript-Bibliothek, ich nehme an, Sie können sie in einem Browser verwenden: https://bitcointalk.org/index.php?topic=627927.0

Ich habe keine Ahnung, ob diese Bibliotheken gut genug sind, um sie sicher zu verwenden.

Ein anderer Ansatz besteht darin, ein separates Schlüsselpaar zu generieren, das eigentlich für die Verschlüsselung ausgelegt ist, und dann den Ethereum-Schlüssel zu verwenden, um den öffentlichen Schlüssel zu signieren und an die andere Partei zu senden.