这是nodejs文档示例:
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);
我不明白秘密的来源。假设我要解密来自Bob的消息foo-bar
(使用Alice公钥加密)。我有Alice的私钥和公钥,以及Bob的加密消息如何解密所有这些消息?
答案 0 :(得分:2)
上述步骤构成了ECDH密钥协商协议,用于在Alice和Bob之间建立共享密钥(对称密钥),随后可以使用它们进行安全通信。
密钥 alice_secret 是使用Alice的私钥和Bob在Alice的公钥上的公钥计算的。
密钥 bob_secret 是使用Bob的私钥和Bob的末尾的Alice公钥计算的。
两个键都是平等的。现在Alice和Bob有一个共享秘密(alice_secret = bob_secret),他们可以用它来ecnrypt / decrypt消息。
请注意,此处仅交换公钥,并且Man-In-The-Middle无法获取Alice或Bob的私钥。
应使用密钥派生函数将共享密钥理想地转换为适合AES等算法的适当对称密钥。请参阅KDF
<强>伪代码强>
-Bob使用bob_secret和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解密:
var decipher = crypto.createDecipher(algo,alice_secret)
var decrypted = decipher.update(encrypted,'hex','utf8')
decrypted += decipher.final('utf8');