我正在查看nodejs加密文档中的非常简单的演示: https://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name
他们很容易证明如何获得共享秘密......现在是什么?
如何使用所述共享密钥加密和解密数据?
答案 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 generator
和prime 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