使用ECDH和nodejs加密解密秘密

时间:2016-05-26 02:17:13

标签: node.js encryption cryptography

这是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的加密消息如何解密所有这些消息?

1 个答案:

答案 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');