2016-05-26 6 views
1

Dies ist das NodeJS Dokumentation Beispiel:.Decrypt Geheimnis mit ECDH und NodeJS Krypto

const crypto = require('crypto'); 
const alice = crypto.createECDH('secp256k1'); 
const bob = crypto.createECDH('secp256k1'); 

// Note: This is a shortcut way to specify one of Alice's previous private 
// keys. It would be unwise to use such a predictable private key in a real 
// application. 
alice.setPrivateKey(
    crypto.createHash('sha256').update('alice', 'utf8').digest() 
); 

// Bob uses a newly generated cryptographically strong 
// pseudorandom key pair bob.generateKeys(); 

const alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex'); 
const bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex'); 

// alice_secret and bob_secret should be the same shared secret value 
console.log(alice_secret === bob_secret); 

Ich verstehe nicht, wo das Geheimnis kommt Angenommen, ich eine Nachricht foo-bar von Bob entschlüsseln möchte (mit Alice öffentlich verschlüsselte Schlüssel). Ich habe Alices privaten und öffentlichen Schlüssel und Bobs verschlüsselte Nachricht, wie kann ich die Nachricht mit all dem entschlüsseln?

Antwort

1

Die obigen Schritte bilden das ECDH-Schlüsselvereinbarungsprotokoll, um ein gemeinsames Geheimnis (einen symmetrischen Schlüssel) zwischen Alice und Bob zu erstellen, das sie anschließend zur sicheren Kommunikation verwenden können. Der geheime Schlüssel alice_secret wird mit Alices privatem Schlüssel und Bobs öffentlichem Schlüssel am Ende von Alice berechnet.
Der Schlüssel bob_secret wird mit Bobs privatem Schlüssel und Alices öffentlichem Schlüssel an Bobs Ende berechnet.

Beide Tasten sind gleich. Jetzt haben Alice und Bob ein gemeinsames Geheimnis (alice_secret = bob_secret), mit dem sie Nachrichten entschlüsseln/entschlüsseln können.

Beachten Sie, dass hier nur öffentliche Schlüssel ausgetauscht werden und ein Mann in der Mitte weder den privaten noch den privaten Schlüssel von Alice oder Bob erhalten kann.

Das gemeinsame Geheimnis sollte idealerweise in einen geeigneten symmetrischen Schlüssel konvertiert werden, der für Algorithmen wie AES geeignet ist. Siehe KDF

Pseudo-Code

-Bob verschlüsselt mit bob_secret und AES:

var crypto = require('crypto'), 
    algo = 'aes-256-ctr', 
    var cipher = crypto.createCipher(algo,bob_secret) 
    var encrypted = cipher.update("foo-bar",'utf8','hex') 
    encrypted += cipher.final('hex'); 

-Alice dechiffriert:

var decipher = crypto.createDecipher(algo,alice_secret) 
var decrypted = decipher.update(encrypted,'hex','utf8') 
decrypted += decipher.final('utf8'); 
+0

Können Sie ein kleines Beispiel geben, wie Alice würde Bob Nachricht entschlüsseln? Danke im Voraus! –

+1

Die Antwort wurde aktualisiert. – Roshith

+2

Beachten Sie, dass dieser Code ** völlig unsicher ist **, wenn er für mehr als eine Nachricht mit demselben symmetrischen Schlüssel ('bob_secret' oder' alice_secret') verwendet wird. Der CTR-Modus ist ein Streaming-Modus, der eine Mehrfachbelegung aufweist, wenn eine IV + Tastenkombination zweimal verwendet wird (Schlüssel und IV werden deterministisch aus dem übergebenen "xxx_secret" abgeleitet). Es ist besser, für jede Verschlüsselung mit "crypto.createCipheriv" ​​zufällig eine 12-Byte-IV zu erzeugen. –

Verwandte Themen