如何使用nodejs中的Diffie-Hellman api实际加密某些内容?

时间:2015-08-18 07:44:04

标签: node.js cryptography diffie-hellman

我正在查看nodejs加密文档中的非常简单的演示: https://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name

他们很容易证明如何获得共享秘密......现在是什么?

如何使用所述共享密钥加密和解密数据?

2 个答案:

答案 0 :(得分:6)

Diffie-Hellman是一种密钥交换算法。它本身不提供加密。

双方通过D-H建立了共同秘密后,您可以将其作为AES等对称加密算法的关键。

秘密可以用作例如密码 https://nodejs.org/api/crypto.html#crypto_crypto_createcipher_algorithm_password

最后记下安全提示。

答案 1 :(得分:2)

虽然问题是如何用DH apis加密。我想解决整个问题。

虽然接受的答案很好,但问题是如果你不知道e2e如何工作,那么教程无法帮助你实现你真正想要的东西,我想这是如何进行端到端加密使用DH密钥交换作为流程的一部分。所以我把它分解成可以理解的部分。

它是这样的:

正如这个概念所说,Alice和Bob都应该同意a generatorprime number bob,以便密钥可以生成他的密钥。 完成后,他们都需要彼此共享他们的公钥。

首先,让alice生成密钥并将它们发送给bob:

JSON.stringify({ type: 'keyxchange_alice', from: from, to: to, prime: alice.sharedPrime, generator: alice.generator, key: alice.getPublicKey() })

然后bob需要生成并将他的公钥发送给alice

  const bob = new DeffMan(Buffer.from(msg.prime), Buffer.from(msg.generator))
  const bob_key = bob.getPublicKey()
  JSON.stringify({ type: 'keyxchange_bob', key: bob_key })

此外,您还需要存储这些密钥对应的用户,这可以通过存储它(在这种情况下,在javascript哈希/对象中)来完成,就像alice可以存储: { bob: bobMessage.key }

现在假设他们拥有彼此的公钥,爱丽丝可以生成共享密钥, 共享秘密,对于bob,当概括为alicePublicKey ^ bobPrivateKey时。 (阅读更多关于来自Wikipedia的DiffeHelman密钥交换和简明英文版here

然后,此共享密钥将用作密码,使用将通过tcp发送的aes-256-cbc来加密消息。

上述事情可以通过每次重新生成秘密来进行更多修改,这将涉及每个消息的一个roundrtrip 或者可以使用Double-Rachet方案。

我的原创文章位于this link as a gist