Ich rufe den öffentlichen Schlüssel eines Benutzerkontos mit Web3 wie folgt ab:
web3.eth.sign(web3.eth.accounts[0], web3.sha3('test'), function (err, signature) {
var sigtest = signature
const util = require('ethereumjs-util');
const sig = util.fromRpcSig(sigtest);
const publicKey = util.ecrecover(util.sha3('test'), sig.v, sig.r, sig.s);
});
Ich möchte dann eine Nachricht mit diesem öffentlichen Schlüssel verschlüsseln (ohne einen privaten Schlüssel des Benutzers zu haben) - Wie man eine Nachricht mit dem öffentlichen Schlüssel einer Ethereum-Adresse verschlüsselt, gibt eine Antwort, aber in diesem Beispiel wird auch ein privater Schlüssel angegeben. Wie soll das gehen?
Sie könnten diese Bibliothek ausprobieren, sie funktioniert perfekt. https://github.com/LimelabsTech/eth-ecies
web3.eth.sign
ist veraltet _Metamask
statt sign
verwenden sendAsync
:
const signature = await new Promise((resolve, reject) => {
web3.currentProvider.sendAsync({
method: 'personal_sign',
params: [web3.utils.utf8ToHex(message), address],
from: address,
}, (err, response) => {
if(err) return reject(err);
resolve(response.result);
});
});
Verwenden Sie dann eth-crypto
So erhalten Sie die Adresse aus der signierten Nachricht:
const signer = EthCrypto.recover(
signature,
web3.eth.accounts.hashMessage(message)
);
So erhalten Sie den öffentlichen Schlüssel aus der signierten Nachricht:
const pubkey = EthCrypto.recoverPublicKey(
signature,
web3.eth.accounts.hashMessage(message)
);
Wenn Sie im Browser wiederherstellen, durchsuchen Sie einfach eth-crypto:
browserify node_modules/eth-crypto/dist/lib/browserify.index.js -o eth-crypto.js
Die Kryptografie mit öffentlichen Schlüsseln basiert auf einem asymmetrischen Algorithmus wie RSA.
Von einem privaten Schlüssel erhalten wir einen öffentlichen Schlüssel, um Paarschlüssel zu erhalten = (priv, pub)
Verschlüsselung als Funktion ist also RSA: K x M -> C
wobei K, M, C Räume öffentlicher Schlüssel, Nachrichten bzw. Chiffretexte sind
und rsa(pub,m)=c ist eine Instanz, die für keys=(priv,pub) spezifisch ist.
Wir haben eine entsprechende Entschlüsselungsfunktion
dRSA: K' x C -> M
wo Pr[drsa(priv,c) == m]==1
Die Schlüssel verschlüsseln also nicht.. "verschlüsselte" Funktionen (Algorithmen wie RSA) verschlüsseln..
ZhouW
Benutzer19510